重做一个已恢复的git合并



我有一个名为dev的分支以及它的一个主题分支feature-1. 在测试之后,我想将功能-1合并到dev中。但首先,当我在开发功能-1时,dev发生了变化,所以我想合并它们:

git checkout feature-1
git merge dev

工作得很好,但是在没有意识到的情况下,我不小心删除了新文件,并取消了在dev中删除的文件。我想,"不管怎样,我以后再提交并合并。">

git add new-files
git rm old-files
git commit -m "broke merge"

但是我无法重新合并:

git merge dev
>>>>> Already up to date

但是…这些分支之间的文件有差异!如果我将功能1合并到dev中,它不会在dev之上播放那些删除提交吗?

我试着恢复合并:

git revert -m 1 *merge-hash*

但是git仍然认为其中一个是另一个的父节点。再次合并仍然失败"已更新"

在此之后,我还尝试将dev重新基于feature-1,但我仍然没有看到dev的变化,到目前为止,我迷路了。

我不关心dev是否仍然被认为是功能1的父级。我只是想在功能1上重播开发人员的提交,并解决任何冲突。我该怎么做呢?

编辑:我试图恢复我的回复从Linus的建议,我在这里读到

git revert *revert-hash*

现在我看到的所有更改dev(我认为)。从git日志中看不出提交是按什么顺序发生的。

编辑2:然后我运行git status,找到

On branch feature-1你的分支和"起源/特征-1"发生了分歧,分别有5次和3次不同的提交。(使用"git pull";将远程分支合并到您的分支中)

所以我运行git pull,解决合并冲突....我又失去了dev的更改,当然是因为我之前推了那个糟糕的合并。也许这是由于基地重组?

当这种情况发生在我身上时,很多时候最简单的解决方案是从dev创建一个新的分支,并将从特性1更改的内容git cherry-pick,一次提交一次。这样你就能得到你想要的提交,而不是试图修复一个坏的历史记录,因为它看起来很难看。

另一个解决方案是根据重新定义你想要的分支,并清理它的提交

在feature-1分支中运行rebase dev -i。然后通过将pick替换为d来删除您不想要的提交。

当您知道历史记录的问题是什么时,rebase选项更好。

当你不知道发生了什么事情时,最好使用"精挑细选",通常更耗时,但更容易。

一个中间的解决方案是重新定位,合并提交,你知道是好的,然后挑选他们到另一个干净的分支。我很少这样做。

如果你在本地使用rebase -i解决问题,git不会让你推送,因为你已经修改了历史。你可以通过强制推来解决它,所以原点匹配你的本地:git push --force-with-lease。当你重新设置-i时,需要Push force,因为你正在改变历史。