2012-02-27 137 views
7

如何刪除那些分支master提交?刪除Git修訂的一個分支

我加入了一個大型圖書館,具有非常豐富的一起提交歷史(這早我的代碼)通過Git subtree到子目錄。我想追溯壁球是整個歷史,但仍然能夠在新提交合併到庫

我已經試過的git rebase各種組合,但我從來沒有得到預期的結果[*]。

我的倉庫看起來像:

A---B-----------F---G master 
      /
    ... C---D---E 

,我想爲它看起來像:

A---B-----------F'--G' master 
      /
       E' 

或:

A---B-------E'--F'--G' master 

[*]:

  • git rebase --onto C E master
  • git checkout F; git rebase --onto C E master
+0

合併將受到這種擠壓的影響。你爲什麼要壓扁它?只是爲了清理gitk/git日誌輸出? – 2012-02-27 21:52:38

+0

是的,事實上,所有以前的提交達數百兆字節。 – Gingi 2012-02-27 22:04:56

+0

您通過將其開發歷史記錄集成到項目存儲庫中來導入圖書館的決定很奇怪。 – Deestan 2012-02-27 22:07:56

回答

1
  1. 這是歷史的編輯。您將在什麼落得像

    A---B-----------F'---G' master 
          /
           E' 
    
  2. 合併將是在此之後的一個問題,因爲的Git將無法找到你的歷史和圖書館的歷史之間共同的父母。

  3. 要真正做到這一點,你需要

    1. 重置爲B(對於G創建標籤或分支機構,以保持它周圍)
    2. 執行與--no-commit合併。
    3. 再次基於或摘櫻桃摹這裏(這將是G')

    歷史會像

    A---B-----------F'---G' 
    

使圖書館的淺克隆,你需要做這樣的事情(警告:未經測試):

  1. 保存從F(不包括)至G(包括)款到接插(git format-patch F --stdout > ~/saved_commits.patch
  2. 重置爲B.確保沒有分支被poiting到F,E或G
  3. 卸下遠程一起與它的裁判命名空間git remote rm
  4. 擦除reflogs:git reflog expire --expire=now --all
  5. 其實從混帳刪除的東西:git gc --prune=now。現在你應該看到版本庫縮小了。
  6. 重新添加遠程庫。
  7. git fetch --depth=10 libraryremote
  8. 重複的合併(通常的方式)
  9. 應用保存提交(git am ~/saved_commits.patch)。

遷移到子模塊的解決方案(可能是最佳選擇),你需要回滾到合併前的狀態和設置子模塊,然後替換每個改變提交-ID的子模塊合併。與case of splitting out project directory to submodule不同,我不知道這個自動化解決方案(但它可以以類似的方式實現)。

+0

爲什麼'E''不能有'F',而不是'F''作爲它的父母(同樣適用於'F''和'G')? – Gingi 2012-02-27 22:07:20

+1

s /父/子/ – 2012-02-27 22:11:21

+0

提交號碼提交散列。改變父母意味着改變這個提交意味着改變這個提交的散列意味着改變這個提交的數量。歷史編輯會使所有提交的紋波都變化最近。 – 2012-02-27 22:13:18