Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么合并后GIT会说;已经是最新的“;,但分支之间的差异仍然存在吗?_Git_Merge_Conflict - Fatal编程技术网

为什么合并后GIT会说;已经是最新的“;,但分支之间的差异仍然存在吗?

为什么合并后GIT会说;已经是最新的“;,但分支之间的差异仍然存在吗?,git,merge,conflict,Git,Merge,Conflict,我最初在“newfeature”分支工作,我被要求紧急修复live分支上的一个bug。我为它创建了一个名为“generalmaintenance”的分支,完成了这项工作,然后转而开发并合并了它。现在我想返回到“newfeature”分支,并合并我先前合并到其中的更改 当我切换到“newfeature”并合并到“develop”时,3个文件中出现了冲突 我在解决冲突的过程中遇到了麻烦,最终决定使用AptanaStudio 3(我的IDE)的“团队”菜单中的“恢复”命令。我希望这会让我回到合并之前,

我最初在“newfeature”分支工作,我被要求紧急修复live分支上的一个bug。我为它创建了一个名为“generalmaintenance”的分支,完成了这项工作,然后转而开发并合并了它。现在我想返回到“newfeature”分支,并合并我先前合并到其中的更改

当我切换到“newfeature”并合并到“develop”时,3个文件中出现了冲突

我在解决冲突的过程中遇到了麻烦,最终决定使用AptanaStudio 3(我的IDE)的“团队”菜单中的“恢复”命令。我希望这会让我回到合并之前,而合并似乎已经完成了

无论如何,当我再次在“develope”中合并时,它会说,
已经是最新的
,但是当比较两个分支之间的文件时,它们非常不同,并且我在另一个分支中添加的更改没有被合并


现在我如何合并这两个分支?

恢复合并与重置合并

我的猜测是你实际上已经是最新的了

问题在于,合并不会撤消,它只撤消合并带来的更改。创建合并提交时,您将合并这两个分支的提交历史记录

合并

     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
,则只会得到commit
F
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命令。这是嘘