由于我们遇到的问题,我已完成以下流程:
我有2个本地存储库克隆 - > rep_A,rep_B(两者都在主人身上)
(所有提交都是连续完成的,1是前4个是最后一次)
我希望主人看起来像这样:
虽然大师展示了以下内容:
有人可以帮忙解释一下这种行为吗?
答案 0 :(得分:1)
当git log
两个提交时,可以显示"同时",它必须选择一个先显示。也就是说,这里的基本问题是:实际时间戳是什么?和您的查看器如何线性化非线性历史记录?
作为一个稍微不同(可能更明显)的例子,假设您运行:
git log br1 br2
其中br1
和br2
是两个不同的分支名称,具有两个不同的提示提交。 Git首先应该提交哪个提交?一般来说,Git的答案(对于git log
和git rev-list
)是:使用具有最新提交日期的答案。有一些标志可以改变这种情况:--author-date-order
,--date-order
和--topo-order
(--graph
暗示--topo-order
为max630 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将M
和M
放入要提交的提交列表中。
现在发生的事情取决于您告诉4
使用的顺序。默认情况下,它将选择具有最高日期的提交。这将是提交3
;它会显示并将其父级提交git log
放入列表中。然后它将选择具有最高日期的列表中的提交,该提交将是提交4
。它会显示,并将2
的父3
放入列表中。然后它会选择具有最高日期的提交,即3
,依此类推。
另一方面,如果你给它1
标志,它将像以前一样选择合并的两个父母之一,选择2
。然后,它会确保在显示提交--topo-order
之前将{em>所有4
的父项显示回4
的分支点,所以你会见G
,然后3
,然后4
,然后2
,然后3
,然后1
,依此类推。
根据您观察到的输出,看起来您正在使用的任何查看器都在执行此最后一个序列。但是我在这里做了很多假设(比如合并vs rebase)。