git merge更改日志输出(不稳定排序)

时间:2013-10-15 17:06:56

标签: git

我注意到git merge在进行合并时似乎没有做稳定的排序。或者它可能是完全不同的东西。我真的不知道出了什么问题。

如果你试试这个小型试验箱10-20次,直到它说“FLAKY”:

mkdir a; cd a; output=$(git init .; touch 0; git add 0 ; git commit -m0; git checkout -b b1; touch 1; git add 1; git commit -m1; git branch b2 master; git checkout b2; touch 2; git add 2; git commit -m2; git checkout master; git merge b1; git merge b2 -m"merge";) test=$(git log --format=%s|xargs echo); if [[ "merge 2 1 0" == "$test" ]]; then echo "FLAKY " $test; else cd ..; rm -rf a; fi; 2> /dev/null

(它是一个oneliner,你可以在bash提示符下运行它)

通常,您在末尾回显的日志将如下所示:

merge 1 2 0

但过了一会儿,你可能会得到1和2来切换位置:

merge 2 1 0

令人难以置信的真气。我总是可以让这两个第一次提交在测试中可以互换,但我宁愿不这样做。我宁愿去除赘肉。有人知道是什么原因导致的吗?

1 个答案:

答案 0 :(得分:0)

TLDR :这是一种易于触发的竞争条件,因为git log按1秒的分辨率按时排序。可能的解决方法是使用:

git log --topo-order

所以在调查之后。 Git订单根据日期/时间提交。这很明显。存储的日期是自纪元,unix时间戳以来的秒数,因此分辨率非常糟糕。当所有提交具有相同的时间戳(通常情况)时,它将选择以某些(稳定!)顺序“合并1 2 0”对它们进行排序。

但是,有时候,当时间发生变化时,最后2个正好 ,因此它会有一个更高的时间戳,因此总是位于1之上。

所以这是常见的情况:

Merge: a217d34 1f853fc
Date:   1381855683 +0200
    merge

commit a217d34c3b7694e4a5f963ead624b4d3e4a87adf
Date:   1381855683 +0200
    1

commit 1f853fc9acf669929ccab71d341784a525a5360e
Date:   1381855683 +0200
    2

commit 490507918504597c90300889aaf3cb5cbb5dd82c
Date:   1381855683 +0200
    0

这是一个特殊的(片状)案例。至少在这个测试中,我想它在我的真实测试中可能会有所不同,只有当他们突然有相同的时间才会出现问题。

Merge: a2f0bba f3b9f1e
Date:   1381855747 +0200
    merge

commit f3b9f1eeeef0c8c77aa8505224198951dc6d6904
Date:   1381855747 +0200
    2

commit a2f0bba815bb2a1e8e611f755397350c732b5e6b
Date:   1381855746 +0200
    1

commit ab28f3063df4d51c79ee0fbdec0ae77f870e8e3b
Date:   1381855746 +0200
    0

我还没有设计出我要遵循的计划来解决这个问题,但似乎git log --topo-order会这样做。它至少在这个小测试中表现相同。