为什么合并后GIT会说;已经是最新的“;,但分支之间的差异仍然存在吗?
我最初在“newfeature”分支工作,我被要求紧急修复live分支上的一个bug。我为它创建了一个名为“generalmaintenance”的分支,完成了这项工作,然后转而开发并合并了它。现在我想返回到“newfeature”分支,并合并我先前合并到其中的更改 当我切换到“newfeature”并合并到“develop”时,3个文件中出现了冲突 我在解决冲突的过程中遇到了麻烦,最终决定使用AptanaStudio 3(我的IDE)的“团队”菜单中的“恢复”命令。我希望这会让我回到合并之前,而合并似乎已经完成了 无论如何,当我再次在“develope”中合并时,它会说,为什么合并后GIT会说;已经是最新的“;,但分支之间的差异仍然存在吗?,git,merge,conflict,Git,Merge,Conflict,我最初在“newfeature”分支工作,我被要求紧急修复live分支上的一个bug。我为它创建了一个名为“generalmaintenance”的分支,完成了这项工作,然后转而开发并合并了它。现在我想返回到“newfeature”分支,并合并我先前合并到其中的更改 当我切换到“newfeature”并合并到“develop”时,3个文件中出现了冲突 我在解决冲突的过程中遇到了麻烦,最终决定使用AptanaStudio 3(我的IDE)的“团队”菜单中的“恢复”命令。我希望这会让我回到合并之前,
已经是最新的
,但是当比较两个分支之间的文件时,它们非常不同,并且我在另一个分支中添加的更改没有被合并
现在我如何合并这两个分支?恢复合并与重置合并 我的猜测是你实际上已经是最新的了 问题在于,合并不会撤消,它只撤消合并带来的更改。创建合并提交时,您将合并这两个分支的提交历史记录 合并
develop
|
A---B---C
\ \
E---F---M
|
newfeature
在上述情况下,develope
合并到newfeature
,创建M
提交。如果运行git log newfeature
,您将看到来自两个分支的所有提交,但是从newfeature
分支的角度来看,所有这些更改都是由M
提交执行的
恢复
develop
|
A---B---C
\ \
E---F---M
|
newfeature
git revert
命令不会删除任何提交,而是创建一个新的提交,以撤消提交包含的更改。例如,如果您有一个包含此差异的提交
-This is the old sentence.
+This is the new sentence.
然后将其还原,revert命令将创建一个新的commit,它只是执行相反的diff,它只是翻转符号
-This is the new sentence.
+This is the old sentence.
这对于消除其他开发人员已经拥有的提交所造成的损害非常有用。它推动历史前进,而不是改变历史
还原合并
但是,在非快进合并的上下文中,它可能会产生不期望的效果
develop
|
A---B---C
\ \
E---F---M---W
|
newfeature
假设W是一个反向提交,您可以看到运行git log newfeature
时如何仍然包括来自开发分支的所有提交。因此,来自develope
的其他合并将不起作用,因为它没有看到分支中缺少的任何内容
使用而不是还原。
将来,您可能需要考虑使用<代码> Git Realth-Health(其中<代码> <代码>是合并的提交哈希),如果合并没有与其他开发人员共享,则撤销合并。在上面的示例中,在创建了merge commit
M
之后,运行命令git reset--hard F
将产生以下结果
develop
|
A---B---C
\ \
E---F---M
|
newfeature
正如您所看到的,这种技术并没有像某些人认为的那样消除提交,它只是将您的分支移回您选择的提交。现在,如果运行git log newfeature
,则只会得到commitF
、E
和A
。现在,合并实际上已从分支历史记录中消失,因此以后在develope
中尝试重新合并不会导致任何问题
这种方法并非没有并发症。意识到您现在正在修改历史记录,因此如果在进行M
合并后,newfeature
分支被推送到远程分支,那么git会认为您已经过时,并告诉您需要运行git pull
。如果只是您在远程分支上工作,那么请随意强制推送
-git push-f
。这将具有与重置相同的效果,但会对远程分支产生影响
如果这个分支被多个开发人员使用,他们现在已经从中退出了,那么这是一个坏主意。这正是git revert有用的原因,因为它在不更改实际历史的情况下撤消更改
对于未共享的提交,使用历史记录重置实际上是唯一的选项
解决方案-恢复恢复。
如果合并提交已经共享,那么最好的方法可能是在该合并上使用git revert
。但是,正如我们前面所说的,您不能简单地将分支合并回,并期望来自该分支的所有更改重新出现。答案是恢复revert commit
假设您在尊重了newfeature
中的合并之后,在develope
分支上做了一些工作。你的历史应该是这样的
develop
|
A---B---C---D
\ \
E---F---M---W
|
newfeature
如果您现在将develope
合并到newfeature
中,您只会得到D
,因为它是newfeature
分支历史记录中尚未包含的唯一提交。您还需要做的是恢复W
commit-git revert W
应该执行以下操作git merge develope
develop
|
A---B---C-----------D
\ \ \
E---F---M---W---M---G
|
newfeature
这将恢复原始合并提交所做的所有更改,这些更改实际上是由C
和B
进行的,但在W
中被还原,然后通过新的合并提交G
将D
引入,我建议在最近对develope
所做的更改中,在合并之前还原,我怀疑按这个顺序做会降低引发冲突的可能性
TL;DR
还原将创建“还原提交”。撤消还原时,需要对第一次还原时创建的revert commit运行revert命令。这是嘘