gitでコンフリクトした時に変更を一括で反映する

gitでコンフリクトが発生して手動ではなく一括で変更を反映したかったのでやり方を調べました。

結論

git checkout --ours ファイルパスgit checkout --theirs ファイルパス を使う。

  • --ours: 取り込み側の変更を残す
  • --theirs: 取り込まれる側の変更を反映する
  • mergerebase で取り込み側の向き逆になるので注意が必要

merge

カレントブランチ(branch_B)が取り込み側になる。 branch_B <- branch_A のイメージ。

$ git checkout branch_B
$ git merge branch_A

# branch_A の内容を取り込む
$ git checkout --theirs ファイルパス

# branch_B の内容を残す
$ git checkout --ours ファイルパス

rebase

マージ先のブランチ(branch_A)が取り込み側になる。 branch_A <- branch_B のイメージ。

$ git checkout branch_B
$ git rebase branch_A

# branch_A の内容を取り込む
$ git checkout --ours ファイルパス

# branch_B の内容を残す
$ git checkout --theirs ファイルパス

まとめ

便利な機能だが使い方を間違えるととんでもないことになるので慎重に使っていこう。

参照

Git - git-checkout Documentation

git の merge, rebase, revert で衝突した際の ours, theirs はどんな状態になるか - Qiita

コンフリクトしたときの --theirs と --ours