ブランチでの作業を終えた場合に、他のブランチや元となるブランチへマージさせる必要があります。
まずは視覚的に分かりやすいSourcetree(Macバージョン)による方法で説明します。
いま下記のようにmytaskブランチ上で作業しています。mytaskブランチにおいてtext.txtファイルは「abc」のように記述されており、masterブランチでは「ab」と一つ遅れています。
mytaskブランチをmasterブランチにマージします。
一度masterブランチに戻ったらmytaskブランチ上で右クリックして「mytaskをmasterへマージ」を選択します。
ウィンドウが開くのでそのままOKします。
masterブランチとmytaskブランチが揃っているのが確認できます。
このようにmytaskブランチで作業している間に、masterブランチでは一度もコミットしていない場合、単に遅れを取り戻すような形でマージされています。これを「Fast Forward」と呼びます。
上記の流れをGitコマンドでおこないます。
現在のブランチを確認。下記ではmytaskブランチにいます。
1 2 3 4 |
git branch master * mytask |
masterブランチに移動します。
1 2 3 4 |
git checkout master * master mytask |
mytaskブランチを、今いるmasterブランチにマージさせます。「Fast-forward」と表示されているのが確認できます。
1 2 3 4 5 6 |
git merge mytask Updating 99cae01..598436d Fast-forward test.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) |
マージコミット
次にFast-forwardでない場合のマージの様子をみてみます。
下記は、text1.txtとtext2.txtの2つのファイルがあり、masterブランチでは「text1.txtにaを追加」、text2ブランチでは「text2.txtにaを追加」している状態です。つまりそれぞれのブランチでコミット作業をおこなっている状態です。
masterブランチにtext2ブランチをマージさせてみます。
1 |
git merge text2 |
テキスト編集モードに切り替わるのでそのまま:wqで保存します。
1 2 3 4 5 6 7 |
Merge branch 'text2' # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit. |
マージされると下記のように表示されます。「recursive」
1 2 3 |
Merge made by the 'recursive' strategy. text2.txt | 1 + 1 file changed, 1 insertion(+) |
実際masterブランチでは「text1.txt」「text2.txt」共にaが追加されている状態となります。Sourcetreeでは下記のように表示され、新たなコミットが生成されているのが確認できます。これをマージコミットと呼びます。
はじめに説明したFast-forwardが可能な状態であるマージの場合にも、マージの履歴をあえて残すために「–no-of」オプションを設定し、マージコミットさせることができます。
1 |
git merge mytask --no-ff |