Git チュートリアル - ブランチのマージ
このチュートリアルでは、ブランチをマージする方法と、競合が存在する場合の対処方法を学びます。
前回のチュートリアルで行ったのは、master ブランチを台無しにしたくないいくつかの新機能で動作する新しいブランチを作成したことです。
これらの新しいブランチを作成し、新しい機能に満足したら、それを master ブランチにマージする必要があります。そのため、次のリリースコードを公開するときに、新しい機能も含まれます。
早送り git merge
new_test_branch ブランチの変更に満足し、それを master にマージして戻すとしましょう。
-
masterブランチをチェックしてください
$ git checkout master
-
ブランチを
マスターにマージします
$ git merge new_test_branch
Updating 5fef94e..e7a7e81
Fast-forward
test3.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
この機能をブランチ new_test_branch から取得し、この master ブランチにマージしました。
マージ後のメッセージに表示される早送りとは、ブランチで行ったコード変更まで git が早送りすることを意味します。master ブランチに変更を加えました。
再帰的な git merge
この異なる git merge をデモンストレーションする前に、2つのブランチ test_branch_A と test_branch_B を作成し、それらに異なる変更を加える必要があります。次に、test_branch_A を master ブランチにマージします。
ここで、test_branch_B を master にマージします。
$ git merge test_branch_B
Merge made by the 'recursive' strategy.
test1_rename.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
このマージと fast-forward マージの違いは、このブランチコードには test_branch_A 機能がないため、マージは再帰的戦略によって行われることです。言い換えれば、ブランチ test_branch_B が作成された後に master ブランチが変更されています。
今、master はこれらの 2つの機能の両方で最新であり、同時にそれらに取り組んだことは問題ではありません。。
競合を解決する
2つのテストブランチで変更したものに競合はありませんが、いくつかのブランチを master にマージするときに競合が発生した場合はどうでしょうか
2つのブランチ test_branch_C と test_branch_D を作成し、ブランチ test_branch_C のファイル test3.txt にテキスト The should be C を追加し、テキスト The letter should be D をブランチ test_branch_D のファイル test3.txt に追加しましょう。
次に、test_branch_C をマージして master ブランチに戻します。
ここで、test_branch_D を master にマージします。
$ git merge test_branch_D
Auto-merging test3.txt
CONFLICT (content): Merge conflict in test3.txt
Automatic merge failed; fix conflicts and then commit the result.
ここでは、ファイル test3.txt の競合を検出したため、正常にマージできなかったことがわかります。競合するファイルを編集して、競合を手動で解決する必要があります。
ファイル test3.txt は競合を次のように示します
<<<<<<< HEAD
The letter should be C
=======
The letter should be D
>>>>>>> test_branch_D
HEAD と ======= の間のテキストは、マージされるブランチ test_branch_C から来る master ブランチのテキストであり、マージされるブランチ test_branch_D のテキストとは異なります。。
どのテキストを master に保持するかを選択し、<<<<<や >>>>> などのすべてのシンボルを削除する必要があります。
たとえば、追加するテキストは文字は D である必要がありますとします。競合する領域を文字は D でなければなりませんに更新します。
競合を解決した後、git commit を使用して、解決した競合をコミットできます。
