破坏合并提交

时间:2016-02-16 17:39:04

标签: git merge

我发现我昨天的变化在git中丢失了。我调查过并发现了一个由我们的初级开发人员提交的两个错误提交:

Screenshot

所选的提交消息显示合并但不包含对合并提交的任何引用。下一次提交实际上是在说#34;修复失败的测试"但实际上是合并提交,其中有0个已更改,添加或删除的文件。

在此之后,此分支已合并为 develop 并已合并到多个功能分支。

所以我知道在合并之前提交这个分支。我知道对合并的开发做出承诺。

如何在不丢失更改的情况下修复历史记录?我想在合并之前开始提交 develop ,并选择所有下一个更改,避免这两个提交。那是大约30-40次提交。有更好的策略吗?

2 个答案:

答案 0 :(得分:1)

所以我不确定你的开发者是如何设法添加非合并的;就好像他通过了--squashgit merge,虽然这很难做到。

无论如何,通常我会尝试恢复合并,但你想要做的是恢复相对于第二个父级的“合并”,并且在这个非合并中没有第二个父级。恢复真正的合并将没有任何效果,因为它没有更改任何文件。因此,让我们尝试对合并的内容进行“手动还原”。假设假合并的散列是abc,真实(但是空的)合并的散列是xyz。如果我们运行以下内容:

git diff -3 abc xyz^2 | git apply

然后git会(希望)撤消一些伤害。此命令执行的操作是采取必要的步骤,在伪合并之前将伪合并的状态置于开发状态,并将这些步骤应用于工作目录。如果它干净利用,您可以添加/提交更改。如果补丁不能干净地应用,-3选项会告诉apply尝试3路合并;您可能想要使用和不使用该选项进行尝试。

当然,从那时起可能会出现如此多的变化/合并,这无济于事。但它值得一试!

答案 1 :(得分:0)

  

所选提交消息显示合并但不包含对已合并提交的任何引用

这是一个名为“merge commit”的特殊提交

在此处阅读所有相关信息:https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

  

Git不是直接向前移动分支指针,而是创建一个由此三向合并产生的新快照,并自动创建指向它的新提交。这被称为合并提交,并且特殊之处在于它具有多个父级。

enter image description here

当您选择使用no-ff(无快进)配置时,会创建合并提交。

--no-ff标志会阻止git merge执行快进,如果它检测到您当前的HEAD是您正在尝试的提交的祖先合并。

快进是指git只是将您的分支指针移动到指向传入提交的位置,而不是构建合并提交。这种情况通常在执行git pull而没有任何本地更改时发生。

要了解ffno-ff之间的差异,请查看以下内容: enter image description here