簡體   English   中英

如何將兩個獨立的不相關的 Git 存儲庫合並為一個具有單個歷史時間線的存儲庫

[英]How to combine two separate unrelated Git repositories into one with single history timeline

我有兩個不相關的(不共享任何祖先簽入)Git 存儲庫,一個是包含許多較小項目的超級存儲庫(我們稱之為存儲庫 A)。 另一個只是一個臨時的本地 Git 存儲庫,用於較小的項目(我們稱之為存儲庫 B)。 從圖形上看,它看起來像這樣

A0-B0-C0-D0-E0-F0-G0-HEAD (repo A)
A0-B0-C0-D0-E0-F0-G0-HEAD (remote/master bare repo pulled & pushed from repo A)
A1-B1-C1-D1-E1-HEAD (repo B)

理想情況下,我真的很想將 repo B 合並到帶有單個歷史時間線的 repo A 中。 所以看起來我最初是在 repo A 中開始項目的。從圖形上看,這將是理想的最終結果

A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (new repo A)
A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (remote/master bare repo pulled & pushed from repo A)

我一直在閱讀子模塊和子樹(順便說一下,Pro Git 是一本相當不錯的書),但是它們似乎都滿足了維護兩個獨立分支的解決方案,子模塊能夠從上游和子樹中提取更改少頭痛。 這兩種解決方案都需要額外的專用 git 命令來處理主樹和子樹/模塊分支之間的簽入和同步。 這兩種解決方案還會產生多個時間線(使用子樹時,您甚至可以在使用 --squash 時獲得 3 個單獨的時間線)。

SO 最接近的解決方案似乎是在談論“ 嫁接”,但真的是這樣嗎? 目標是擁有一個統一的存儲庫,我可以在其中拉入/推送簽入,這樣就沒有更多的 repo B,最后只有 repo A。

我想你是這樣做的:

  1. git remote add [repo b]
  2. git fetch //將repo b放入repo a
  3. 由於你想保留這樣的歷史:A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(來自repo B)-HEAD(新回購A)你可以先選擇以A0為起點,然后逐個使用git cherry-pick。

希望這對你有用。

布朗,蒂姆

我相信合並兩個不相關歷史的正確和最直接的方法應該使用簡單git merge --allow-unrelated-histories ,文檔https://git-scm.com/docs/git-merge 完成,並在此處描述https://jeffkreftmeijer.com/git-combine/

我做了類似的事情(將B中的歷史合並到A中),如下所示:

  1. 去你的回購A.
  2. git fetch <ref to your repo B> master:new-branch-on-A (所以,你已經將B的主分支復制到一個新的分支'new-branch-on-A'到你的repo A.
  3. git checkout new-branch-on-A
  4. git rebase master (你用主分支重新定義新的分支)
  5. 解決沖突,如果有的話
  6. git checkout master
  7. git merge new-branch-on-A
  8. git branch -d new-branch-on-A
  9. 完成:),你的歷史被合並。 我認為來自A的所有提交都是在新歷史中從B提交之前(如果需要, git rebase -i是你的朋友)。

暫無
暫無

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

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