After many years of using SVN, my current revision control system of choice is git. It makes distributed and offline work a breeze, so I don’t always have to log in in to a remote repository when I want to commit some changes. This post describes how I use git on a regular basis.
For every project under revision control there is a local git repository
$ git init project
as well as a corresponding remote repository on my server which I use to synchronize different computers and as an extra backup facility.
$ git init --bare project.git
For sending committed changes to the remove repository as well as for retrieving them, I have a simple Makefile in place in the root directory of the project repository.
.PHONY: push pull push: git push --progress ssh://foo/project.git master:master pull: git pull ssh://foo/project.git master:master
foo is the actual address of the server plus the absolute path to the directory where all the git repositories reside.
.gitignore files extensively. For example, in a directory where I store LaTeX files, the
.gitignore file would contain a list like this:
.DS_Store *.log *.bbl *.blg *.rel *.out *.aux *.toc *.pdf auto/ *.synctex.gz
If I want to commit some changes I made, I first have to stage them as it is called in git terminology. This is done using the command
$ git add file1 file2 file3
This might seem a little odd or tedious at first, but staging lets you easily group changes to indicate that they are related.
To unstage a file use the command
$ git reset file
Committing then works the same as with SVN
$ git commit
One common mistake I make is forgetting to include some changes in a commit or staging changes that are not directly related. In that case there’s an easy solution to the problem. First you undo the last commit by issuing the command
$ git reset --soft HEAD^
Be sure to include the
--soft option, because otherwise you’re committed changes will be overwritten by whatever revision that came before!
Then you make the changes, staging and unstaging or even editing a files (just be sure to stage edited files even if they are already in the so-called index, the list of files staged for the next commit) and commit with the command
$ git commit --amend
The followup post to this one will describe how I use git with Emacs.