2017-06-14 58 views
0

Iv'e做了以下流程由於我們遇到了一個問題:Git - 主提交符合提交時間/日期嗎?

我有2點本地倉庫的克隆 - > rep_A,rep_B(二者均位於主)

  1. rep_A:提交# 1
  2. rep_B:提交#3
  3. rep_A:提交#2
  4. rep_B:提交#4
  5. rep_A:推掌握
  6. rep_B:混帳拉
  7. rep_B:推掌握

(所有提交都做了時間上連續,1是第一個4是最後一個)

我希望師傅看起來這樣的:

  • 提交4
  • 提交3
  • 提交2
  • 提交1

雖然主結果如下:

  • 提交4
  • 承諾2
  • 提交3
  • 承諾1

有人可以幫忙解釋一下這種行爲?

+0

我做的例子是將存儲庫克隆到本地計算機上的2個不同文件夾中。不是2個本地克隆上的分支機構。 – lddmonster

+0

嗯......好的,你應該提到這一點。但爲什麼會有所作爲呢?如果一個回購在遠程「主」背後,您仍然需要在推之前拉回。 –

+0

沒有分支,兩個folders.repositories在主分支.. – lddmonster

回答

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序列,然後在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將43放入提交顯示列表中。

現在會發生什麼情況取決於您告訴git log使用哪種順序。默認情況下,它將選擇要顯示的日期最高的提交。這將是承諾4;它會顯示,並將其父母,提交2,列入清單。然後它會在列表中選擇具有最高日期的提交,這將是提交3。它會表明,並把3的父母1列入清單。然後它會選擇最高日期的提交,這將是2,依此類推。

另一方面,如果你給它--topo-order標誌,它會選擇合併的兩個父母之一,選擇4。然後,它會確保它顯示所有的4回到岔路口的地步,父母中至少G顯示提交3之前,所以你會看到4,然後2,然後3,然後1,然後G,然後F , 等等。

根據您觀察到的輸出,看起來您使用的任何觀看者都在做最後一個序列。但是我在這裏做了很多假設(比如合併vs rebase)。