Git と Visual Studio 2017 その 5 : マージで他のブランチからコミットを反映
前回の記事ではブランチについて紹介しました。今回はブランチの変更を取り入れる、マージについて見ていきます。
マージ : Git
ブランチを作る理由は、機能追加や修正など色々ありますが、変更はいずれ反映する必要があり、Git では merge コマンドを使います。
1. ‘git branch’ を実行。master と dev ブランチがあり、現在 dev ブランチにチェックアウト中。
2. ‘git log --oneline --graph’ を実行。master より新しいコミットがあることを確認。
3. マージをする際、マージを受け入れる側のブランチで作業を行うため、master ブランチに移動。その後 ‘git merge dev’ を実行。結果として “fast-forwad” と出ていることを確認。
4. ‘git log --oneline --graph’ を実行。master が dev と同じコミットをポイントしている。つまり今回のマージで新しいコミットは作成されておらず、ref\heads\master ファイルがさしているコミットの情報が変わっただけ。この場合 dev ブランチがどこから作成されたかなどの情報が失われている。
5. マージをやり直すため、‘git reset --hard c79adb2’ を実行。’git log --oneline --graph --all’ を実行。all オプションを付けることですべてのブランチの情報を取得可能。
6. ‘git merge --no-ff dev’ を実行。--no-ff オプションを付けることで fast-forward を阻止。結果として “recursive strategy” と表示されている。
7. ‘git log --oneline --graph’ を実行。先ほど異なり、新しいコミットが作成されている。また dev ブランチがどのタイミングで作成されたかも確認が可能。ちなみに (¥)マークは左から右上に向けた矢印となる ASCII アート。
8. Visual Studio でも試せるように ‘git reset --hard c79adb2’ を再度実行。
マージ : VS
1. 現在の確認を実施。dev ブランチに切り替えてから、チームエクスプローラー | 変更 | アクション | 履歴の表示より現在の状態を確認。
2. チームエクスプローラー | ブランチメニューに移動し、master へチェックアウト。その後マージリンクをクリック。
3. ”マージするブランチ” で dev を選択し、マージをクリック。”マージ後に変更内容をコミットする” チェックボックスは入れておく。
4. マージ完了後履歴を更新。dev と master が同じコミットをポイントしているので、fast-forward マージとなっている。
5. c79adb2b を右クリックしてハードリセット。
6. 再度ブランチ画面からマージを実施。今回は ”マージ後に変更内容をコミット” のチェックを外して実行。
7. すると以下のメッセージが表示される。メッセージには変更をコミットするよう指示があるが ”中止” のリンクしかない。
8. チームエクスプローラーのホームより変更メニューへ移動。変更画面でステージ済みのアイテムとして dev ブランチの変更があることを確認。コメントを入れてコミット。
9. master ブランチの履歴を表示。新しいコミットが作成され、dev ブランチの履歴も保持されている。
”マージ後に変更内容をコミット” の既定値
fast-forward の無効を既定にしたい場合は、Visual Studio 2017 から設定を変更できます。
1. チームエクスプローラーより設定に移動。
2. ”グローバル設定” を選択。
3. “既定でマージ後に変更をコミットする” のチェックボックスを変更して、”更新” をクリック。
まとめ
個人的には Visual Studio 2017 のマージ機能は Git と言葉が違うことや、fast-forward ではないマージの場合に画面の移動を自分でする必要がある点など、結構混乱していたので、今回の記事で少しでも明確になると幸いです。次回はリベースについて見ていきます。次の記事へ
中村 憲一郎