2012-02-24 176 views
3

我有一个分支,我已经合并到主。Git合并跳过提交

在树枝上,git log file显示2月9日 在主提交,git log file显示提交2月9日 在主,git log不显示2月9日提交

的文件没有反映2月9日发生的更改,但git log显示提交。它似乎在提交合并,但实际上并没有将其应用于该文件。什么可能导致这个?

编辑:我想我找出了发生了什么,并在下面回答。为清晰起见,我清理了原始问题。我原来写的,我认为这是一个与Git的bug,但我不认为这种情况了。但是,如果git log file确实向文件显示了这些提交,那将是很好的。感谢所有帮助过的人,特别是Borealid。

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

+0

合并使得合并的分支父。所以它不能跳过提交。不过我相信'git log' does not * walk *按时间顺序修订。 – 2012-02-24 15:40:12

+0

Jan:2月9日提交没有在git日志中的任何地方列出。 – Dave 2012-02-24 15:41:31

+0

@Jan Hudec:更正,它在“git log”中列出,但不包含在master上的“git log certainfile”。请看下面的答案我的评论。 – Dave 2012-02-24 15:54:12

回答

4

来自Dave引用:

我重新创建一个类似的情况有以下步骤:

  • 创建一个新的Git仓库
  • 创建一个文件一行,将其添加到git和commit(commit#1)
  • 创建并切换到分支
  • 更改分支中的文件commit(commit#2)
  • 切换到主,更改文件所以会有冲突,并承诺(承诺#3)
  • 合并分支到主,该文件将在冲突
  • 通过采取主所有的变化解决冲突,并拒绝分支中的所有更改。基本上,文件 看起来就像它在master中一样。
  • 添加文件并提交更改(提交#4)

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

的共振git log -- file只显示提交#1和#3是因为如何git-log(默认模式)走过提交链;当发现合并提交并且存在父提交以使得所选文件在合并之后与父提交时具有相同内容时,git-log将跟随(一个)这样的父代并拒绝所有其他父代。

在这种情况下,因为合并冲突是通过仅保留在master中进行的更改来解决的(文件在提交#1和提交#4中具有相同的内容),git-log将只会遍历master分支。

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

+0

感谢您的回复。既然你的回答在我的答案中没有上下文没有意义(它在我的答案中引用了提交数字),我并没有将其标记为接受。如果您复制并粘贴我的答案(并ping我),我一定会将其标记为这样。 – Dave 2012-02-27 22:34:22

+0

@Dave,我将你对问题的解释添加到了我的答案 – joran 2012-02-28 07:17:51

+0

@Dave:你应该在你的问题中提出你的答案,因为这不是一个真正的答案。 – naught101 2012-06-22 13:22:34

0

如果文件内容在更改前后的内容相同,则该文件未被更改修改。

这个说法是直观的,因为git的对象模型,它也是在版本库中。

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

显然,git merge没有坏 - 你的期望只是与它做的没有对齐。

+0

内容不相同。我们注意到我们的应用程序中存在一个错误,因为包含更改的提交没有在合并中正确传输。 – Dave 2012-02-24 15:37:57

+0

@Dave你是如何进行合并的? – Borealid 2012-02-24 15:39:30

+0

来自master:git merge branchname – Dave 2012-02-24 15:40:48

0

我重新用下面的步骤类似的情况:

  1. 创建一个新的Git仓库
  2. 一个行创建一个文件,把它添加到Git和承诺(承诺#1)
  3. 创建并切换到分支
  4. 更改文件中的分支,提交(提交#2)
  5. 切换到主,更改文件所以会有冲突,提交(提交#3)
  6. 将分支合并到主文件中,文件将冲突
  7. 通过获取主文件中的所有更改来解决冲突,并拒绝分支中的所有更改。基本上,文件 看起来就像它在master中一样。
  8. 添加文件并提交更改(提交#4)

现在git log将显示所有四次提交,但git log file只会显示提交#1和#3。