Skip to content

· Tools  · 3 min read

Git Commands Every Developer Should Know

A practical walkthrough of the Git commands you'll actually reach for day to day — from everyday status checks to branching, stashing, and undoing mistakes.

Git Commands Every Developer Should Know — illustration

Git has a huge surface area, but most of the day-to-day work happens with a small, repeatable set of commands. Here’s a practical tour of the ones worth actually knowing well — grouped by what you’re trying to get done, not by how Git’s docs happen to organize them.


The Daily Loop

These are the commands you’ll type dozens of times a day.

git status
git add <file>
git commit -m "message"
git push
git pull
  • git status — always start here. It tells you what’s staged, what’s changed, and what’s untracked.
  • git add <file> — stage specific files. Prefer this over git add . so you know exactly what’s going into the commit.
  • git commit -m "message" — commit staged changes with a clear, descriptive message.
  • git push / git pull — sync your local branch with the remote.

Branching

git branch
git checkout -b feature/my-change
git switch main
git branch -d feature/my-change
  • git branch — list local branches.
  • git checkout -b <name> (or git switch -c <name>) — create and switch to a new branch in one step.
  • git switch <name> — move between existing branches without touching your working files.
  • git branch -d <name> — delete a branch once it’s merged (use -D to force-delete an unmerged one, carefully).

Inspecting History

git log --oneline --graph
git diff
git diff --staged
git blame <file>
  • git log --oneline --graph — a compact, readable view of commit history and branch structure.
  • git diff — see unstaged changes.
  • git diff --staged — see exactly what’s about to be committed.
  • git blame <file> — find out which commit last touched a given line.

Undoing Things

This is the category that saves the most time once you know it.

git restore <file>
git restore --staged <file>
git reset --soft HEAD~1
git revert <commit>
  • git restore <file> — discard unstaged changes to a file.
  • git restore --staged <file> — unstage a file without losing the changes.
  • git reset --soft HEAD~1 — undo the last commit but keep the changes staged, ready to re-commit.
  • git revert <commit> — the safe way to undo a commit that’s already been pushed; it adds a new commit instead of rewriting history.

Avoid git reset --hard and git push --force unless you’re certain — both can discard work that’s hard to recover.


Stashing

Handy when you need to switch context without committing half-finished work.

git stash
git stash list
git stash pop
  • git stash — shelve your uncommitted changes and return to a clean working tree.
  • git stash list — see everything you’ve stashed.
  • git stash pop — reapply the most recent stash and remove it from the stash list.

Keeping a Clean History

git rebase main
git commit --amend
git cherry-pick <commit>
  • git rebase main — replay your branch’s commits on top of the latest main, keeping history linear.
  • git commit --amend — fix the most recent commit’s message or contents before pushing.
  • git cherry-pick <commit> — apply a specific commit from another branch onto your current one.

A Few Habits Worth Building

  • Run git status before and after almost everything — it costs nothing and prevents surprises.
  • Write commit messages that explain why, not just what — the diff already shows what changed.
  • Prefer git revert over git reset on anything already pushed or shared with others.
  • Keep branches short-lived; the longer a branch diverges from main, the more painful the eventual merge.

None of this requires memorizing Git’s entire command set. A handful of these, used consistently, covers the vast majority of real work.

Back to Articles

Related Posts

View All Posts »
Using the Chrome DevTools Network Tab Effectively

Using the Chrome DevTools Network Tab Effectively

How to get real answers out of the Network tab — filtering 404s, filtering by domain, excluding noise, finding slow and heavy requests, copying requests as cURL, and other everyday debugging tricks.

Getting Started with Playwright

Getting Started with Playwright

A student's intro to Playwright, the browser automation library — what it's good for, how to set it up in Python, and example code for scraping, form filling, screenshots and testing.

Intro to Pydantic and PydanticAI

Intro to Pydantic and PydanticAI

A student's guide to Pydantic for data validation in Python, and PydanticAI for building LLM agents that return typed, validated output — with install steps, code and real use cases.