In the last seven months I learned git, working for a dozen of projects. On some of them I was the master&commander, on others I only set up the streams and let the young Jedi find the way to the delivery. Via trial and error I find out a bunch of userful commands.
I present here in order of priority, from the most important to the least…let’s start
Userful monitoring / configuration commands
- This is the first tip I suggest you:
1git config --global merge.ff false
This configuration force git to register
a commit object even if the merge is a fast forward merge.
Git has a “smart” what of acting, consisting in not registering fast-forward merges. This can be very annoying if you try to track down an evil sith commiting random stuff on your system. Belive me. Sith are so evil!
- Find out what happen while you was on holidays…
1git whatchanged master...my/great-release
It is the most userful command to check differences between branches/tag/commits.
If you have a huge project, you can also specify a directory like in
1git whatchanged master...my/great-release test-scripts-dir
The standard report is quite good, listing commit comment, and files.
Even better if you want to recover the previous file’s version, issue
123git show HEAD^1:parser/src/main/MyStuff.Java >OldStuff.java#For two version before try...git show HEAD^2:parser/src/main/MyStuff.Java
- Resync with remote is always a pain if you forget a branch…
1git remote update
Without special configuration, this command will fetch updates for all your remotes.
Very useful if you need to know the status of all your branches
- Logs are good, but logs with branch description are better:
1git log --decorate
Will show you also the branches or the tag
- Sometimes you need to erase what you have just commited. An easy way to do it is
1git reset --soft HEAD^
This will revert your last commit, leaving it as “Changes to be committed”. Very userful if you do a wrong merge. For instance, if you are on branch “stable” and issue
git pull origin instableStuff
you will wrongly issue a merge of the instableStuff into your stable branch. It is quite subtle.
Sometimes there is a better option. It is called “revert”:
git revert HEAD
is better because will register a “revert” commit on the history, and it is useful when you already pushed your deadly stuff.
Why I do not like a lot git reset way of life.
Git reset can “erase” history, anyway, “git reflog” will keep in the trashcan the old commit, in case you need it. But be careful,because reflog is compacted from time to time so it is not a safe place
Team Caffeine Stats
git shortlog -s -n
Will give you fast stats on your team: is fomeone has a very huge commit rate, reduce free coffe meetings :)
Useful scripting commands
git ls-files workarea/workspace103 | grep /classes/ | xargs git rm
Nice to know advices
- Git 1.7.10 supports utf-8 encoding. I strongly encoruage you to use it instead of older version.
- –dry-run option
It is your best friend during a pull or a risky commit. Even if you are better then Yoda (or Linux) at git, you should definitely try it out sometimes.
1git pull --rebase
It should avoid merge linearizing input history.
I am not sure it is a good idea, but can avoid repeating merges if you needn’t. Anyway, do a lot of testing before proceeding in this way.
Subversion to Git migration guide
Known weird errors
- can’t resolve proxy ‘null’ for https
123$git var -l | grep httphttp.sslcainfo=/bin/curl-ca-bundle.crthttp.proxy=
If you have the empty http.proxy config, here is the problem.
Do a look at your $HOME/.gitconfig for the blank http.proxy configuration, and zap it.
Hub is a replacement script for git, but I disagree with this approach: anyway, you can decide by yourself if it deserve your attention.