Git と Visual Studio 2017 その 5 : マージで他のブランチからコミットを反映

前回の記事ではブランチについて紹介しました。今回はブランチの変更を取り入れる、マージについて見ていきます。

マージ : Git

ブランチを作る理由は、機能追加や修正など色々ありますが、変更はいずれ反映する必要があり、Git では merge コマンドを使います。

1. ‘git branch’ を実行。master と dev ブランチがあり、現在 dev ブランチにチェックアウト中。

image

2. ‘git log --oneline --graph’ を実行。master より新しいコミットがあることを確認。

image

3. マージをする際、マージを受け入れる側のブランチで作業を行うため、master ブランチに移動。その後 ‘git merge dev’ を実行。結果として “fast-forwad” と出ていることを確認。

image

4. ‘git log --oneline --graph’ を実行。master が dev と同じコミットをポイントしている。つまり今回のマージで新しいコミットは作成されておらず、ref\heads\master ファイルがさしているコミットの情報が変わっただけ。この場合 dev ブランチがどこから作成されたかなどの情報が失われている。

image

5. マージをやり直すため、‘git reset --hard c79adb2’ を実行。’git log --oneline --graph --all’ を実行。all オプションを付けることですべてのブランチの情報を取得可能。

image

6. ‘git merge --no-ff dev’ を実行。--no-ff オプションを付けることで fast-forward を阻止。結果として “recursive strategy” と表示されている。

image

7. ‘git log --oneline --graph’ を実行。先ほど異なり、新しいコミットが作成されている。また dev ブランチがどのタイミングで作成されたかも確認が可能。ちなみに (¥)マークは左から右上に向けた矢印となる ASCII アート。

image

8. Visual Studio でも試せるように ‘git reset --hard c79adb2’ を再度実行。

マージ : VS

1. 現在の確認を実施。dev ブランチに切り替えてから、チームエクスプローラー | 変更 | アクション | 履歴の表示より現在の状態を確認。

image

2. チームエクスプローラー | ブランチメニューに移動し、master へチェックアウト。その後マージリンクをクリック。

image

3. ”マージするブランチ” で dev を選択し、マージをクリック。”マージ後に変更内容をコミットする” チェックボックスは入れておく。

image

4. マージ完了後履歴を更新。dev と master が同じコミットをポイントしているので、fast-forward マージとなっている。

image

5. c79adb2b を右クリックしてハードリセット。

image

6. 再度ブランチ画面からマージを実施。今回は ”マージ後に変更内容をコミット” のチェックを外して実行。

image

7. すると以下のメッセージが表示される。メッセージには変更をコミットするよう指示があるが ”中止” のリンクしかない。

image

8. チームエクスプローラーのホームより変更メニューへ移動。変更画面でステージ済みのアイテムとして dev ブランチの変更があることを確認。コメントを入れてコミット。

image

9. master ブランチの履歴を表示。新しいコミットが作成され、dev ブランチの履歴も保持されている。

image

”マージ後に変更内容をコミット” の既定値

fast-forward の無効を既定にしたい場合は、Visual Studio 2017 から設定を変更できます。

1. チームエクスプローラーより設定に移動。

image

2. ”グローバル設定” を選択。

3. “既定でマージ後に変更をコミットする” のチェックボックスを変更して、”更新” をクリック。

image

まとめ

個人的には Visual Studio 2017 のマージ機能は Git と言葉が違うことや、fast-forward ではないマージの場合に画面の移動を自分でする必要がある点など、結構混乱していたので、今回の記事で少しでも明確になると幸いです。次回はリベースについて見ていきます。次の記事へ

中村 憲一郎