簡體   English   中英

Git - 合並兩個具有共同祖先的存儲庫

[英]Git - merge two repositories with common ancestor

假設我曾經有一個存儲庫 Z 並基於它創建了兩個存儲庫(A 和 B)。

我讓它們相互排斥。 我的意思是 A 中的文件不應該在 B 中,反之亦然。 所以,我刪除了 A 中的一些文件和 B 中的文件。

這兩個存儲庫隨着時間的推移不斷增長。

現在,由於某些管理決策,我需要將它們作為單個存儲庫返回。 我嘗試按照如何使用子樹合並策略中的說明進行合並,但它給我帶來了太多沖突,並且合並本身非常臟。 我理解這是一項不尋常且艱巨的任務。

大家有沒有遇到過同樣的問題,你們是怎么解決的?

我懷疑這是一個好主意,但聽起來它是否真的無關緊要。

所以你有一個單一的回購,我假設里面有兩個項目。 他們共享了一段歷史,看來你需要回到那個狀態——一個包含所有文件的主分支。

您顯然已經將所有對象都帶入了一個存儲庫。 例如,也許您添加了一個 repo 作為另一個 repo 的遠程,並獲取了它的主引用; 所以假設你有

A -- B -- C -- X1 -- X2 -- X3 <--(master)
           \
            Y1 -- Y2 -- Y3 <--(repoB/master)

你試試

git checkout master
git merge repoB/master

並且您會遇到沖突和其他混亂,並且可能理解混亂將有助於了解該怎么做。 沖突可能就像“文件在此處刪除並在此處修改”一樣簡單,這很容易解決,但其他事情也可能發生。

例如,如果您要拆分兩個項目,那么您可能已經將一堆東西從項目子目錄移動到工作樹根目錄。 或者您可能在一個 repo 中創建了一個文件,其路徑/名稱與另一個 repo 中的現有文件相同。 或者隨便。

因此,我要做的第一件事是確保每個 repo 的工作樹都被布置為您想要前進的組合工作樹的子集。 如果已經是這種情況 - 即您在拆分存儲庫后沒有移動文件,則兩個存儲庫中都不存在路徑/文件名,並且所需的工作樹正是您通過cd到一個存儲庫的工作樹獲得的cp -R其他 repo 的工作樹 - 然后你可以跳過這一步。

但否則,你可以

git checkout master

然后根據需要mv文件,以便您擁有所需工作樹的子集,然后提交。 然后

git checkout repoB/master
git checkout -b repoB

並根據需要再次mv周圍的東西並提交。

A -- B -- C -- X1 -- X2 -- X3 -- X <--(master)
           \
            Y1 -- Y2 -- Y3 -- Y <--(repoB)

沒有這個你也可以過得去,但它為我們提供了比其他方式更簡單的下一步選擇。

接下來我們可能想要開始合並。 我們不想要默認的合並結果,這意味着我們正在創建可能被稱為“邪惡”合並的東西; 但在我看來,這不是那么糟糕,因為合並將,默認情況下,沖突-所以從某種意義上講,沒有默認的合並結果。

無論如何,我們想讓git處於“merge-in-progress”狀態,但它的默認合並算法在這里用處不大; 所以

git checkout master
git merge -s ours --no-commit repob

現在我們需要添加來自repob的文件,這將順利工作,因為它們都與我們已有的文件不在同一路徑。

git checkout repob -- .

驗證工作樹現在看起來是否正確。 然后

git commit

暫無
暫無

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

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