2011-04-26 88 views
5

我以某種方式在分支中獲得了一些重複的提交,每個都有相同的更改。這是一個公共分支,由幾個用戶從幾個分支合併而成。我需要定期將這個分支重新分配到另一個回購的主分支上,這些重複使它變得笨拙。git:從公共分支刪除重複的提交?

有沒有辦法刪除這些並推送他們到公共回購w/out使其複雜的其他用戶在分支機構工作?

+1

假設您認爲從歷史重寫中恢復(即將原始公共分支中的所有內容重新分配到新分支)複雜,否則無法執行此操作。刪除提交是重寫歷史記錄。 – Cascabel 2011-04-26 20:16:17

+2

你確定你有重複的提交_on在同一個branch_?在我看來,唯一真正可行的方法是首先進行重新組裝,然後合併之前重新組裝的分支。然而,合併不會是快速的,並且合併的提交在技術上將是'從合併'而不是'從分支'(即,當僅跟隨第一父母時,日誌不會顯示提交)。那有意義嗎? – sehe 2011-04-26 21:04:43

+0

我認爲sehe是對的 - 你得確保他們在同一個分支上。 「rebase -i」應該稍後澄清一下,因爲如果問題確實存在,OP將馬上看到 – 2011-04-27 15:16:15

回答

0

使用git filter-branch重寫歷史記錄。下面是從GitHub一個很好的介紹:

http://help.github.com/removing-sensitive-data/

+0

OP的問題的一個關鍵部分是「不會讓其他用戶變得複雜」 - 這實際上是不可能的。他們將不得不採取一些措施來重寫歷史重寫。 – Cascabel 2011-04-26 20:15:10

4

過濾分支沒有必要在這種情況下恕我直言和Jefromi沒有使生活變得有點複雜了其他人提到它是不可能的。 Git的第一條規則 - 不要重寫已發佈的歷史記錄。

如果你真的想清理已經搞砸了的分支,那麼你應該在本地重新綁定它,重新安排提交併強制推送它到主線,如果需要的話。

爲了做到這一點(想象分支在本地簽出最後已知的良好狀態之後,你已經開始得到這些重複的是20個提交前)

git checkout yourPublicBranch 
git rebase -i HEAD~20 

這會火起來的編輯器,您可以在其中管理提交。然後,你將不得不保存文件並退出rebase開始工作。這可能會導致衝突。

+0

我知道如何做交互式重新裝訂以擺脫提交。如果必須的話,我可以強制它進入公開回購。用戶在完成同步後必須做些什麼?如果他們沒有對他們的本地分支進行任何更改(我知道(?)他們可以拉新分支並且沒問題。但是,如果他們在此期間做出了自己的本地更改?謝謝。 – michael 2011-04-27 17:33:01

+1

您需要通知他們該分支的歷史記錄已被重寫。然後他們必須: 1.「git fetch remoteName」 - 這將更新遠程跟蹤分支,並將通知他們關於在感興趣的分支上強制更新 2。如果他們在這個分支沒有本地變化,他們可以拉動它並被覆蓋。如果他們確實在跟蹤這個重寫過的地方佈告上發生了變化,他們可以做「git pull --rebase」,所以他們的本地變化將在新的歷史記錄之上重新發布。如果他們有其他分支從這個公共分支衍生出來,他們也必須重新分配它們。 – 2011-04-27 17:39:46

+0

太好了,謝謝。我沒有意識到它可以像他們做「git pull --rebase」一樣簡單。手指穿過那將照顧它。 – michael 2011-05-02 19:03:23