Git Merge跳过提交

时间:2012-02-24 15:32:05

标签: git

我有一个分支机构,我已合并为主机。

在分支上,git log file在2月9日显示提交 在主人,git log file 在2月9日显示提交 在master上,git log确实显示了2月9日的提交

该文件未反映2月9日所做的更改,但git log显示了提交。它似乎在提交中合并了git,但实际上并没有将它应用于该文件。可能导致这种情况的原因是什么?

编辑:我想我弄清楚发生了什么并在下面回答。为清楚起见,我清理了原来的问题。我原本写的我认为这是git的一个bug,但我认为不再是这种情况了。但是,如果git log file确实向文件显示了这些提交,那将会很不错。感谢所有帮助过的人,尤其是Borealid。

早先编辑:我真的相信这是git的一个bug。这个文件从未被重命名,但是git认为它是,这就是为什么没有应用提交。我创建了另一个分支,执行了合并,但没有发生这个问题。我可以重现发生这种情况的分支上的错误。我很乐意帮助任何git开发人员调试我的问题,但我无法向您发送我的存储库。

3 个答案:

答案 0 :(得分:4)

引自戴夫:

  

我通过以下步骤重新创建了类似的情况:

     
      
  • 创建新的git存储库
  •   
  • 创建一行文件,将其添加到git并提交(commit#1)
  •   
  • 创建并切换到分支
  •   
  • 更改分支中的文件,commit(commit#2)
  •   
  • 切换到master,更改文件以便存在冲突并提交(commit#3)
  •   
  • 将分支合并为主文件,文件将发生冲突
  •   
  • 通过获取master中的所有更改并拒绝分支中的所有更改来解决冲突。基本上,文件应该   看起来就像在大师那样。
  •   
  • 添加文件并提交更改(提交#4)
  •   
     

现在git log将显示所有四个提交,但git log文件只显示提交#1和#3

git log -- file仅显示提交#1和#3的共鸣是因为git-log(默认模式)如何遍历提交链;当找到合并提交并且存在父提交使得所选文件在合并之后具有与父提交中相同的内容时,git-log将遵循(一)这样的父提交并拒绝所有其他父提交。

在这种情况下,由于仅通过保持在master中进行的更改来解决合并冲突(该文件在commit#1和commit#4中具有相同的内容),git-log将仅走主分支。

更多细节:http://schacon.github.com/git/git-log.html(“历史简化”部分)

答案 1 :(得分:0)

如果更改前后文件的内容相同,则更改不会修改该文件。

这句话直观地说是正确的,并且由于git的对象模型,它在存储库中也是如此。

您可以检查git log并找到您认为修改过文件的修订版;如果它在主历史记录中存在,那么您正确地进行了合并,但该变更集对该文件没有影响(因此不包括在git log -- path/to/file中)。

显然,git merge并没有被打破 - 你的期望与它所做的不相符。

答案 2 :(得分:0)

我通过以下步骤重新创建了类似的情况:

  1. 创建新的git存储库
  2. 创建一行文件,将其添加到git并提交(commit#1)
  3. 创建并切换到分支
  4. 更改分支中的文件,commit(commit#2)
  5. 切换到master,更改文件以便存在冲突并提交(commit#3)
  6. 将分支合并为主文件,文件将发生冲突
  7. 通过在master中进行所有更改来解决冲突 拒绝分支中的所有更改。基本上,文件应该 看起来就像在大师那样。
  8. 添加文件并提交更改(提交#4)
  9. 现在git log将显示所有四个提交,但git log file只会显示提交#1和#3。