Git - Automatically fast forward all tracking branches on pull
Shell script that fast-forwards all branches that have their upstream branch set to the matching origin/ branch without doing any checkouts
it doesn't change your current branch at any time, no need to deal with working copy changes and time lost checking out
it only does fast-forwards, branches that cannot be fast-forwarded will show an error message and will be skipped
Make sure all your branches' upstream branches are set correctly by running git branch -vv
. Set the upstream branch with git branch -u origin/yourbanchname
Copy-paste into a file and chmod 755:
#!/bin/shcurbranch=$(git rev-parse --abbrev-ref HEAD)for branch in $(git for-each-ref refs/heads --format="%(refname:short)"); do upbranch=$(git config --get branch.$branch.merge | sed 's:refs/heads/::'); if [ "$branch" = "$upbranch" ]; then if [ "$branch" = "$curbranch" ]; then echo Fast forwarding current branch $curbranch git merge --ff-only origin/$upbranch else echo Fast forwarding $branch with origin/$upbranch git fetch . origin/$upbranch:$branch fi fidone;
If you really want to fast forward all local branches that are tracking remote branches you might want to consider adding this as an alias to your ~/.gitconfig
:
[alias] pull-all = !"for b in $(git for-each-ref refs/heads --format='%(refname)') ; do git checkout ${b#refs/heads/} ; git pull --ff-only ; done"
You can then run git pull-all
, it will iterate through your local branches and run a git pull --ff-only
on each.
But wait:
- git won't merge (the second step of
git pull
after thefetch
part) files unless the branch is checked out first. See "Can “git pull --all
” update all my local branches?" git pull
onmaster
will merge files onmaster
, meaning the next push will be a fast-forward one. A non fast-forward can only occur if a push to the remotemaster
from another repo has been done prior to your push.
Note: I suppose you have tracked all your remote branches as in "Track all remote git branches as local branches."
Note: Git 2.0 (Q2 2014) will introduce with commit b814da8 a config push.ff:
pull.ff::
By default, Git does not create an extra merge commit when merging a commit that is a descendant of the current commit. Instead, the tip of the current branch is fast-forwarded.
- When set to
false
, this variable tells Git to create an extra merge commit in such a case (equivalent to giving the--no-ff
option from the command line).- When set to
only
, only such fast-forward merges are allowed (equivalent to giving the--ff-only
option from the command line).