當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
序列,然後在rep_B上運行git pull
。
git pull
命令意味着:運行git fetch
,然後運行第二個Git命令。我們可能需要知道第二個命令是什麼,因爲它可能是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
運行git rebase
(或等價地,跑了git pull --rebase
)。如果您做,這裏是你在rep_B得到什麼:
rep_B: F--G--2--4 <-- origin/master
\
1'--3' <-- master
但是,這些將在正常顯示(即反向)順序3'
(這是由原始3
的副本底墊中),然後1'
,然後4
,然後2
。所以可能是不是的情況。如果添加了合併,而不是,這是你在rep_B得到什麼:
rep_B: F--G-----2-----4--M <-- master
\ /
`1-----3---’ <-- origin/master
在任何情況下,你再從rep_B推回服務器(也許取回併合並有或重訂,即git pull
,回到rep_A
以及)。
如果您現在使用git log master
或同等代碼顯示這些提交,Git將以合併提交M
開頭,因爲它現在只有一個提交:即合併提交本身。但M
有兩個父母,所以接下來,Git將4
和3
放入提交顯示列表中。
現在會發生什麼情況取決於您告訴git log
使用哪種順序。默認情況下,它將選擇要顯示的日期最高的提交。這將是承諾4
;它會顯示,並將其父母,提交2
,列入清單。然後它會在列表中選擇具有最高日期的提交,這將是提交3
。它會表明,並把3
的父母1
列入清單。然後它會選擇最高日期的提交,這將是2
,依此類推。
另一方面,如果你給它--topo-order
標誌,它會選擇合併的兩個父母之一,選擇4
。然後,它會確保它顯示所有的4
回到岔路口的地步,父母中至少G
顯示提交3
之前,所以你會看到4
,然後2
,然後3
,然後1
,然後G
,然後F
, 等等。
根據您觀察到的輸出,看起來您使用的任何觀看者都在做最後一個序列。但是我在這裏做了很多假設(比如合併vs rebase)。
我做的例子是將存儲庫克隆到本地計算機上的2個不同文件夾中。不是2個本地克隆上的分支機構。 – lddmonster
嗯......好的,你應該提到這一點。但爲什麼會有所作爲呢?如果一個回購在遠程「主」背後,您仍然需要在推之前拉回。 –
沒有分支,兩個folders.repositories在主分支.. – lddmonster