Git Command Reference

This page is a non-exhaustive and growing reference to help me remember git commands. Note: Do not include the < > brackets around the actual branch names, etc., they are used in the examples below to indicate a place holder.

Amend

# combine any staged changes with the contents of the previous commit
git commit --amend

# same as above and change the commit message
git commit --amend -am "my new commit message"

Branch

# list local branches
git branch

# list remote and local branches
git branch -a

# list remote branches
git branch -r

# rename current branch
git branch -m <newname>

# rename a local branch
git branch -m <oldname> <newname>

# push a new local branch to remote and track
git push -u origin <branchname>

Clone

Cloning is the first step when getting a repository from the server.

# download the repository into the current directory
git clone <url>

# download the repository into the current directory with a sub directory name you supply
git clone <url> <directory>

Checkout

# create and checkout in one step
git checkout -b <branchname>

# copy file from another branch
git checkout <branchname> -- <filename>

# checkout a tag to a new branch
git fetch origin
git checkout tags/<tagname> -b <branchname>

# restore file deleted locally that still exist on remote
git checkout -- <filename>

Cherry Pick

# merge a specific commit into the current branch
git cherry-pick <commithash>

Delete

# delete local branch
git branch -d <branchname>

# delete remote branch
git push origin :<branchname>

# Git 1.7+
git push origin --delete <branchname>

Diff

# diff between two local branches
git diff branch_a..branch_b

# write the diff to a file
git diff branch_a..branch_b > C:\diff.txt

# common ancestor diff
git diff branch_a...branch_b

Notes

  • Press Q to exit diff
  • You can also add a file or folder name after the commands

Fetch

# checkout a remote branch that does not exist on local
git fetch origin
git checkout --track origin/<remote branch name>

# checkout a remote branch to a new local branch
git fetch origin <remote branch name>:<local branch name>

Log

# shows the commit logs.
git log

# not in origin
git log origin..HEAD

# one line
git log --pretty=oneline

# last commit only with truncated hash
git rev-parse --short HEAD

Notes

  • git log outputs with the less program, making it scrollable. Type q to exit. Type h for help.
  • origin..HEAD specifies all the commits reachable from the current commit (i.e. HEAD), but not from origin.

Pull

# get rid of 'your branch is ahead of origin <branchname> by X commits
git pull origin <branchname>

git pull origin

Rebase

# reapply commits on top of another base tip
git rebase

# squash four commits into one
git rebase -i HEAD~4

Notes

  • Squash info: Git Book Chapter 6.4: Git Tools - Rewriting History. The editor will list the 4 commits starting with the oldest. Replace the word “pick” with “squash” next to each commit you want to squash into the commit before it.
  • Editor: press i to enter inline insert mode. Use the delete key to erase from left to right, press esc to exit insert mode, then type :x (now the cursor is at the bottom) and hit enter to save and exit.
  • You can edit your last commit message before pushing with git commit --amend

If you’ve already pushed commits to GitHub, and then squash them locally, you will have to force the push to your branch.

git push origin <branchname> --force

Reset

# reset to previous state
git reset --hard

# reset to previous commit
git reset --hard <commit hash>

# reset to origin
git reset --hard origin/<branchname> 

Notes

  • git reflog to show what has been done with git session

Stash

# stash changes in a dirty working directory
git-stash

# remove and apply stash
git-stash pop

# list stashes
git stash list

# apply stash
git-stash apply

# remove a stash
git stash drop <stashid>

Tag

# add a lightweight tag to by specifying the
# commit checksum (or part of it) at the end of the command
git tag sometagname ed40a9deaa0
git push origin sometagname

# delete a tag
git tag -d sometagname
git push origin :refs/tags/sometagname

Config

In Git version 2.16+, git command output is sent to the editor. To change this, set pager.branch false. more info

# set paged output for git branch to off
git config --global pager.branch false

Working with Forks

You attempt to fetch upstream and get fatal: 'upstream' does not appear to be a git repository. e.g.,

git fetch upstream
fatal: 'upstream' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

You will need to configure a remote that points to the upstream repository. e.g.,

git remote add upstream https://github.com/wodby/docker4wordpress.git

# verify
git remote -v

Syncing a fork

Fetch the branches from the upstream repository.

git fetch upstream

Merge upstream branches using git merge upstream/<branchname>. e.g., merge master branch into your local fork master:

git checkout master

git merge upstream/master

Tips & Tricks

Discard changes / commits

# discard local changes for all unstaged file
git checkout -- .

# discard local commits
git reset --hard origin/<branchname>

Merge Repositories

Merge repo_a into repo_b

cd path/to/repo_b

git remote add repo_a path/to/repo_a

git fetch repo_a

git merge repo_a/master

git remote remove repo_a

Merge a branch from another repository into a branch in a different local repository. For two repositories, foo and bar located in the current directory, this example merges master from bar into a new branch in foo.

cd foo

# add the bar repo to foo
git remote add bar ../bar

# fetch --all from remote
git remote update

# create a new branch in foo
git checkout -b barmaster

# merge master from bar into the new branch
git merge bar/master

since git 2.9 you can use the option --allow-unrelated-histories with git merge

Change Remote Origin

When the remote origin repository has been renamed, the URL needs to be reset.

List existing remotes to get the address format, ssh or https of the remote to change.

Example

git remote -v
origin  git@bitbucket.org:gilfoyle/gilfoylehacks.git (fetch)
origin  git@bitbucket.org:gilfoyle/gilfoylehacks.git (push)

Use git remote set-url to change the origin url. e.g.,

git remote set-url origin git@bitbucket.org:gilfoyle/gilfoylehacks2.git

Clone into an existing folder?

This can’t be done, however, workaround by cloning to a new directory, then moving the .git directory into the existing directory.

git clone https://gitlab.com/myrepo.git temp

# move .git from temp to myrepo directory
mv temp/.git myrepo/.git

# delete temp directory
rm -rf temp

Remove Commits after Specified Commit

If for some reason you need to remove recent commits, you can force a push to reset the origin to a particular commit hash. This will remove any commits that were pushed after it that commit hash.

git push origin +<commithash>:<branchname>

# for example
git push origin +ed40a9deaa0:master

The + is interpreted as forced push.

Another way to do the same thing is with git reset. For example,

# reset to previous commit in current branch
git reset --hard <commit hash>

# force push
git push origin -f

SSH Keys

How to create ssh keys for multiple git accounts on various hosts Generate a ssh key pair for each account using the respective e-mail address associated with it.

ssh-keygen -t rsa -b 4096 -C "username@example.com"

When you’re prompted to “Enter a file in which to save the key,” Edit the filename so the key pair can be mapped to the account. e.g., id_rsa_gitlab

Enter a file in which to save the key (/Users/you/.ssh/id_rsa_gitlab): [Press enter]
ssh-agent
# start the ssh-agent
eval $(ssh-agent -s)

# add the key
ssh-add ~/.ssh/id_rsa_gitlab

More info: Generating a new SSH key and adding it to the ssh-agent

Create a Config file

touch ~/.ssh/config

Edit the config file to map the ssh key to its host. For example,

.ssh/config
Host gitlab.com
  HostName gitlab.com
  User richard.hendricks
  IdentityFile ~/.ssh/id_rsa_gitlab

Host github.com
  HostName github.com
  User richard.hendricks
  IdentityFile ~/.ssh/id_rsa_github

Additional Resources

comments powered by Disqus