Git tips & tricks for everyday use - part 2

The first part of my git tips & tricks blogpost got some really good responses. It's been a while so I think the time is right to compose a second list of tips & tricks!

(Force) push the current branch

While force pushing you will always have to check you push the right branch. Otherwise it is possible you accidentally force push another branch, for example the master branch. If that branch was behind on the origin master you will override all changes done by others. To avoid this you can just use HEAD as the branch indicator:

git push origin HEAD -f 

Force push with lease

To avoid overriding changes on the remote branch because you force push, git has a built-in safety check. You can use the --force-with-lease flag, this way git will check that the remote branch has not been updated since you last fetched it.

$ git push origin HEAD --force-with-lease
To /tmp/test-repo
 ! [rejected]        dev -> dev (stale info)
error: failed to push some refs to '/tmp/test-repo'

Bisect run

Git bisect is a great tool to trace bugs to the commit that introduced them. But this can be a long process when it's an complex issue or it was committed a long time ago. In order to make this process easier and faster, you can use git bisect run.

This sub-command of the bisect tool allows to pass an automated check if a commit is good or bad. You can for example pass a phpunit test that will validate all commits that bisect will check. If the test(s) fail it's a bad commit otherwise it's a good commit.

git bisect start

git bisect good 85730ab # We know the functionality worked at commit 85730ab

git bisect bad fbe6fb8 # And we know that the current commit is bad

git bisect run phpunit tests/BrokenFunctionalityTest.php # Bisect is setup, so run it with our test to validate the functionality

# Result
ad1a436f0c15676cd5251e1d73c3af667e739a72 is the first bad commit

Partial reverts

Sometimes you want to revert a "bad" commit but keep some of the changes. This can easily be done by the revert --no-commit (-n) command.

git revert -n $bad_commit    # Revert the commit, but don't commit the changes
git reset HEAD               # Unstage the changes
git add --patch .            # Add the changes you want to keep
git commit                   # Commit those changes

Easily switch to previous branch

Just like on the command line you can switch to the previous directory by using cd -, you can use this same trick to switch easily to the previous branch.

git checkout feature-branch1

git status
    On branch feature-branch1

git checkout master

git status
    On branch master

git checkout -

git status
    On branch feature-branch1

Gitignore templates

Github has provided a repository with a whole bunch of gitignore templates to get you started on a new project. For example when you start a symfony project from scratch, just run the following command and you will have a correct .gitignore to get started.

wget https://raw.githubusercontent.com/github/gitignore/master/Symfony.gitignore -O .gitignore

To find all available gitignore templates visit the github/gitignore repository.

Gitignore alias

With this alias you can easily add extra files or directories to the gitignore right from the command line.

git config --global --add alias.ignore '!f() { echo $1 >> .gitignore; }; f'

# Execute the command

git ignore /path/to/ignore/dir/*

Change the base branch

When you accidentally create a feature branch from the incorrect branch. For example you started a branch from a feature branch instead of the master branch. By using rebase --onto you can rebase the feature branch from the correct branch. The syntax is like rebase *original starting branch* --onto *correct branch*.

git rebase feature-1 --onto master

Git standup alias

A lot of teams use standups to recap the work each team member did the last day or so. When you work on a lot of different issues it's hard to remember what you exactly did in that timespan. Therefor this alias makes it easy to retreive all the work done in the past day in all branches.

git config --global --add alias.standup '!git log --branches --remotes --tags --no-merges --author="`git config user.name`" --since="$(if [[ "Mon" == "$(date +%a)" ]]; then echo \"last friday\"; else echo \"yesterday\"; fi)" --format=%s'

# Now you can run the following command and get all commits you did yesterday

git standup

Bonus: lazy standup

This is a fun little extension to the git standup alias. We can use the built-in text-to-speech tool so you don't even have to speak during the standup :)

git config --global --add alias.lazy-standup '!git standup-simple | spd-say -e' # On osx you can use the say command instead of spd-say

# Just run git lazy-standup and just sit back and relax :)

If you have other cool git tips and tricks or you like any of these, let it know in the comments below!