2013-10-15 33 views
0

我注意到,git合并似乎并没有做一个稳定的排序,当它进行合并。或者它可能是完全不同的东西。我真的不知道哪里出了问题。git合并更改日志输出(不稳定的排序)

如果你试试这个小测试用例一个很好的10-20倍,直到它说:“片状”:

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 

这真令人难以置信。我始终可以让这两个第一次提交在测试中互换,但我宁愿不要。我宁愿去除薄片。任何人知道是什么原因造成的

回答

0

TLDR:这是一种容易触发的竞态条件,因为git log以1秒的分辨率按时排序。一个可能的解决办法是宁愿用:

git log --topo-order 

所以寻找到这之后。 Git根据日期/时间订单提交。这很明显。存储的日期是从epoch开始的秒数,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就行了。至少在这个小测试中表现相同。