[英]Is there a way to attach a 2nd root to an arbitrary commit in git?
轉移到git時,我們並沒有導入整個歷史記錄,並且如果沒有某些文件的歷史記錄,將會使某些操作變得困難。 我當時正在考慮使用一個孤立分支將一些歷史記錄導入我們的樹中,然后以某種方式將其附加到根節點。 那可能嗎? 我知道我可以使用合並將它附加到以后的一個,但是我想知道是否可以這樣做以保持原始歷史記錄的時間完好無損。
有一些選擇。 哪一個最好取決於您的需求,盡管某些其他用戶相信他們可以告訴您哪個是最好的。
選項1:您可以將git filter-branch
與parent-filter
以將當前根嫁接到新導入的歷史記錄上。 這是“歷史記錄重寫”,因此需要與所有開發人員協調。 我進行批量重寫的首選方式是:
當然,這種協調對於您的團隊可能不切實際。 您可以繼續進行重寫,然后讓所有人都知道他們必須恢復所有分支。 但這很乏味,並且只需要一名開發人員將其弄亂就可以撤消重寫工作。
另外請注意,所有提交的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.