これはなに?
いままでは気にしていなかったけど、git pull --rebase はpushする前にした方がいいよと言われた。
でもよくわからなかったので調べたのでそのまとめ。
git pull
って?
git fetch
+git merge
のこと。
つまり、リモートの更新をローカルに持ってくるコマンドのショートカット版。
たとえば、topic branch
でgit pull origin master
をすると、topic branchにmasterをmergeすることになる。
じゃあgit pull --rebase
は?
git fetch
+git rebase
のこと。
たとえば、topic branch
でgit pull --rebase origin [main branch]
をすると、topic branchに[main branch]をbaseにしてrebaseすることになる。
[topic-branch] $ git pull --rebase [main branch]
違いがわかりにくいって?わからなくていいや。とりあえずgit pull --rebase
を使ってからpushしよう。 気になる人は、分かりやすいサイトがあるから見るといいよ。ちなみにこれを理解するのに8時間くらいかかりました。業務時間ずっと考えてたことになりますね。
図にすると?
checkoutした直後は下記の状態になる。
develop o-o-o
/
master o-o-o-o
これがしばらく進むとmasterでの開発が進んで下記の状態になる。
develop o-o-o
/
master o-o-o-o-o-o
- このままpushするとconflictが起きやすい。そこで下記のようにしたい。
develop o-o-o
/
master o-o-o-o-o-o
この時使うといいのがgit pull --rebase
なのだ。よくわからなければとりあえずこれをすると良い。ちなみにこの状態がfast fowardと呼ばれる状態で、branchとして綺麗だし、差分が少ないのでconflictが起きづらいので非常に良い
。
conflictは普通に起こるんですよね。ほんと。
main branchとtopic branchで同じファイルを変更していた場合は、conflictが起こる。というか直してって言われる。
基本的に、branchをきれいな状態にするという思想でいいと思う。これがgit pull だと下記の状態になるのでちょっときたない。
develop o-o-o
/ /
master o-o-o-o-o-o