![](/img/trans.png)
[英]How to find the common ancestor of two branches before a merge commit in 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.