checkoutせずにmergeする


参考:Git checkout and merge without touching working tree

Gitで、「作業ブランチの変更を別のブランチに反映する」という操作はmergeでおこなうことができます:

作業ブランチの名前をb1、作業ブランチの変更を反映したいブランチの名前をb2とします。

b2b1をマージする」ためには、普通

git checkout b2  # 一度b2をcheckoutして
git merge b1     # b1をマージ

としますが、なんらかの理由でcheckoutせずにb1b2にマージしたいとします。
例えば、ファイルの変更を感知して自動ビルドを走らせる設定がしてある環境 (あるのか?) では、一度b2をcheckoutした段階でb1で追加/編集したファイルがワーキングディレクトリから消滅するので自動ビルドが走り、さらにb2b1をマージした段階でも消滅したファイルが追加され自動ビルドが走ってしまいます。

これを避けるためには、直接b2b1の変更を取り込もうとするのではなく、b1b2の変更を取り込んでから、b2のコミットを進めてしまえば良い:
(1) b1b2の変更を取り込む:

# b1上で
git merge b2

(2) b2b1へfast-forwarding

# b1上で
git fetch . b1:b2

これでb2へcheckoutすれば、実際にはb1b2をマージしたにもかかわらず、b2b1をマージしたのと実質同様の操作が行えたことになります。

ポイントは、fetchmergeと違い、対象元のブランチ/対象先のブランチを各々指定できることです。
ちなみに、最初の時点ですでにb2b1へfast-forwarding merge可能である場合、(1)をおこなう必要はなく、いきなり(2)でOKです。