Git と Visual Studio 2017 その 7 : チェリーピックで他のブランチから特定のコミットを反映

前回の記事ではリベースについて説明しました。今回は他のブランチにあるコミットのうち、任意のものだけを反映する方法として、チェリーピックを見ていきます。

チェリーピック : Git

まずは Git のチェリーピックがどのように動作するか確認します。

1. 現状確認のため ‘git log --oneline --graph --all’ を実行。前回記事の処理により、リベース完了時点であることを確認。

image

2. まず dev ブランチをリベース前に戻す。’git reflog’ よりリベース前のコミット ID を検索。

image

3. ‘git reset --hard 5df97d2’ 実行後 ‘git log --oneline --graph --all’ でリベース前に戻ったことを確認。

image

4. 今回はマージやリベースではなく、master の Patch1.cs コミットを dev に適用するため、‘git cherry-pick ac2b093’ を dev ブランチで実行。競合発生を確認。

image

5. ‘git mergetool’ で競合を解消。

image

6. 競合解消後、‘git commit -am “Patch1.cs をチェリーピック”’ でコミットを実行。

image

7. ‘git log --oneline --graph --all’ で履歴を確認。dev ブランチの最後に Patch1.cs コミットがある。また master からは Patch1.cs コミットは消えていない事を確認。

image

8. 例えば Patch1.cs のコミットを間違えて master ブランチにした場合、’git checkout master’ および ‘git reset --hard c79adb2’ で解決。

image

9. 次のテストのために master ブランチで ‘git reset --hard ac2b093’, dev ブランチで ‘git reset --hard 5df97d2’ を実行して元に戻す。

image

複数のコミットをチェリーピック

チェリーピックは複数のコミットを対象にすることも可能です。上記とは逆に master に dev からチェリーピックしてみましょう。

1. ‘git checkout master’ および ‘git cherry-pick f9b4da3 5df97d2’ を実行して 2 つのコミットをチェリーピック。これら 2 つは dev の最新から 2 つのため、‘git cherry-pick ..dev’ でも同様。

2. 競合のメッセージが出るため、都度 ‘git mergetool’ で競合を解消。また競合を解消するたびに ‘git cherry-pick --continue’ を実行してチェリーピックを続行。続行時にコミットコメント編集画面が開くが、変更する必要はないため、’:q’ でエディターは終了。

image

3. 競合は 2 つ目のコミットでも発生するため、同様に解消。

image

4. チェリーピック完了後 ‘git log --oneline --graph --all’ で状況確認。.

image

5. 次のテストのために master ブランチで ‘git reset --hard ac2b093’, dev ブランチで ‘git reset --hard 5df97d2’ を実行して元に戻す。

チェリーピック : VS

Git と同じ操作を Visual Studio 2017 でもやってみましょう。

1. チェリーピックは dev ブランチから実行するため、dev をチェックアウト。その後 master ブランチを右クリックして ”チェリーピック” を選択。

image

2. 期待通り競合が発生するので、マージで競合を解消。

image

3. 競合解消後、”変更を表示” をクリック。進行中のチェリーピックで ”続行” をクリック。

image

4. この時点で ”チェリーピックが完了してコミットされました” と出る。

image

5. 履歴の表示より状況を確認。

image

複数のコミットをチェリーピック

Visual Studio 2017 では複数のコミットを一気にチェリーピックする方法が見つかりませんでしたが、任意のコミットをチェリーピックはできるため、複数回繰り返すことで対応可能です。

1. master ブランチでチェリーピックするため、master をチェックアウト。

2. dev ブランチの任意のコミットをチェリーピックしたいので、dev ブランチを右クリック | ”履歴の表示”

image

3. dev ブランチの履歴が表示されるので、f9b4da38 を右クリックして ”チェリーピック” を選択。

image

4. 後は同じフローのため、競合を解消してチェリーピックを完了。その後、5df97d22 もチェリーピック。完了時に master の履歴を開き、2 つのコミットが追加されている事を確認。

image

まとめ

マージやリベースと同様に、Git と Visual Studio では言葉などが少し違いますが、根本的な動作を理解していると不安なくチェリーピック出来ます。次回は作業の一時保存について見ていきます。次の記事へ

中村 憲一郎