↓ Skip to main content
  1. Posts/

100+ Git Commands

1426 words·7 mins·

1. Initial Git Configuration
#

git config --global user.name "Your Name" - set global username

git config --global user.email "[email protected]" - set global email

git config --list - show all configuration values

git help <command> - view manual of a command

2. Creation and Cloning
#

git init - initialize a new git repository

git clone <url> - clone a remote repository to your local machine

git clone --depth 1 <url> - clone only the latest commit (faster, without the full history)

3. Status and Inspection
#

git status - show the status of the working tree

git log - show the complete commit history

git log --oneline - show the history in a compact format

git log --graph --decorate --all - show the history with a branch graph

git show <commit> - show the details of a commit

git diff - show unstaged differences

git diff --staged - show already staged differences

4. Add and Commit
#

git add <file> - adds a file to the staging area

git add . - adds all changes to the staging area

git add -p - interactive block-by-block add

git commit -m "Message" - creates a commit with a message

git commit --amend - modifies the last commit (avoid it if you have already pushed it)

git restore --staged <file> - removes a file from the staging area (modern equivalent of git reset <file>)

git restore <file> - discards a file’s unstaged changes (careful: they are lost)

git reset --soft HEAD~1 - undoes the last commit while keeping the changes

git reset --hard HEAD~1 - undoes the last commit and discards the changes

5. Branching
#

git branch - lists local branches

git branch <name> - creates a new branch

git branch -d <name> - deletes an already merged branch

git branch -D <name> - force deletes a branch

git branch -m <new_name> - renames the current branch

6. Checkout and Switch
#

git checkout <branch> - switch to a branch (classic command)

git checkout -b <new_branch> - create and switch to a new branch

git switch <branch> - switch to a branch (modern command)

git switch -c <new_branch> - create and switch to a new branch (modern)

7. Merge and Rebase
#

git merge <branch> - merges a branch into the current branch

git merge --no-ff <branch> - merge with explicit commit

git rebase <branch> - linearly realigns commits

git rebase -i <base> - interactive rebase

git rebase --abort - aborts an ongoing rebase

git rebase --continue - continues a rebase after resolving conflicts

8. Remote
#

git remote -v - shows configured remote repositories

git remote add origin <url> - adds a remote repository

git remote remove origin - removes a remote

git remote rename origin upstream - renames a remote

9. Push and Pull
#

git push - sends commits to the default remote

git push -u origin <branch> - sets upstream and sends the branch

git push --force-with-lease - safer force push

git pull - downloads and integrates changes (fetch + merge)

git pull --rebase - downloads and integrates changes with rebase

10. Stash
#

git stash - temporarily saves uncommitted changes

git stash push -m "msg" - saves a stash with a message

git stash list - lists available stashes

git stash apply [stash@{n}] - applies a stash without removing it

git stash pop [stash@{n}] - applies and removes a stash

git stash drop [stash@{n}] - drops a specific stash

git stash clear - clears all stashes

11. Tags
#

git tag - lists tags

git tag <name> - creates a lightweight tag

git tag -a <name> -m "msg" - creates an annotated tag

git push --tags - sends all tags to the remote

git tag -d <name> - deletes a local tag

git push origin :refs/tags/<name> - deletes a remote tag

12. Cleanup and Maintenance
#

git clean -n - preview of untracked files to be removed

git clean -fd - removes untracked files and directories

git prune - removes orphaned objects

git gc - runs garbage collection on the repository

13. Advanced Commands
#

git reflog - shows the history of HEAD movements

git cherry-pick <commit> - applies a specific commit to another branch

git bisect start - starts binary search for a bug

git bisect good - marks a commit as good

git bisect bad - marks a commit as problematic

git blame <file> - shows author and commit for each line

git rev-parse HEAD - shows the hash of the current commit

git shortlog - summarizes contributions by author

git archive -o out.zip HEAD - exports a snapshot of the repository

14. Troubleshooting and Recovery
#

git reflog - recovers recent hashes even after a reset or rebase

git reset --hard <hash> - reverts to a known state of the repository

git merge --abort - aborts an ongoing merge

git rebase --abort - aborts an ongoing rebase

git pull --rebase --autostash - realigns divergent branches keeping local changes

15. Workflow and Best Practices
#

  • Conventional Commits (feat:, fix:, docs:…) - use consistent, readable commit messages
  • Branch names (feature/<name>, fix/<ticket>, hotfix/<ticket>, release/<version>) - adopt a shared convention
  • Branch protection on main - require pull requests, reviews and green CI before merging
  • Small, frequent commits - one commit = one logical change, easier to review and to revert

16. Advanced Commands for DevOps and CI/CD
#

git clone --depth 1 <url> - fast clone for pipelines

git fetch --depth=1 origin <branch> - shallow fetch of the branch

git fetch --prune --tags - updates tags and cleans obsolete remote references

git checkout --force <hash> - deterministic checkout for reproducible builds

git diff --name-only origin/main...HEAD - lists changed files for conditional jobs

last_tag=$(git describe --tags --abbrev=0) - gets the last tag

count_since=$(git rev-list --count ${last_tag}..HEAD) - counts commits since the tag

echo "${last_tag}+build.${count_since}" - generates a build version

git describe --tags --always --dirty - generates human-friendly version metadata

git submodule add <url> path - adds a submodule

git submodule update --init --recursive - initializes and updates submodules

git submodule sync --recursive - syncs submodule URLs

git sparse-checkout init --cone - enables sparse checkout

git sparse-checkout set path/only-needed - downloads only necessary paths

git worktree add ../build-wt <branch> - creates a separate working tree

git worktree remove ../build-wt - removes the separate working tree

git config --global commit.gpgsign true - enables automatic commit signing

git tag -s v1.2.3 -m "signed release" - creates a signed tag

GIT_TRACE=1 GIT_CURL_VERBOSE=1 git fetch - enables network trace and debug

git clean -fdx - full cleanup of untracked files (careful)

git merge --ff-only - prevents unexpected merge commits

git fetch origin "+refs/heads/release/*:refs/remotes/origin/release/*" - selective fetch with refspec

git checkout <tag|hash> - retrieves state from a tag or specific commit

git bisect run ./test.sh - automates bisect with a test script

git lfs install - initializes Git LFS

git lfs track "*.bin" - tracks large files with LFS

git add .gitattributes - adds LFS rules

git clone --mirror <url> - creates bare mirror of the repository

git remote add --mirror=push backup <url-backup> - configures push mirror to backup

git remote prune origin - removes remote references that no longer exist

git rev-parse HEAD > .git/ci-build-hash - saves commit hash for cache keys

git fetch origin main && git merge-base --is-ancestor origin/main HEAD || exit 1 - verifies updated branch in CI

git log --pretty=format:"* %h %s (%an)" <from>..<to> - generates changelog between two refs

git log --oneline -- <path/> - filters commits by folder

git verify-commit <hash> - validates signature of a commit

git verify-tag <tag> - validates signature of a tag

17. Git Hooks for Local Automation
#

Hooks are scripts that Git runs automatically at certain moments. They live in .git/hooks/ and must be executable (chmod +x).

pre-commit - runs fast lint or tests before the commit

commit-msg - validates the commit message format

pre-push - runs tests or a quick build before the push

Example commit-msg hook that only accepts Conventional Commits messages:

#!/usr/bin/env bash
# .git/hooks/commit-msg
msg_file="$1"                   # Git passes the path of the file holding the message
msg=$(head -n1 "$msg_file")     # first line of the message

if ! echo "$msg" | grep -Eq '^(feat|fix|docs|style|refactor|perf|test|chore)(\(.+\))?!?: .+'; then
  echo "Invalid message. Example: feat(login): add password recovery"
  exit 1                        # a non-zero exit code blocks the commit
fi

Security Notes
#

  • Prefer git push --force-with-lease to git push --force on shared branches
  • Before git clean -fdx, run git clean -ndx to see what will be deleted
  • Protect your main branches and require green CI before merging

Useful References
#

Ashif C.
Author
Ashif C.
I’m an Edge Developer and tech enthusiast learning to build modern applications on distributed infrastructure, with a focus on performance, serverless, and developer experience. In my spare time, I enjoy experimenting with ESP32.

Related