缺少删除文件历史记录中的行 (git)

罗加尼克

我们正在使用 git 进行源代码控制。

如果我查看特定的文件历史记录(使用git log --pretty=format:"%h %ad" --date=short <filename>),我会看到类似的内容:

HashOfCommitA 2018-01-15
HashOfCommitB 2018-01-09
HashOfCommitC 2018-01-05
<older commits>

CommitA 和 CommitB 是合并提交。

在 CommitB ( git diff HashOfCommitB <filename>)的更改中,文件中添加了两行新行。在 CommitA 的更改中,这些行不受影响,但是如果我在 CommitA 合并后检查文件内容,则在 CommitB 中添加的两个新行丢失了。

基本上,当我查看文件历史记录时,我可以在某一时刻看到添加了某些内容,但是在下一次提交之后,它丢失了,并且我没有看到在提交更改中删除了这一行。

可能是因为合并是使用旧版本的分支(没有 CommitB)进行的吗?我怎样才能找到那些行被删除的地方?

换句话说,这怎么可能?有没有什么好的方法可以防止以后出现这种情况?

周二

相关:Git; 合并后代码消失要特别注意行为不端的工具,这些工具很容易不假思索地只保留合并冲突的“一面”。作为一个非常普遍的规则,避免这个问题的一个好的、可靠的方法是在接受每个提交之前进行彻底的测试。


如果我看一下特定的文件历史记录......

这里要小心。Git不会文件历史记录; 你所看到的是一个由 Git 选择特定提交产生的​​伪造的伪历史——提交历史,而完整的提交集是存储库中实际唯一的历史——git log思想的作者将是一个很好的过滤器-向下选择。当您使用这种过滤时,git log默认情况下会启用它所谓的History Simplification,这在文档的这一部分中进行了描述(在我看来相当糟糕)我发现这可能具有误导性。

除此之外,除非您使用 ,否则--graph输出git log的排序和显示方式使得很难或有时无法判断哪些提交真正发生在哪些点。这里有一个基本问题,即以线性顺序显示基本上不是线性的内容:

       B--C
      /    \
...--A      F--G   <-- branch-tip
      \    /
       D--E

在这里,提交G显然排在最后,所以这是 Git 将首先向您展示的。CommitF是下一个(即,就在 之前G),所以 Git 会告诉你F接下来。但是,现在的Git可以告诉你两种 C E应该选哪一个?

Git 的默认设置是在提交时间之前获取它们,所以如果C发生在 之后E,Git 会C在这里显示然后可能E接下来发生了,以 Git 向后的方式(即更早),所以 Git 现在显示E; 现在 Git 可以显示BD. 一旦显示,它可以显示另一个 or A,但另一个( ofBD可能是下一个,除非提交是在时间设置错误的情况下进行的,或者在另一台对正确时间有不同想法的计算机上。

最终,你会看到所有的提交——除非,也就是说,历史简化已经删除了一些,也许是整个分支的分支。(即使没有历史简化,它们的显示顺序有时也很难预测。)更糟糕的是,在默认的历史简化模式中,因为上面链接的(可能难以理解的)文档提到:

如果提交是合并,并且对一个父级是 TREESAME,则仅关注该父级。(即使有多个 TREESAME 父母,也只关注其中一个。)否则,关注所有父母。

在您的情况下,您将获得默认模式,因此如果合并的作者选择了分支的一侧(故意不从另一侧进行更改),Git 会完全修剪另一侧。但这正是您认为应该保留的更改被删除的地方,因此git log实际上对您撒了谎!


我也会添加这个,虽然这可能只是稍微相关:

CommitA 和 CommitB 是合并提交。

(这意味着这些提交至少有两个父母,可能正好有两个父母。)

在 CommitB ( git diff HashOfCommitB <filename>)的变化中...

如果您正在以这种方式运行该命令,那么您就是在要求 Git 将存储在合并中的内容(合并结果)与当前工作树中的内容进行比较。这是第四形式git diff的的描述部分git diff文档所以这些不是存储在合并提交中的更改

但实际上,合并提交中并未存储任何实际更改以这种方式,合并提交就像任何其他提交一样:它存储一个快照,无论如何,在 Git 的“眼中”,它只是合并的正确结果(正如运行的人告诉 Git 的那样git merge,并提供正确性证明)是那个跑的人git merge提交了结果)。该合并有多个输入——通常是(两个)父级加上它们的(单个)合并基——并且您可以将最终合并快照与两个父级中的任何一个进行比较,从而找到更改,但您找到的更改与父级有关 # 1 与您发现的关于父 #2 的更改不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从所有git历史记录中删除文件

来自分类Dev

从Git历史记录中删除大文件

来自分类Dev

Git-从分支的历史记录中删除文件

来自分类Dev

从 git 历史记录中删除文件的某些内容

来自分类Dev

从 git 历史记录中永久删除文件

来自分类Dev

添加缺少的git历史记录

来自分类Dev

从Git历史记录中删除文件而不删除文件

来自分类Dev

从git历史记录中删除已删除的文件夹

来自分类Dev

从git历史记录中删除已删除的文件夹

来自分类Dev

Git:从历史记录中删除文件,这些文件的名称类似于CLI选项

来自分类Dev

从Git历史记录中删除文件夹内容(一组文件除外)

来自分类Dev

Git:从历史记录中删除文件,这些文件的名称类似于CLI选项

来自分类Dev

从git历史记录中删除未使用的资产

来自分类Dev

如何从git历史记录中完全删除提交

来自分类Dev

从git历史记录中删除提交(永远)

来自分类Dev

Git-从历史记录中删除提交

来自分类Dev

从庞大的Git存储库中删除历史记录

来自分类Dev

无法从Git历史记录中删除目录

来自分类Dev

从历史记录中删除git commit

来自分类Dev

从本地历史记录中删除git merge commit

来自分类Dev

无法使用bash脚本从git历史记录中删除文件

来自分类Dev

从git存储库中完全删除文件及其历史记录

来自分类Dev

从git历史记录中删除文件夹以减小存储库大小

来自分类Dev

如何在不提交更改的情况下从git历史记录中删除文件?

来自分类Dev

Git / Bitbucket-从整个历史记录/提交中删除文件

来自分类Dev

Git:如何在项目提交历史记录中查找已删除的文件?

来自分类Dev

忽略提交给 git 的文件并将它们从历史记录中删除

来自分类Dev

在Git中还原移动文件的历史记录

来自分类Dev

清除已删除文件的git历史记录,保留重命名的文件历史记录

Related 相关文章

  1. 1

    从所有git历史记录中删除文件

  2. 2

    从Git历史记录中删除大文件

  3. 3

    Git-从分支的历史记录中删除文件

  4. 4

    从 git 历史记录中删除文件的某些内容

  5. 5

    从 git 历史记录中永久删除文件

  6. 6

    添加缺少的git历史记录

  7. 7

    从Git历史记录中删除文件而不删除文件

  8. 8

    从git历史记录中删除已删除的文件夹

  9. 9

    从git历史记录中删除已删除的文件夹

  10. 10

    Git:从历史记录中删除文件,这些文件的名称类似于CLI选项

  11. 11

    从Git历史记录中删除文件夹内容(一组文件除外)

  12. 12

    Git:从历史记录中删除文件,这些文件的名称类似于CLI选项

  13. 13

    从git历史记录中删除未使用的资产

  14. 14

    如何从git历史记录中完全删除提交

  15. 15

    从git历史记录中删除提交(永远)

  16. 16

    Git-从历史记录中删除提交

  17. 17

    从庞大的Git存储库中删除历史记录

  18. 18

    无法从Git历史记录中删除目录

  19. 19

    从历史记录中删除git commit

  20. 20

    从本地历史记录中删除git merge commit

  21. 21

    无法使用bash脚本从git历史记录中删除文件

  22. 22

    从git存储库中完全删除文件及其历史记录

  23. 23

    从git历史记录中删除文件夹以减小存储库大小

  24. 24

    如何在不提交更改的情况下从git历史记录中删除文件?

  25. 25

    Git / Bitbucket-从整个历史记录/提交中删除文件

  26. 26

    Git:如何在项目提交历史记录中查找已删除的文件?

  27. 27

    忽略提交给 git 的文件并将它们从历史记录中删除

  28. 28

    在Git中还原移动文件的历史记录

  29. 29

    清除已删除文件的git历史记录,保留重命名的文件历史记录

热门标签

归档