【发布时间】:2020-05-20 13:33:16
【问题描述】:
我想用另一个(即 master)覆盖开发分支中的所有内容,但我不想错过 dev 分支上较旧的提交。
这就是我想要的:
我尝试了merge with ours strategy 和doing an hard reset,但开发分支不断丢失旧的提交。
我想要获得的是蓝色和红色之间差异为零的提交,以及在将蓝色与第一个黑色进行差异时丢弃的代码。
只是为了分享迄今为止尝试过的解决方案的概述。 通过这样做:
git checkout master
git merge -s ours dev
git checkout dev
git merge master
我得到了这个(开发者从主人那里得到了所有的历史)
这样做
git checkout dev
git reset --hard master
我得到了这个(如果我推动开发,我将失去所有的黑色提交):
如果我这样做:
git checkout dev
git merge $(git commit-tree -p dev -m "Align master > dev" master^{tree})
我得到了这个(几乎完美,但我很难回忆起我做到这一点的确切时刻):
【问题讨论】:
-
只是好奇为什么以这种方式将过去的历史放在开发分支上?为什么不变基?
-
他想保留旧的历史。 rebase 会丢弃它。
-
Rebase 在这个过程中产生了很多冲突(并且有很多提交,我有很多冲突。这根本不切实际)。我认为不会因为 dev 分支中所有内容的完全蒙眼覆盖而产生任何冲突。
-
如果您使用我们的策略 (
merge -s ours),则不会丢失任何历史记录和提交。但是,所有更改都将“丢失”(即被覆盖)。但这正是您要问的。另见:How do I 'overwrite', rather than 'merge', a branch on another branch in Git? -
@knittl 我尝试了 -s ours 和 -X theirs 策略(分别在目标和源分支上签出),但之后我仍然在开发和掌握之间存在差异(即,我有一些从未部署的开发数据,我想重置,但由于合并是一个非破坏性过程,这些东西继续存在于开发中)。
标签: git