はじめに
- 他のブランチを merge しようとしてコンフリクトした時、他のブランチを rebase しようとしてコンフリクトした時、他のブランチの merge を revert しようとしてコンフリクトした時、それぞれ
git checkout --ours
とgit checkout --theirs
した際にファイルがどのブランチの状態になるかを確認した。
先に結論
- 他のブランチを merge しようとしてコンフリクトした時
- ours: 現在のブランチの状態になる
- theirs: merge しようとしているブランチの状態になる
- 他のブランチを rebase しようとしてコンフリクトした時
- ours: rebase しようとしているブランチの状態になる
- theirs: 現在のブランチの状態になる
- 他のブランチの merge を revert しようとしてコンフリクトした時
- ours: merge 後に変更した状態になる
- theirs: merge 前の状態になる
準備
mkdir remote
cd remote
git init --bare myrepo.git
cd ../
git clone /Users/dchiba/Project/git_test/remote/myrepo.git/ local1
git clone /Users/dchiba/Project/git_test/remote/myrepo.git/ local2
cd local1
vi file1
git add .
git commit -m "add file1"
git push origin master
cd ../local2
git pull origin master
git checkout -b br1
merge の検証
master と br1 ブランチで file1 を変更
変更前の file1
aaa
bbb
ccc
ddd
eee
master で変更した file1
- 1 行目を削除
bbb
ccc
ddd
eee
br1 ブランチで変更した file1
- 1 行目を変更
a1a
bbb
ccc
ddd
eee
master で br1 ブランチを merge する
merge の実行
git fetch
git merge origin/br1
file1 のコンフリクト
$ git diff
diff --cc file1
index 3462243,2d53893..0000000
--- a/file1
+++ b/file1
@@@ -1,3 -1,4 +1,7 @@@
++<<<<<<< HEAD
++=======
+ a1a
++>>>>>>> origin/br1
bbb
ccc
ddd
master ブランチで git checkout --ours file1
- master ブランチの file1 になる
bbb
ccc
ddd
eee
master ブランチで git checkout --theirs file1
- br1 ブランチの file1 になる
a1a
bbb
ccc
ddd
eee
rebase の検証
file1 を変更
- merge の場合と同様に file1 を変更
br1 ブランチで master をリベースする
git pull --rebase origin master
file1 の diff
$ git diff
diff --cc file1
index 3462243,2d53893..0000000
--- a/file1
+++ b/file1
@@@ -1,3 -1,4 +1,7 @@@
++<<<<<<< 428e75c53eebe68d1bda63a5a032adbf9b784d62
++=======
+ a1a
++>>>>>>> update file1
bbb
ccc
ddd
br1 ブランチで git checkout --ours file1
- master ブランチの file1 になる
bbb
ccc
ddd
eee
br1 ブランチで git checkout --theirs file1
- br1 ブランチの file1 になる
a1a
bbb
ccc
ddd
eee
revert の検証
br1 ブランチを master に merge
git merge origin/br1
file1 の状態
merge 前の file1
bbb
ccc
ddd
eee
merge した直後の file1
- br1 の変更を受け入れた
a1a
bbb
ccc
ddd
eee
merge 後に master で file1 を変更する
a2a
bbb
ccc
ddd
eee
master で br1 の merge を revert する
revert 実行
git revert -m 1 b2a72be909fa938ef4dde72d0f211452c59412b1
file1 の diff
- merge 前の master と revert 後のもので conflict している
$ git diff
diff --cc file1
index c350386,3462243..0000000
--- a/file1
+++ b/file1
@@@ -1,4 -1,3 +1,7 @@@
++<<<<<<< HEAD
+a2a
++=======
++>>>>>>> parent of b2a72be... Merge remote-tracking branch 'origin/br1'
bbb
ccc
ddd
master で git checkout --ours file1
- revert 後の変更を受け入れる
a2a
bbb
ccc
ddd
eee
master で git checkout --theirs file1
- revert 前の状態を受け入れる
bbb
ccc
ddd
eee