Git チュートリアル - ブランチのマージ

  1. 早送り git merge
  2. 再帰的な「git merge」
  3. 競合を解決する

このチュートリアルでは、ブランチをマージする方法と、競合が存在する場合の対処方法を学びます。

前回のチュートリアルで行ったのは、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_Atest_branch_B を作成し、それらに異なる変更を加える必要があります。次に、test_branch_Amaster ブランチにマージします。

ここで、test_branch_Bmaster にマージします。

$ 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_Ctest_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_Dmaster にマージします。

$ 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」を使用して、解決した競合をコミットできます。

comments powered by Disqus