Git Cheatsheet

Below is a cheatsheet for Git so we don't become like the guys in this comic:

Image courtesy of xkcd

Commands

Similar Commands To SVN

These commands just need to be prepended with git, instead of svn:

  • commit
  • add
  • diff
  • log
  • status

Differences

  • mv instead of move
  • rm instead of delete
  • init instead of svnadmin create

Check if Out of Date

git remote update
git status

If you are out of date, then run the following:

git pull

# Alternatively
git fetch  
git merge 

Restore A Deleted File

If you have various outstanding changes, and want to restore/revert a file that you had deleted at some point and have not committed yet, run the command below to get it back in its last committed form:

git checkout [filename]  

Revert a File

If you want to revert any changes you have made to a file and have not committed yet, you can revert them with the same command we used to restore a deleted file:

git checkout [filename]  

Git Data Transport Command Diagram

View History

git log  

By default this will not wrap messages in your terminal. If you want to do this, use

git log | less  

Also, if you want a visual representation of your branches/history the following command is extremely useful:

git log --oneline \
--abbrev-commit \
--all \
--graph \
--decorate \
--color

It's an extremely good idea to use an alias for the command above, such as gg.

Quickly Initialize Code In Git

If you have a bunch of code that is not currently under git/version control, then using these commands inside the directory will set up git AND add all the current files to it:

git init
git add .
git commit

Branching

List branches

The command below will list local branches:

git branch  

... and this one will include remote branches:

git branch -a 

Create A Local Branch

git branch [a new branch name]

This does not automatically switch you to that branch.

This will create a branch from whatever branch you are currently in rather than always from master.

Switch Branch

git checkout [branch name]  

Delete a Local branch

git branch -d the_local_branch  

Delete a Remote branch

git push [remote identifier] --delete [branch name]  

For example:

git push origin --delete my-branch  

Push a Local Branch Upstream and Set to Track

git push -u origin [local branch name]  

Create A Local Branch That Mirrors Remote

If you have a branch in your central repository, such as Github, then chances are that you want to use the following code to create a local branch of the same name that will track the remote one.

git checkout -t origin/[branch name]  

Checkout a Remote Branch

The command below will allow you to checkout a remote branch and give it a different name, but I recommend you just use the previous command for creating a local branch that mirrors remote instead.

git checkout -b \
$LOCAL_BRANCH_NAME origin/$REMOTE_BRANCH_NAME

Tagging

Unlike SVN, git has a concept of tagging built-in. This means that when creating a release of a php package, you don't branch off into the /tags directory, but simply run:

git tag -a [tag name]  

If you want to see the tags/releases, run:

git tag  

If you want to switch to a tag, execute:

git checkout [tag name]  

Tags do not get pushed to the remote repository automatically with commits. You need to manually run:

git push --tags  

If you want to delete a local tag then use

git tag --delete [tag name]  

Deleting a tag does not result in it being pushed. To delete a remote tag, you need to specify it specifically:

git push --delete [remote name] [tag name]  

If you want to create a tag, but want to give a specific description other than the log on the revision you are tagging, you can use the following:

git tag -a [tag name] -m "[tag description/log]"  

Managing Remotes

Display Remotes

git remote -v  

Delete a Remote

git remote rm [remote name]  

Add a Remote (SSH)

git remote add --mirror=push [remote name] [user]@[hostname or IP]:[path to repo]  
git remote add --mirror=fetch [remote name] [user]@[hostname or IP]:[path to repo]  

e.g.

git remote add --mirror=push origin git@git.mydomain.org:/home/git/my-repo  
git remote add --mirror=fetch origin git@git.mydomain.org:/home/git/my-repo  

Note: You can specify just push or fetch if you only intend to perform one of those.

Configuration

Use Meld for diffs

Read about how to do it here.

Set Username

To globally set your default 'username' for commits across all projects run the following code:

git config --global user.name [username]  

Note: This will be overriden by the 'local' scale if it exists. To set your username at a local scale, you can run the following command from inside your repo:

git config --local user.name [username]  

Alternatively, you could edit the .git/config file directly.

Enable Colour Coding!

To enable the use of colour for things like diffs:

git config --global color.ui auto  

It is possible to configure colour coding on only certain aspects, or even change the colours themselves, but that is beyond the scope of this tutorial.

Set Default Editor

git config --global core.editor $EDITOR_NAME_HERE  

Aliases

Git allows you to set aliases. e.g.

git config --global alias.cp cherry-pick  

This would allow you to run git cp instead of git cherry-pick. However this would likely cause confusion with the linux copy command which is also cp.

Repo Types

There are two types of repositories:

  • Bare - Nobody directly uses the repo, but is used for a centralized area for multiple developers to push and pull from. (Like your SVN repo).
  • Shared - This is a "normal" repo that you have set up yourself, and users within the same group can 'pull' (update your code from) or 'push' (apply changes) to it. Likewise you can pull from/push to other peoples shared repos.

These types are indicated with --bare and --shared respectively on the git init command. When not specified, git init will create a shared repository. Click here if you need more info.

Renaming Files

Although git can detect renames, using the mv command on a file, it's probably best just to think of this as deleting a file and creating a new one.

  • If substantial changes are made to the file before the mv, it may not be picked up as a rename
  • Due to the fact that detecting renames is expensive, it is turned off by default and the -M switch has to be given to git log if you do want to see renaming.

Authentication

It is important to note that the Git protocol does not support authentication. To restrict people's access to your codebase, you need to use the other tools at your disposal. E.g. Setting up an SSH account(s) for the other colleagues to access your repo on. This is unlike SVN, whereby for each Repo, you can configure specific username/password pairs which were used for the 'authors' in the logs.

Misc

Installation (Linux)

sudo apt-get install git  

Install RabbitVCS GUI (Ubuntu)

sudo add-apt-repository ppa:rabbitvcs/ppa -y
sudo apt-get update
sudo apt-get install rabbitvcs-nautilus3

In Ubuntu 13, you may need to perform these extra steps.

References

Author

Programster

Stuart is a software developer with a passion for Linux and open source projects.

comments powered by Disqus