簡體   English   中英

有沒有辦法將第二根附加到git中的任意提交?

[英]Is there a way to attach a 2nd root to an arbitrary commit in git?

轉移到git時,我們並沒有導入整個歷史記錄,並且如果沒有某些文件的歷史記錄,將會使某些操作變得困難。 我當時正在考慮使用一個孤立分支將一些歷史記錄導入我們的樹中,然后以某種方式將其附加到根節點。 那可能嗎? 我知道我可以使用合並將它附加到以后的一個,但是我想知道是否可以這樣做以保持原始歷史記錄的時間完好無損。

有一些選擇。 哪一個最好取決於您的需求,盡管某些其他用戶相信他們可以告訴您哪個是最好的。

選項1:您可以將git filter-branchparent-filter以將當前根嫁接到新導入的歷史記錄上。 這是“歷史記錄重寫”,因此需要與所有開發人員協調。 我進行批量重寫的首選方式是:

  1. 每個人都推送他們的所有代碼。 (它不必合並,而必須在遠程某處。)
  2. 每個人都丟棄他們的克隆
  3. 您導入歷史記錄並執行重寫
  4. 每個人都從重寫的倉庫中創建新的克隆

當然,這種協調對於您的團隊可能不切實際。 可以繼續進行重寫,然后讓所有人都知道他們必須恢復所有分支。 但這很乏味,並且只需要一名開發人員將其弄亂就可以撤消重寫工作。

另外請注意,所有提交的ID都會更改; 因此,即使您可以協調轉換,但如果使用這些提交ID(例如,在發行文檔中),則重寫可能不是最佳選擇。

有關此選項的信息,請參見git filter-branch docs( https://git-scm.com/docs/git-filter-branch ); parent-filter示例滿足了您的需求。

順便說一句,這是最根本沒有任何意義的“ rebase”類型解決方案。 除了最簡單的歷史記錄之外,您無法輕松地重新設置基准,而重新設置基准將重新計算每個提交的內容(除了實際上不希望更改您的提交內容之外,它只能提供犯錯的機會) 。

選項2:您可以使用git replace來“覆蓋”歷史記錄中的中斷。 最好的方法是一次提交“ overlap”。 因此,請導入歷史記錄,直到(包括)與您當前根目錄相同的提交為止。

這樣可以避免重寫歷史記錄,但是不會在克隆和遠程之間傳播。 因此,每個用戶都必須在每個克隆中在本地進行設置。 我猜沒關系; 您可以在需要時進行設置。 但也要注意,有一些與replace有關的古怪/錯誤。 參見git replace docs。

如果要執行此操作,我將要做的是導入歷史記錄,標記其提示並在現有根目錄上添加注釋,其中包含有關如何在給定克隆中設置替換的說明。

選項3:合並 這是不是真的是你的約束中的一個選項,但值得指出的利弊。

如您所述,您可以將導入的歷史記錄合並到分支提示中。 產生的歷史記錄看起來不太正常,但是至少歷史記錄會存在。 您必須將git告訴--allow-unrelated-histories ,然后將與ours策略合並(因為您實際上不希望合並更改分支上的任何內容)。

這堅持了git的非常基本的功能,並且不會重寫任何裁判的歷史記錄,因此它既簡單又可靠。 但是我永遠都不希望瀏覽以這種方式縫合在一起的歷史。 恕我直言,最好將歷史記錄分開(即使您將舊的歷史記錄作為孤兒導入到相同的倉庫中也是如此),但同樣只有您可以確定團隊的優缺點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM