参考:Git checkout and merge without touching working tree
Gitで、「作業ブランチの変更を別のブランチに反映する」という操作はmerge
でおこなうことができます:
作業ブランチの名前をb1
、作業ブランチの変更を反映したいブランチの名前をb2
とします。
「b2
にb1
をマージする」ためには、普通
git checkout b2 # 一度b2をcheckoutして
git merge b1 # b1をマージ
としますが、なんらかの理由でcheckout
せずにb1
をb2
にマージしたいとします。
例えば、ファイルの変更を感知して自動ビルドを走らせる設定がしてある環境 (あるのか?) では、一度b2
をcheckoutした段階でb1
で追加/編集したファイルがワーキングディレクトリから消滅するので自動ビルドが走り、さらにb2
にb1
をマージした段階でも消滅したファイルが追加され自動ビルドが走ってしまいます。
これを避けるためには、直接b2
にb1
の変更を取り込もうとするのではなく、b1
にb2
の変更を取り込んでから、b2
のコミットを進めてしまえば良い:
(1) b1
にb2
の変更を取り込む:
# b1上で
git merge b2
(2) b2
をb1
へfast-forwarding
# b1上で
git fetch . b1:b2
これでb2
へcheckoutすれば、実際にはb1
にb2
をマージしたにもかかわらず、b2
にb1
をマージしたのと実質同様の操作が行えたことになります。
ポイントは、fetch
はmerge
と違い、対象元のブランチ/対象先のブランチを各々指定できることです。
ちなみに、最初の時点ですでにb2
がb1
へfast-forwarding merge可能である場合、(1)をおこなう必要はなく、いきなり(2)でOKです。