Git - 主提交是否按提交时间/日期对齐?

时间:2017-06-14 08:20:36

标签: git

由于我们遇到的问题,我已完成以下流程:

我有2个本地存储库克隆 - > rep_A,rep_B(两者都在主人身上)

  1. rep_A:commit#1
  2. rep_B:commit#3
  3. rep_A:commit#2
  4. rep_B:commit#4
  5. rep_A:推送掌握
  6. rep_B:git pull
  7. rep_B:推送到掌握
  8. (所有提交都是连续完成的,1是前4个是最后一次)

    我希望主人看起来像这样:

    • commit 4
    • commit 3
    • commit 2
    • commit 1

    虽然大师展示了以下内容:

    • commit 4
    • commit 2
    • commit 3
    • commit 1

    有人可以帮忙解释一下这种行为吗?

1 个答案:

答案 0 :(得分:1)

git log 两个提交时,可以显示"同时",它必须选择一个先显示。也就是说,这里的基本问题是:实际时间戳是什么?您的查看器如何线性化非线性历史记录?

作为一个稍微不同(可能更明显)的例子,假设您运行:

git log br1 br2

其中br1br2是两个不同的分支名称,具有两个不同的提示提交。 Git首先应该提交哪个提交?一般来说,Git的答案(对于git loggit rev-list)是:使用具有最新提交日期的答案。有一些标志可以改变这种情况:--author-date-order--date-order--topo-order--graph暗示--topo-ordermax630 noted in a comment)。

提交者日期作者日期分开。每次提交都有两个时间戳,一个用于最初写入提交时,另一个用于实际提交时。这两个通常是相同的,但您可以通过各种方式将它们分开,包括通过重新定位(复制的提交在保留原始作者日期的同时获取新的提交者日期)或通过向git format-patch发送补丁并应用它们与git am

其他事情 - 除了git log之外的其他观众 - 有自己的策略来处理这个问题,其中的提交首先在有选择时显示。 (当处理人们提交的多台计算机时,还存在一个潜在的问题,即每台计算机上的挂钟时钟可能会出现严重错误。幸运的是,您只使用一台计算机就可以解决这个问题。可能没有随机将其日期重置为上周,然后是明年,然后又回到今天。即使您的计算机时钟错误,也可能合理地 错了。)

现在,考虑到上述情况,让我们来看看您提交的提交以及生成的提交。我们从三个相同的Git存储库开始:一个在一些中央服务器上(可能是GitHub),两个克隆为rep_A和rep_B。

我们将更新的(按提交日期)提交到右侧,连同它们的链接(记住,每次提交"记住"其父级)。

server: ...--F--G   <-- master

rep_A:  ...--F--G   <-- master

rep_B:  ...--F--G   <-- master

现在你添加了四个提交,但是在交替的存储库中:

rep_A:  ...--F--G--1-----3   <-- master

rep_B:  ...--F--G-----2-----4   <-- master

(注意服务器还没有这些。)接下来,你从rep_A到服务器做了git push,所以现在服务器有F--G--1--3序列,然后你运行了{{1在rep_B上。

git pull命令意味着:运行git pull,然后运行第二个Git命令。我们可能需要知道第二个命令是什么,因为它可能是{{ 1}},或者它可能是git fetch ...而git merge 会更改提交者日期

以下是git rebase步骤后的内容:

git rebase

现在我们需要知道您是否将git fetch配置为运行server: F--G--1-----3 <-- master rep_B: F--G-----2-----4 <-- master \ `1-----3 <-- origin/master (或等效地,运行git pull)。如果你做了,这是你在rep_B中得到的:

git rebase

但是这些将以正常(即反向)顺序显示为git pull --rebase(由原始rep_B: F--G--2--4 <-- origin/master \ 1'--3' <-- master 组成的副本基础),然后是3',然后是3,然后是1'。所以可能的情况。如果您添加了合并,则这是您在rep_B中获得的:

4

在任何情况下,您都可以从rep_B推送回服务器(也可以将fetch和merge-or-rebase,即2重新推送回rep_B: F--G-----2-----4--M <-- master \ / `1-----3---’ <-- origin/master

如果您现在使用git pull或等效的方式显示这些提交,Git将从合并提交rep_A开始,因为它只有一个提交现在显示:那是&#39}合并提交本身。但是git log master两个父母,所以接下来,Git将MM放入要提交的提交列表中。

现在发生的事情取决于您告诉4使用的顺序。默认情况下,它将选择具有最高日期的提交。这将是提交3;它会显示并将其父级提交git log放入列表中。然后它将选择具有最高日期的列表中的提交,该提交将是提交4。它会显示,并将2的父3放入列表中。然后它会选择具有最高日期的提交,即3,依此类推。

另一方面,如果你给它1标志,它将像以前一样选择合并的两个父母之一,选择2。然后,它会确保在显示提交--topo-order之前将{em>所有4的父项显示回4 的分支点,所以你会见G,然后3,然后4,然后2,然后3,然后1,依此类推。

根据您观察到的输出,看起来您正在使用的任何查看器都在执行此最后一个序列。但是我在这里做了很多假设(比如合并vs rebase)。