2013-05-19 151 views
1

會怎麼樣發生git的標籤如果你有你有一個git的承諾樹是這樣的:合併拉請求

A-B-C-D   D <-- v0.9 (tag) 

而且你接受它具有早於所述提交先前標記變化的拉動請求;標籤現在是否會包含來自合併請求的提交?

A-F-B-G-C-D  D <-- ? v0.9 (tag) 

回答

5

在git中,標籤指向特定的提交對象。如果你實際上已經做了git pull --rebase那麼你的圖形看起來是這樣的:

A-B-C-D 

A-F-B'-G-C'-D' 

實際提交對象取決於樹和血統的狀態,所以即使從C到d的差異是完全相同的C'和D'之間的差異,它們是不同的提交對象。

因此,您的問題的答案是v0.9標記將始終指向標記第一次創建時的D版本。因此,如果您重寫了歷史記錄,則會有一個標記指向當前分支不再位於樹中的提交。

但是,如果您的意思是有人在推送BC和D之前已經提交併推送到分支FBG和C,那麼會發生什麼取決於您是否進行合併或重新綁定用現有歷史記錄更新您的本地分支。

默認是合併。這將使你的圖形看起來就像這樣:

A-F-B-G-C 
\  \ 
    B-C-D---M 

如果您分公司負責人將指向M和B和C樹的每個分支將是不同的(即使你倆櫻桃採摘從同一提交別的地方)。

UPDATE

TL;博士:

  • 誰犯第一(時間)並不重要:順序取決於圖(S)和你的選擇結合和/或改變圖表(合併,rebase,櫻桃選擇)。你決定什麼樣的最終結構。
  • 提交對象(事物標記點)不會改變,所以你標記的承諾將不會被更新
  • 因爲提交不改變,當歷史被改寫,你實際上有對象提交即使diff文件是相同的。它可能看起來像事情正在改變,但它們實際上被替換爲看起來非常相似的東西。
+0

我想到的情景是在Github上。另一個用戶分叉你的倉庫,你在主倉庫進行一些其他更改後標記一個修訂。同一個用戶也進行了一些更改,並執行拉取請求以將這些更改合併回主。 – cmorse

+0

無論是否在github上,您都可以控制自己的存儲庫。在github的情況下,您可以控制本地版本和存儲庫的遠程版本。無論哪種方式,您都需要在合併,重新綁定或挑選變更之間做出決定。這個頁面似乎表明github ui爲pull請求提供了'merge'https://help.github.com/articles/merging-a-pull-request但是無論你做什麼,你標記的提交都不會改變。 – underrun

+0

感謝您的解釋! – cmorse