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.
# 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"
# 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>
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>
# 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>
# merge a specific commit into the current branch git cherry-pick <commithash>
# set email for repo cd path/to/repo git config user.email "firstname.lastname@example.org" # set username for repo cd path/to/repo git config user.name "gilfoyle" # confirm git config user.email git config user.name
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
# delete local branch git branch -d <branchname> # delete remote branch git push origin :<branchname> # Git 1.7+ git push origin --delete <branchname>
# 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
- Press Q to exit diff
- You can also add a file or folder name after the commands
# 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>
# 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
- git log outputs with the less program, making it scrollable. Type q to exit. Type h for help.
origin..HEADspecifies all the commits reachable from the current commit (i.e. HEAD), but not from origin.
# get rid of 'your branch is ahead of origin <branchname> by X commits git pull origin <branchname> git pull origin
# reapply commits on top of another base tip git rebase # squash four commits into one git rebase -i HEAD~4
- 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 to previous state git reset --hard # reset to previous commit git reset --hard <commit hash> # reset to origin git reset --hard origin/<branchname>
git reflogto show what has been done with git session
# 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>
# 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
Working with Forks
Forks are a concept created by GitHub. On a standard git server, the equivalent would be like cloning a repo to a git server and then cloning it from that server to your local computer. Then add the original repo as the upstream from the local computer.
Scenario, 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
Creating a Fork From GitHub to GitLab or Bitbucket
If you just want to track changes, first make an empty repository in GitLab, Bitbucket or whatever else you may be using and clone it to your computer.
Then add the GitHub project as the upstream remote. e.g.,
git remote add upstream https://github.com/user/repo
This will allow you to fetch and pull from the upstream repo. e.g.,
git pull upstream master
When there are any changes, you can fetch and pull them from the respective branch. Given your permissions on the upstream repo, you may also be allowed to push or merge.
To get the upstream branch you pulled onto your GitLab, Bitbucket, etc. server, push to origin. e.g.,
git push origin master
GitLab also has repository mirroring to allow the mirroring of repositories to and from external sources. It can be used to mirror branches, tags, and commits between repositories.
Tips & Tricks
Discard changes / commits
# discard local changes for all unstaged file git checkout -- . # discard local commits git reset --hard origin/<branchname>
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.
git remote -v origin email@example.com:gilfoyle/gilfoylehacks.git (fetch) origin firstname.lastname@example.org:gilfoyle/gilfoylehacks.git (push)
git remote set-url to change the origin url. e.g.,
git remote set-url origin email@example.com: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
+ 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
How to create ssh keys for multiple git accounts on a the same host. Generate a ssh key pair for each account using the respective e-mail address associated with it.
ssh-keygen -t rsa -b 4096 -C "firstname.lastname@example.org"
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.,
Enter a file in which to save the key (/Users/you/.ssh/id_rsa_gitlab): [Press enter]
# 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
config file to map the ssh key to its unique
Host value. For example,
github.com for the personal account and
github.com-work for the work account. e.g.,
# github personal Host github.com HostName github.com User richard.hendricks IdentityFile ~/.ssh/id_rsa_github # github work account Host github.com-work HostName github.com User email@example.com IdentityFile ~/.ssh/id_rsa_github_piedpiper Host gitlab.com HostName gitlab.com User richard.hendricks IdentityFile ~/.ssh/id_rsa_gitlab
Clone repos using the unique host value. e.g.,
git clone firstname.lastname@example.org:githubaccount/somerepo.git
This will set the repo’s
.git/config remote origin as needed. e.g.,
[remote "origin"] url = email@example.com:githubaccount/somerepo.git