まくまくGitノート
ブランチでの変更をマージする(直接マージ、スカッシュマージ、チェリーピック)
2010-07-19

Git の3種類のマージ

別のブランチで行った変更(コミット)を、取り込むことをマージといいます。 Git のマージには、以下のような種類があります。

  • 直接マージ: 別のブランチでのすべてのコミットをマージ(コミット)する。
  • スカッシュマージ: 別のブランチでのすべてのコミットを1つの変更としてステージングする。
  • チェリーピック: 別のブランチでの1つのコミットだけを選んでマージ(コミット)する。

直接マージ

直接マージはもっとも一般的なマージで、別のブランチで実行されたコミットを、あたかも現在のブランチに対してコミットされたかのように見えるようにマージします。 通常は、派生先のブランチでの変更を、派生元のブランチにすべて取り込む場合に使用します。

例: mybranch でのコミットを現在チェックアウトしているブランチにマージする

$ git merge mybranch
Updating e61beb0..dd06978
Fast-forward
 aaa.txt |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

普通にマージを実行した場合は、すべてのコミットが反映された状態になるので、git commit を実行する必要はありません。

スカッシュマージ(圧縮マージ)

git merge コマンドを実行するときに、--squash オプションを指定すると、ブランチ先でのすべてのコミットを1つにまとめて、現在チェックアウトしているブランチにステージングすることができます。

$ git merge --squash mybranch
Updating dd06978..6d10a56
Fast-forward
Squash commit -- not updating HEAD
 aaa.txt |    3 ++-
 bbb.txt |    2 ++
 2 files changed, 4 insertions(+), 1 deletions(-)
 create mode 100644 bbb.txt

通常のマージの場合とは異なり、スカッシュマージした場合は、ただちにコミットが実行されるのではなく、変更がステージングされた状態になります。 実際に変更を反映するにはコミットを実行する必要があります。

$ git commit -m "Some comment"

チェリーピック

別ブランチで行われた特定のコミットだけを取り込みたい場合は、git cherry-pick コマンドを使用します。 どのコミットを取り込 むかを支持するために、git log で表示されるコミットの ID を引数で指定します。 コミット ID はブランチをまたいだ場合でも一意なので、取り込み先のブランチ名を指定する必要はありません。

$ git cherry-pick 21358de
Finished one cherry-pick.

上記のコマンドを実行すると、チェックアウトしているブランチに対して、ただちにコミットが実行されます。 コミットを実行せずに、ただステージングするだけにしたい場合は、-n オプションを付けて git cherry-pick を実行します。

$ git cherry-pick -n 21358de
Finished one cherry-pick.

上記コマンドを実行した後で git status を実行すれば、次回のコミット対象として認識されていることを確認できます。

2010-07-19