homecourse
 
   

Git cheatsheet

Published January 6, 2023Last updated December 1, 20245 min read

Git is one of the version control systems, and it's a prerequisite for development jobs. This post covers most of the git commands I use.

Configuration

  • Set user configuration for every project if you use multiple accounts
    git config user.name "<USERNAME>"
    git config user.email "<EMAIL_ADDRESS>"
  • Use the current branch for push commands
    git config --global push.default current

SSH keys setup

  • Generate separate SSH keys for Github and Bitbucket with the following command, type the filename path and passphrase.

    ssh-keygen
  • Add generated public keys to Github and Bitbucket

  • Run the following commands to activate SSH keys

    eval `ssh-agent -s`
    ssh-add ~/.ssh/id_rsa_github
    ssh-add ~/.ssh/id_rsa_bitbucket

Basic commands

  • The repository setup
    • Initialize a git repository
      git init
    • Clone an existing repository
      # git clone <REPOSITORY_URL>
      git clone git@github.com:zsevic/pwa-starter.git
    • Add the remote repository
      # git remote add <REMOTE_NAME> <REPOSITORY_URL>
      git remote add origin git@github.com:zsevic/pwa-starter.git
      git remote add upstream git@github.com:zsevic/pwa-starter.git
    • Update the URL for the remote repository
      # git remote set-url <REMOTE_NAME> <REPOSITORY_URL>
      git remote set-url origin git@github.com:zsevic/pwa-starter.git
    • Get a list of configured remote connections
      git remote -v
  • Branches
    • Get a list of the branches
      git branch
    • Create and switch to the new branch
      git checkout -b new-branch
    • Checkout to a specific commit and create a new branch out of it
      git log # find a hash from a specific commit
      git checkout <COMMIT_HASH>
      git switch -c <NEW_BRANCH_NAME>
    • Switch to another branch
      git checkout existing-branch
    • Rename the current branch
      git branch -m <NEW_BRANCH_NAME>
    • Delete branch
      git branch -D other-existing-branch
    • Fetch all the remote branches
      git fetch --all
    • Get a list of remote branches without cloning the repo or verify if the user has "read" access
      git ls-remote <REPOSITORY_URL>
  • Get the status of the local changes
    git status
  • Add new changes
    git add some-file.js
    git add .
  • Commits
    • Commit the changes
      git commit -m "Commit message"
    • Empty commit without any files
      git commit --allow-empty -m "Trigger CI pipeline"
    • Commit the changes and skip running git hooks
      git commit -m "Commit message" --no-verify
    • Update the latest commit message and add new changes to the latest commit
      git commit -m "Commit message" --amend
  • Push the changes to the remote repository
    • Push the changes to the current branch when the current branch is configured as the default one
      git push
    • Push the changes to the remote branch
      # git push <REMOTE_NAME> <BRANCH_NAME>
      git push origin master
    • Force push the changes to the feature branch
      # git push <REMOTE_NAME> <FEATURE_BRANCH_NAME>
      git push origin feature-branch -f
  • Fetch and merge remote changes to the local branch
    # git pull <REMOTE_NAME> <BRANCH_NAME>
    git pull origin master
  • Remove (unstage) the changes from the local stage
    git reset some-file.js
    git reset
  • Differences between commits
    • Get a difference compared to the latest commit
      git diff some-file.js
      git diff
    • Get a difference between the last two commits
      git diff HEAD^ HEAD
      # or
      git diff HEAD HEAD~1
  • Revert the file changes
    git checkout -- some-file.js
  • Merge the specified branch into the current one
    git merge <BRANCH_NAME>
  • Revert specific commit. The following command creates a new commit
    git revert <COMMIT_HASH>

Miscellaneous

  • Resets

    • Soft reset (commits are removed, but changes from the removed commits are staged)
      # git reset --soft HEAD~{NUMBER_OF_COMMITS_TO_SOFT_REMOVE}
      git reset --soft HEAD~2
    • Hard reset (both commits and changes are removed)
      # git reset --hard HEAD~{NUMBER_OF_COMMITS_TO_HARD_REMOVE}
      git reset --hard HEAD~1 # equal as git reset --hard HEAD^
    • Get the latest remote changes when pulling doesn't work
      git reset --hard origin/<BRANCH_NAME>
  • Stashing

    git add .
    git stash save <STASH_NAME>
    git stash list
    git stash apply --index 0
  • Tags

    • Remove the following tag locally
      git tag -d v0.13.29
  • Find removed commits

    git reflog
    git checkout <COMMIT_HASH>
  • Remove the initial commit

    git update-ref -d HEAD
  • Patching

    • Create a patch from the latest commits
      # git format-patch -{NUMBER_OF_COMMITS}
      git format-patch -1
    • Apply the patches
      git apply 0001-latest-commit.patch
  • Git submodules

    • Add git submodule
      # git submodule add -- <REPOSITORY_URL> <DIRECTORY_PATH>
      git submodule add -- git@github.com:zsevic/pwa-starter.git template
    • Retrieve the latest changes for the git submodule
      # git submodule update --remote <DIRECTORY_PATH>
      git submodule update --remote template
    • Resolve conflict in the submodule
      # git reset HEAD <DIRECTORY_PATH>
      git reset HEAD template
      git commit