我们正在使用 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 可以显示B
或D
. 一旦显示,它可以显示另一个 or A
,但另一个( ofB
或D
)可能是下一个,除非提交是在时间设置错误的情况下进行的,或者在另一台对正确时间有不同想法的计算机上。
最终,你会看到所有的提交——除非,也就是说,历史简化已经删除了一些,也许是整个分支的分支。(即使没有历史简化,它们的显示顺序有时也很难预测。)更糟糕的是,在默认的历史简化模式中,因为上面链接的(可能难以理解的)文档提到:
如果提交是合并,并且对一个父级是 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] 删除。
我来说两句