この古いブランチには、私が望む変更がいくつかあるだけなので、次のようなことをしています
git difftool oldbranch
また、視覚的な差分ツールを使用して変更を手動でコピーする方が、自動マージによって発生した混乱をクリーンアップするよりもはるかに簡単です。
このブランチは古く、必要な変更がいくつかあるだけなので、代わりにできることは、変更を にリベースしてからmaster
、更新されたブランチをそのようにマージすることです。
ただし、古いブランチが何らかの形で望ましくない古い変更ももたらしていると述べたので、リベースするものをもう少し選択しましょう。
実際に必要なすべての変更が、古いブランチ ( branch と呼びます) の先端にあるアトミック コミットにあると仮定しましょうold
。したがって、 の履歴は次のold
ようになります。
I J master
o---------o----------o
\
\
o K
\
\
o L
\
\
o old
L
コミットをold
にマージしたいがmaster
、どういうわけかJ
、既に修正されてmaster
いるが、実行時にまだマージされている悪いコミットであるとしましょう
# With master checked out
git merge old
K
に追加したくない「悪い」コミットでもあると仮定しましょうmaster
。
次に、 の現在のコミットから新しいブランチを作成し、新しいブランチにコミットをmaster
選択的にリベースします。L
old
# Make a new branch off current commit of master
git branch new-branch master
# Now rebase L through old onto new-branch
git rebase --onto new-branch K old
これが Git に伝えていることは、 と の間のコミットを取得し、K
それらold
を異なる shas で の先端にコピーすることです。これは、範囲の排他的な終わりであるためnew-branch
除外K
します (数行に関しては、 に類似しています(K, old]
)。
したがって、ブランチは次のようになります。
I J master
o---------o----------o
\ \
\ \
o K o L`
\ \
\ \
o L o new-branch (same commit as where old branch was at)
\
\
o old
これで、早送りマージまたは非早送りマージのいずれかを使用して new-branch にマージできます。
# From master branch, use fast-forward merge
git merge new-branch
# Or force a merge-commit with non-fast-forward
git merge --no-ff new-branch
new-branch
リベースを使用する代わりに、代わりに使用して追加するコミットを非常に選択的にすることもできますcherry-pick
。これにより、一連のコミットと単一のコミットの両方を選択できるため、よりきめ細かい制御が可能になります。