Post

A Practical Note for Git Commands

A practical note for commonly used Git commands, categorised by their purposes.

A Practical Note for Git Commands

Disclaimer

This note is intended to be a quick reference for common Git commands and is not an exhaustive list of all Git commands or options. Always refer to the official Git documentation or git help [command/concept] for the most comprehensive and up-to-date information on Git commands and their usage.

Commands for Starting a Working Area

Clone a repository

  • if cloning into a new directory with the same name as the repository:
    1
    
    user@host % git clone <repo_url>
    
  • when inside an existing local directory dir and it is empty:
    1
    
    user@host dir % git clone <repo_url> .
    
  • when the local directory dir is not empty:
    1
    2
    3
    4
    5
    6
    
    user@host dir % git init
    user@host dir % git add .
    user@host dir % git commit -m "Initial commit"
    user@host dir % git remote add origin <repo_url>
    user@host dir % git pull --rebase origin <remote_branch_name> # pull the remote branch and rebase the local branch on top of it
    user@host dir % git push -u origin <remote_branch_name> # push the local branch to the remote repository and set the upstream tracking branch
    

    or

    1
    2
    3
    4
    5
    
    user@host dir % git fetch origin # fetches all branches and tags from the remote repository
    
    user@host dir % git switch <remote_branch_name> # create a new local branch that tracks the remote branch
    OR
    user@host dir % git rebase origin/<remote_branch_name> # rebase the local branch on top of the remote branch
    
  • clone a specific branch or tag:
    1
    
    user@host % git clone -b <branch/tag_name> <repo_url>
    
  • clone and download history only for a specific branch/tag:
    1
    
    user@host % git clone --branch <branch/tag_name> --single-branch <repo_url>
    
  • clone and download history (complete commit graph, history references, and tree metadata) without actual file contents(blobs) (bloatless partial clone) for a specific branch/tag:
    1
    
    user@host % git clone --filter=blob:none --branch <branch/tag_name> <repo_url>
    
  • clone with a specific depth (shallow clone):
    1
    
    user@host % git clone --depth 1 <repo_url> # clones only the latest commit
    

Commands for Working with Current Changes

Add file contents to the index

  • Stage all changes for commit:
    1
    
    user@host % git add .
    
  • Stage specific files for commit:
    1
    
    user@host % git add <file_path1> <file_path2> ...
    

Record changes in the working tree but go back to the clean state

  • Stash the changes in a dirty working directory away
    1
    
    user@host % git stash
    
  • Stash the changes with a message:
    1
    
    user@host % git stash push "Stash message"
    
  • Unstash the changes and apply them to the working directory:
    1
    
    user@host % git stash pop
    
  • Unstash the changes and apply them to the working directory without removing them from the stash list:
    1
    
    user@host % git stash apply
    

Undoing changes in the working tree

  • Discard changes in the working directory:
    1
    
    user@host % git restore <file_path>
    
  • Unstage changes from the index:
    1
    
    user@host % git restore --staged <file_path>
    

Revert changes

  • Revert changes introduced by a specific commit and create a new commit with the revert:
    1
    
    user@host % git revert <commit_hash>
    
  • Revert changes introduced by a specific commit without creating a new commit:
    1
    
    user@host % git revert --no-commit <commit_hash>
    

Reset the current branch to a specific state

  • Reset the current branch to a specific commit and keep changes in the working directory:
    1
    
    user@host % git reset --soft <commit_hash>
    
  • Reset the current branch to a specific commit and keep changes in the index:
    1
    
    user@host % git reset --mixed <commit_hash>
    
  • Reset the current branch to a specific commit and discard all changes in the working directory:
    1
    
    user@host % git reset --hard <commit_hash>
    

Commands for Examining the History and State

View commit history

  • View the commit history in a compact/full code change format:
    1
    
    user@host % git log --oneline/-p
    
  • View the commit history with a graph:
    1
    
    user@host % git log --graph --oneline --all
    
  • View the commit history for a specific file:
    1
    
    user@host % git log -- <file_path>
    
  • View the commit history in a file list format:
    1
    
    user@host % git log --status/--name-only/--name-status
    
  • View the commit history with a specific author:
    1
    
    user@host % git log --author="<author_name>"
    
  • View the commit history with a specific message:
    1
    
    user@host % git log --grep="<search_term>"
    
  • View the commit history with a specific date range:
    1
    
    user@host % git log --since="2026-01-01" --until="2026-12-31"
    
  • View the commit history with a specific branch/tag:
    1
    
    user@host % git log <branch_name/tag_name>
    
  • View the commit history with a specific number of commits:
    1
    
    user@host % git log -n <number_of_commits>
    
  • View the commit history with a specific format:
    1
    
    user@host % git log --pretty=format:"%h - %an, %ar : %s"
    

View the current status of the repository

  • View the current status of the repository:
    1
    
    user@host % git status
    
  • View the current branch:
    1
    
    user@host % git branch
    
  • View the current branch and its tracking remote branch:
    1
    
    user@host % git branch -vv
    
  • View the current commit hash:
    1
    
    user@host % git rev-parse HEAD
    
  • View the current commit with a specific format:
    1
    
    user@host % git log -1 --pretty=format:"%h - %an, %ar : %s"
    

View the differences between commits or branches

  • View the differences between the current branch and the master branch:
    1
    
    user@host % git diff master
    
  • View the differences between two branches:
    1
    
    user@host % git diff <branch1> <branch2>
    
  • View the differences between two commits:
    1
    
    user@host % git diff <commit1> <commit2>
    
  • View the differences for a specific file:
    1
    
    user@host % git diff <commit1> <commit2> -- <file_path>
    
  • View the differences with a specific format:
    1
    
    user@host % git diff --stat/--name-only/--color/--word-diff/--compact-summary
    

Examine a specific state of the repository without being on a branch [DO NOT SAVE WORK HERE]

  • Check out a specific commit and create a detached HEAD state:
    1
    
    user@host % git switch --detach <commit_hash>
    

Commands for Growing, Marking and Tweaking Common History

Create a new branch

  • Create a new branch and switch to it:
    1
    
    user@host % git switch -c <new_branch_name>
    
  • Create a new branch from a specific commit or branch/tag:
    1
    
    user@host % git switch -c <new_branch_name> <commit_hash/branch_name/tag_name>
    
  • Create an orphan branch (a branch with no history):
    1
    
    user@host % git switch --orphan <new_branch_name>
    

Record changes to the repository

  • Stage and commit all changes with a message:
    1
    
    user@host % git commit -A "Commit message"
    
  • Commit staged changes with a message:
    1
    
    user@host % git commit -m "Commit message"
    
  • Commit staged changes with a message and sign the commit:
    1
    
    user@host % git commit -S -m "Commit message"
    
  • Amend the previous commit with new changes and a new message:
    1
    
    user@host % git commit --amend -m "New commit message"
    

Join development history together

  • Merge a branch/commit into the current branch:
    1
    
    user@host % git merge <branch_name/commit_hash>
    
  • Merge remotely tracked branch into the current branch:
    1
    
    user@host % git merge <remote_repo>/<branch_name>
    
  • Apply a specific commit to the current branch:
    1
    
    user@host % git cherry-pick <commit_hash>
    
  • Rebase the branched-off commits of the current branch onto a new base tip:
    1
    
    user@host % git rebase <branch_name/tag_name/commit_hash>
    

Commands for Collaborating

Download objects and refs from remote or upstream repositories

  • Unshallow clone and fetch all history:
    1
    
    user@host % git fetch --unshallow
    
  • Unshallow clone and fetch a specific branch:
    1
    
    user@host % git fetch --unshallow origin <branch_name>
    
  • Fetch all branches and tags from the remote repository:
    1
    
    user@host % git fetch --all
    
  • Fetch a specific branch/tag from the remote repository:
    1
    
    user@host % git fetch origin <branch_name/tag_name>
    

Push commits to a remote repository

  • Push the current branch to the remote repository and set the upstream tracking branch:
    1
    
    user@host % git push -u origin <current_branch_name>
    
  • Push a specific branch/tag to its remote tracking repository:
    1
    
    user@host % git push origin <branch_name/tag_name>
    

Pull changes from a remote repository

  • Pull changes from the remote repository and merge them into the current branch:
    1
    
    user@host % git pull origin <current_branch_name>
    
  • Pull changes from the remote repository and rebase them onto the current branch:
    1
    
    user@host % git pull --rebase origin <current_branch_name>
    

Commands for Global Configuration

  • Set the global username and email for commits:
    1
    2
    
    user@host % git config --global user.name "Your Name"
    user@host % git config --global user.email "Your Email"
    
  • Set the global ignore file for untracked files:
    1
    
    user@host % git config --global core.excludesfile <path_to_ignore_file>
    
  • Set the global alias for a git command:
    1
    
    user@host % git config --global alias.<alias_name> <git_command>
    
  • Check the global configuration:
    1
    
    user@host % git config --global --list
    
This post is licensed under CC BY 4.0 by the author.