LoginSignup
60
41

More than 5 years have passed since last update.

Git rebaseでコンフリクト時のcheckoutオプションの--theirsと--ours

Posted at

Git rebaseでコンフリクトが発生した際のgit checkout --theirsgit 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とするべきであった。

動作を見た結果、おそらく以下のようになっている。

  1. rebaseの元となるブランチ(master)に現在のBranchを移す
  2. rebaseされるブランチ(BranchA)との共通コミット(o)から順次変更を取り込む
  3. 最後のコミット(d)まで取り込んだら、rebaseされるブランチ(BranchA)の指す先を取り込んだところ(d')に変更する。

ユーザが操作する段階のカレントブランチからの視点では、git mergegit rebaseとはコンフリクトが発生した際の--theirs--oursの指定が逆になるので注意する必要がある。

最後に

git rebaseの一つ一つのコミットを反映する出力を見ていればわかったはずですが、まじめに見ていなかった自分が悪いんですね。次からは気をつけて、明日またrebase作業します。

60
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
41