Imagine you’re writing a novel. You want to save every version, experiment with different endings, and maybe collaborate with other writers. But instead of having dozens of files named “novel_final_v2_really_final_final.doc,” you have a smart system that tracks everything for you.
Git and GitHub are exactly that system for code. Git tracks changes to your files, and GitHub stores those files online so you can share and collaborate with others.
In 2026, Git and GitHub are essential tools for developers, writers, designers, and anyone who works on digital projects. This beginner-friendly guide will teach you everything you need to know to get started.
What are Git and GitHub?
The Simple Analogy
It helps to think of Git and GitHub through everyday concepts:
- Git is like a Time Machine: It tracks every single change you make, lets you revert to any previous version, and works entirely locally on your computer.
- GitHub is like a Cloud Storage Service: It stores your Git history online, allows you to share it with others, enables seamless collaboration, and acts effectively as a “Dropbox for code”.
Git vs GitHub
| Feature | Git (The Tool) | GitHub (The Website) |
|---|---|---|
| Location | Installed on your computer | A website you visit |
| Function | Tracks changes locally | Stores code online |
| Connectivity | Works completely offline | Requires an internet connection |
| Cost | Free and open-source | Free tiers with paid professional plans |
| Interface | Primarily a command-line tool | A visual web-based interface |
Think of it this way: Git is like a camera taking continuous photos of your work, while GitHub is the online photo album where you store and share those photos.
Why Use Git and GitHub?
Benefits for Beginners
- ✅ Version Control Never lose your work again. You can go back to any previous version and easily see exactly what changed, when it changed, and who changed it.
- ✅ Reliable Backup Your code is stored securely online. You can access it from anywhere, eliminating the dreaded “my file got deleted” panic.
- ✅ Seamless Collaboration Work with others simultaneously. You can see who changed what and merge overlapping changes without destroying each other’s work.
- ✅ Professional Portfolio Showcase your work to potential employers, build your public coding portfolio, and contribute to open-source projects.
Getting Started
Step 1: Install Git
On Windows:
- Go to
git-scm.com - Download the Windows installer
- Run the installer using default settings
- Open the Git Bash terminal
- Check the installation by running:
git --version
On Mac:
# Option 1: Install with Homebrew
brew install git
# Option 2: Use Xcode Command Line Tools
xcode-select --install
# Check if it's installed:
git --version
On Linux (Ubuntu/Debian):
sudo apt update
sudo apt install git -y
# Check if it's installed:
git --version
Step 2: Set Up Your Identity
Tell Git who you are. These details will be attached to every commit you make.
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
# Verify your settings
git config --list
Step 3: Create a GitHub Account
- Go to
github.com - Click “Sign up”
- Enter your email and create a password
- Choose a unique username
- Verify your email address
- Choose the Free plan (it’s perfect for beginners)
Your username will form your profile URL: https://github.com/your-username
Basic Git Concepts
The Three States of Git
Understanding how files move through Git is the key to mastering it:
- Working Directory (Your Files): The files you’re currently editing. They are changed but not yet saved to Git.
→ run
git addto move to the Staging Area - Staging Area (Ready to Save): Files you’ve marked and prepared for your next save. They are ready for a snapshot.
→ run
git committo move to the Local Repository - Local Repository (Saved): The permanent database where Git stores your saved versions locally. You can revert to these versions anytime.
→ run
git pushto move to the Remote Repository - Remote Repository (GitHub): Your code is now stored online and can be shared with others.
The Basic Git Workflow
The daily routine of a developer looks exactly like this:
- Edit files (make your coding changes)
- Run
git status(review what changed) - Run
git add .(stage your changes) - Run
git commit -m "message"(save your changes permanently) - Run
git push(upload everything to GitHub)
Essential Git Commands
1. git init - Start a Repository
Think of this as turning a normal folder into a Git-tracked project folder.
mkdir my-first-project
cd my-first-project
# Initialize Git
git init
2. git status - Check What’s Happening
This is your most-used command. It tells you what branch you’re on, what files changed, what’s staged, and what’s untracked.
git status
3. git add - Stage Changes
Tell Git which modified files you want to include in the next save.
# Add a specific file
git add index.html
# Add all files in the current directory
git add .
4. git commit - Save Changes
Take a permanent snapshot of your staged changes. Always write clear, descriptive messages!
git commit -m "Add responsive navigation bar styling"
[!TIP] Good Commit Messages: “Add login page”, “Fix broken navigation”, “Update CSS styles”. Bad Commit Messages: “Updates”, “Fix stuff”, “Changes”, “asdf”.
5. git log - View History
See all your past commits in chronological order.
# View full history
git log
# View compact history
git log --oneline
6. git diff - See Changes
Compare what has changed in your files before you stage them.
# See unstaged changes
git diff
# Compare two commits
git diff commit_hash_1 commit_hash_2
7. git branch - Manage Branches
Branches let you work on different features safely without affecting the main codebase.
# Create and switch to a new branch
git checkout -b new-feature
# Switch back to main
git checkout main
8. git merge - Combine Changes
Bring completed work from a feature branch into your main branch.
# Switch to the branch you want to merge INTO
git checkout main
# Merge the feature branch
git merge new-feature
9. git remote - Connect to GitHub
Link your local project folder to an empty GitHub repository.
git remote add origin https://github.com/username/repo-name.git
10. git push - Upload to GitHub
Send your saved local commits to the remote GitHub server.
# First push (sets the upstream link)
git push -u origin main
# Subsequent pushes
git push
11. git pull - Download from GitHub
Fetch and merge the latest changes from GitHub to your local machine.
git pull origin main
12. git clone - Copy a Repository
Download an existing repository from GitHub to your computer.
git clone https://github.com/username/repo-name.git
Working with GitHub
Creating a Repository on GitHub
- Log into GitHub.
- Click the ”+” icon in the top right corner.
- Select “New repository”.
- Choose a repository name (e.g.,
my-first-project). - Add an optional description.
- Choose between Public (anyone can see) or Private.
- Do NOT initialize with a README if you are pushing an existing local project. DO initialize with a README if you are starting completely fresh.
- Click “Create repository” and follow the provided setup commands.
GitHub Authentication (Tokens)
GitHub no longer accepts account passwords for terminal authentication. You must use a Personal Access Token:
- Go to GitHub Settings → Developer settings.
- Select Personal access tokens → Tokens (classic).
- Click Generate new token.
- Select the
reposcope. - Generate the token and copy it immediately (you won’t be able to see it again).
- Paste this token as your password when your terminal prompts you to log in during a
git push.
Advanced Git Commands
Once you master the basics, these powerful commands will take your workflow to the next level.
git stash — Save Work Without Committing
Imagine you are working on a new feature and your team suddenly reports a critical bug that you must fix immediately. You are not ready to commit your half-finished feature, but you also cannot lose your work. git stash saves all your uncommitted changes to a temporary “shelf” so you can switch tasks instantly.
# Save current changes to the stash
git stash
# List all stashed entries
git stash list
# Restore the most recent stash back to your working directory
git stash pop
# Apply a specific stash by its index
git stash apply stash@{2}
# Delete a specific stash
git stash drop stash@{0}
git rebase — Rewrite History Cleanly
git rebase is an alternative to git merge. Instead of creating a merge commit, it replays your branch’s commits on top of the target branch, resulting in a perfectly linear, clean history.
# Rebase your feature branch onto the latest main
git checkout feature-branch
git rebase main
# Interactive rebase: squash multiple messy commits into one clean commit
git rebase -i HEAD~3
[!WARNING] Never rebase commits that have already been pushed to a shared public branch. Rebasing rewrites history, and this will cause conflicts for anyone who already pulled those commits.
git cherry-pick — Steal a Specific Commit
cherry-pick lets you copy one specific commit from any branch into your current branch without merging the entire branch.
# Copy a single commit by its hash to the current branch
git cherry-pick a1b2c3d4
# Cherry-pick without auto-committing (to review/edit first)
git cherry-pick -n a1b2c3d4
This is useful when a critical bug-fix commit was made on a development branch and you need to bring it into production immediately.
Understanding the .git Directory
Every Git repository has a hidden .git folder at the root. This folder IS the repository — it contains the entire history, configuration, and object database. Understanding its structure demystifies how Git works internally.
ls -la .git/
Key contents:
HEAD— A text file pointing to the currently checked-out branch (e.g.,ref: refs/heads/main).config— Repository-level configuration (remotes, branch tracking, etc.).objects/— The content-addressable object database. Every file version, commit, and tree is stored here as a SHA-1 hashed blob. Git is fundamentally a content store with version tracking on top.refs/heads/— Pointers (SHA-1 hashes) for each local branch.refs/remotes/— Pointers for each remote-tracked branch.COMMIT_EDITMSG— The message from the last commit (used for re-editing).
Mastering .gitignore
A .gitignore file tells Git which files and folders to completely ignore. This is critical for keeping secrets, build artifacts, and IDE configuration files out of your repository.
Create a .gitignore file in the root of your project:
touch .gitignore
Common Patterns
# Ignore ALL .log files anywhere in the project
*.log
# Ignore the node_modules folder (npm dependencies)
node_modules/
# Ignore Python bytecode cache
__pycache__/
*.pyc
# Ignore environment files containing API keys and secrets
.env
.env.local
.env*.local
# Ignore OS-generated files
.DS_Store # macOS
Thumbs.db # Windows
# Ignore build output directories
dist/
build/
out/
# Ignore IDE configuration folders
.idea/ # JetBrains IDEs
.vscode/ # VS Code (optional — some teams commit this)
The most important rule: Never commit .env files containing API keys, database passwords, or secret tokens. If you accidentally commit a secret, assume it is compromised immediately and rotate it.
GitHub Actions: Automated CI/CD
GitHub Actions is a powerful built-in automation system that runs workflows triggered by events (like a git push). It is how modern teams automatically test and deploy code.
A Simple CI Workflow (Testing a Python Project)
Create a file at .github/workflows/ci.yml:
name: Python Tests
# Trigger this workflow on every push to main and on every Pull Request
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
# Run on the latest Ubuntu runner
runs-on: ubuntu-latest
steps:
# Step 1: Check out the repository code
- uses: actions/checkout@v4
# Step 2: Set up the Python version
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: '3.12'
# Step 3: Install project dependencies
- name: Install dependencies
run: |
pip install -r requirements.txt
# Step 4: Run the test suite
- name: Run pytest
run: pytest
Every time you push a commit or open a Pull Request, GitHub automatically spins up a clean Ubuntu container, installs your dependencies, and runs your tests. If a test fails, the pull request is automatically blocked from being merged.
Frequently Asked Questions About Git
What is the difference between git fetch and git pull?
git fetch downloads all new commits and branches from the remote without modifying your current working files. It updates your remote-tracking branches (e.g., origin/main) so you can inspect what changed. git pull is essentially git fetch followed immediately by git merge — it downloads and instantly integrates the changes into your current branch.
How do I undo the last commit without losing my work?
# Undo the last commit, but keep all the changes staged
git reset --soft HEAD~1
# Undo the last commit and unstage changes (keeps files)
git reset HEAD~1
# ⚠️ Permanently delete the last commit AND all changes (DESTRUCTIVE)
git reset --hard HEAD~1
How do I rename a branch?
# Rename the current branch
git branch -m new-name
# Rename a specific branch
git branch -m old-name new-name
# After renaming, update the remote
git push origin -u new-name
git push origin --delete old-name
What is a fork vs a branch?
A branch is a parallel timeline within the same repository — you have write access to it. A fork is a complete copy of someone else’s repository under your own GitHub account. Forking is used in open-source development: you fork a project, make changes in your fork, and then submit a Pull Request to the original repository asking the maintainer to merge your changes.
How do I see who wrote a specific line of code?
# Show who last modified each line of a file (blame)
git blame filename.py
# With line numbers and short commit hashes
git blame -n filename.py
Conclusion
Git and GitHub are essential tools for modern development. They protect your work, enable collaboration, and showcase your skills to the world. The learning curve feels steep at first, but the core daily workflow — add, commit, push — becomes muscle memory within days.
Your Action Plan:
- Install Git and create a GitHub account.
- Initialize your first local repository.
- Practice the basic workflow:
add,commit,push. - Try branching and merging with a feature branch.
- Set up a
.gitignoreto protect secrets. - Explore GitHub Actions for basic automation.
Ready to level up your development skills? Explore our guide on Python vs Rust to see how version control supports large-scale programming projects.



Discussion
Loading comments...