【问题标题】:Git ghost commitGit 幽灵提交
【发布时间】:2014-07-08 04:10:41
【问题描述】:

我注意到一些我无法理解的提交。提交具有以下属性:

  1. 它存在于主分支中(例如git log master | grep <sha1> 返回一个事件)
  2. 内容正确(git show <sha1>表示blob不为空)
  3. 它改变了文件/with/path/xyz
  4. 运行 git log master -- file/with/path/xyz | grep <sha1> 不会返回任何事件)
  5. master HEAD 的文件/with/path/xyz 不包含来自提交的更改

基本上提交存在于分支中,但不会反映在文件内容中。

我不是提交作者。有一个合并链将提交带入 master,我也不是进行合并的人,例如我从我们的origin 中提取了这个master

什么会使我们的树处于这种状态,我该如何解决这个问题?有没有办法找到所有这些提交?不止一个,但我不知道有多少。

【问题讨论】:

    标签: git version-control commit


    【解决方案1】:

    第 4 项和第 5 项绑定在一起。正如git log documentation 所说:

    [--] <path>...

    仅显示足以解释文件如何提交的提交 匹配指定的路径来了。查看历史简化 下面是详细信息和其他简化模式。

    如果你给git log --full-history 选项你应该看到提交重新出现。

    什么会使我们的树达到这种状态...

    通常是不正确的合并。

    可以告诉 Merge 在发生冲突时忽略某些更改(例如,-X ours,不要与 -s ours 混淆)。

    在任何合并中,在您实际提交合并结果之前,您可以更改树。 (在合并失败后,当您必须,或者如果您使用--no-commit 选项时,这当然会容易得多。)

    在任何情况下,合并生成的树是您设置的任何树,或者 - 如果您不更改任何内容 - git 根据传递给合并命令的选项来猜测正确的结果是什么。

    我该如何解决这个问题?

    它可能没有被破坏(尽管你所问的事实表明它是)。一般来说,当合并两个修订版时,git 的自动合并通常会做正确的事,但为了防止将来出现任何错误的结果,执行合并的人必须检查。

    有没有办法找到所有此类提交?

    通读git log 命令中的History Simplification 部分。听起来您有兴趣查看与特定文件相关的哪些提交是或不是“TREESAME”(此处称为“TREESAME”)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2017-08-08
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多