ボクはgit rebase派です。正確にはgit pull --rebase origin masterを実行します。git pull origin masterは使いません、なぜならコミットの順番がおかしくなるから。
参考:git-pull、git-pull --rebaseをめぐる冒険+コンフリクトした場合の作業 - satoko's blog - s21g
下記は、masterからb1, b2, b3ブランチを作成し、b1 (hoge.txtを追加), b2 (fuga.txtを追加), b3 (piyo.txtを追加)でそれぞれ1度pushを行った後、b3をmasterにmergeし、b1ではgit pull origin masterを、b2ではgit pull --rebase origin masterを、実行したときのコミットログです。
- pullの場合
Date: Sat Mar 3 00:44:07 2012 +0900
Merge branch 'master' of github.com:Hiroyou/rebase into b1
Date: Fri Mar 2 07:42:25 2012 -0800
Merge pull request #4 from Hiroyou/b3
added piyo.txt
Date: Sat Mar 3 00:40:00 2012 +0900
added piyo.txt
Date: Sat Mar 3 00:25:27 2012 +0900
added hoge.txt
- rebaseの場合
Date: Sat Mar 3 00:34:41 2012 +0900
added fuga.txt
Date: Fri Mar 2 07:42:25 2012 -0800
Merge pull request #4 from Hiroyou/b3
added piyo.txt
Date: Sat Mar 3 00:40:00 2012 +0900
added piyo.txt
rebaseの場合はpiyo.txt→fuga.txtの順、pullの場合はhoge.txt→piyo.txtの順になっており、rebaseの方が直感的じゃないでしょうか。masterをメンテしている人からすると、なんで勝手にコミットの順変えるの?却下!って感じになると思います。
ただし、この後 b1, b2のそれぞれでpushを行うと、b1の場合はうまくいくのですが、b2の場合はnon-fast-forwardのエラーが出てしまいます。
これはrebaseによって、ローカルのb2とリモートのb2とがnon-fast-forwardな状態になってしまっているからです。最新のmasterからの差分を確認した上で問題がないようであればgit push -f origin masterと-f (強制)オプションを付けて実行すればpushすることはできます。
ただし、、、
ここでエラーメッセージに従ってgit pull origin b2とかしてしまうと、下記のようになってもうわけがわからなくなりますのでご注意を。b2をb2にmergeするだとか、同じコミットが2回入っていたりだとか、悲劇です。
Date: Sat Mar 3 01:43:30 2012 +0900
Merge branch 'b2' of github.com:Hiroyou/rebase into b2
Date: Sat Mar 3 00:34:41 2012 +0900
added fuga.txt
Date: Fri Mar 2 07:42:25 2012 -0800
Merge pull request #4 from Hiroyou/b3
added piyo.txt
Date: Sat Mar 3 00:40:00 2012 +0900
added piyo.txt
Date: Sat Mar 3 00:34:41 2012 +0900
added fuga.txt
これがgit rebaseが危険だと言われる所以なのでしょうか?
でも大丈夫。こうなった場合でもgit reset b2^で元の状態に戻せます。その後、-fをつけてpushすれば万事OK
注)git show-branchとかgit guiでRepository > Visualize All Branch Historyとかを駆使して注意してやった方が良いです。あくまで自己責任でお願いします。