Git rebase
でコンフリクトが発生した際のgit checkout --theirs
とgit checkout --ours
でどちらが適用されるのかよくわからず、適当にやったら失敗してしまったのでメモ。
###やりたい事
これを
/ーーcーーd
/ ^
/ BranchB
ーoーーaーーb
^
BranchA
こうしたい
ーoーーaーーbーーc'ーーd'
^ ^
BranchA BranchB
ただし、aの変更とcの変更で、一部のファイルにて同じ箇所の修正を行っているが、aの方の変更をすべて適用したい。
###とりあえずやってみた
同じ箇所の修正を行っているため
git checkout BranchB
git rebase BranchA
と行うとコンフリクトが発生しrebase動作が一時停止する。
ここで、BranchAに存在するaの変更をすべて適用したかったので、「BranchBにいたからgit checkout --theirs hoge.txt
でしょ」としてgit add hoge.txt
してgit rebase --continue
。
しかし最終的に出来てきたのはBranchBのcの変更をすべて適用した結果であった。
###やりたい事をやるためには
結論としては、コンフリクトが発生してrebaseの元(BranchA)を適用する際には、git checkout --ours hoge.txt
とするべきであった。
動作を見た結果、おそらく以下のようになっている。
- rebaseの元となるブランチ(master)に現在のBranchを移す
- rebaseされるブランチ(BranchA)との共通コミット(o)から順次変更を取り込む
- 最後のコミット(d)まで取り込んだら、rebaseされるブランチ(BranchA)の指す先を取り込んだところ(d')に変更する。
ユーザが操作する段階のカレントブランチからの視点では、git merge
とgit rebase
とはコンフリクトが発生した際の--theirs
と--ours
の指定が逆になるので注意する必要がある。
###最後に
git rebaseの一つ一つのコミットを反映する出力を見ていればわかったはずですが、まじめに見ていなかった自分が悪いんですね。次からは気をつけて、明日またrebase作業します。