1

比較的古いブランチをマスターにマージしましたが、マージの結果はひどい混乱でした。何らかの理由で git merge を実行すると、別のブランチで更新されて master にマージされた古いコードが自動的に取得されました。

この古いブランチには、私が望む変更がいくつかあるだけなので、次のようなことをしています

git difftool oldbranch 

また、視覚的な差分ツールを使用して変更を手動でコピーする方が、自動マージによって発生した混乱をクリーンアップするよりもはるかに簡単です。

そのアプローチの問題は、ブランチがマージされたことを示していないため、履歴/ネットワーク/ツリーが台無しになることです。

問題は、自動マージに頼らずに (できればグラフィカルな差分/マージ ツールを使用して) git のブランチを手動でマージするにはどうすればよいかということです。

4

2 に答える 2

2

この古いブランチには、私が望む変更がいくつかあるだけなので、次のようなことをしています

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選択的にリベースします。Lold

# 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。これにより、一連のコミットと単一のコミットの両方を選択できるため、よりきめ細かい制御が可能になります。

于 2013-07-13T17:30:53.840 に答える