git 覆盖分支但保留历史记录

fre*_*lop 5 git

我想用另一个开发分支(即 master)覆盖开发分支中的所有内容,但我不想错过开发分支上较旧的提交。

这就是我要的:

我想要的是

我尝试与我们的策略合并进行硬重置,但开发分支不断丢失旧的提交。

我想要获得的是蓝色和红色之间差异为零的提交,以及在蓝色与第一个黑色差异时删除的代码。


只是分享迄今为止尝试过的解决方案的概述。通过做这个:

git checkout master
git merge -s ours dev
git checkout dev
git merge master
Run Code Online (Sandbox Code Playgroud)

我得到了这个(开发人员从主人那里获取了所有历史记录)

合并

通过做这个

git checkout dev
git reset --hard master
Run Code Online (Sandbox Code Playgroud)

我得到了这个(如果我推动开发,我将丢失所有黑色提交):

重置

如果我这样做:

git checkout dev
git merge $(git commit-tree -p dev -m "Align master > dev" master^{tree})
Run Code Online (Sandbox Code Playgroud)

我得到了这个(几乎完美,但我很难回忆起我完成这个技巧的确切时刻):

在此输入图像描述

Mar*_*k R 5

这可以这样进行:

git checkout -f develop # go to develop branch
git merge --no-commit master
git checkout master -- . # this checkouts code from master and doesn't switch branch
# you are still in merge process on branch develop
git commit
Run Code Online (Sandbox Code Playgroud)

请注意,拖尾-- .会改变 的行为git checkout