2011-08-30 68 views
5

另一點我們有以下的歷史移動分公司在歷史

start   master public 
|     | | 
v     v v 
o---o-- ... --o---o---o 

不幸的是,我們做了一些提交到master分支包含一些敏感數據。我們在一個名爲public的獨立分支中修改了這個。現在我們要「切斷」public分支,以便在public中獲得一個完整且乾淨的「狀態」,但沒有通過master仍包含的妥協歷史部分。換句話說,我們希望以下新的歷史:

start   master 
|     | 
v     v 
o---o-- ... --o---o 
\ 
    o <- public 

現在退房public將導致相同的工作樹在原來的情況,但沒有合理的歷史細節。之後,我們將舊的master分行暫存:將其重命名爲unsafe,並從新的public分行詳細說明新的master分行。這樣,我們在保護的unsafe老歷史,並能夠推動public分支進入公衆無任何後顧之憂:

start   unsafe 
|     | 
v     v 
o---o-- ... --o---o 
\ 
    o---o-- ... --o <-- public 
    \   /
    o-- .. --o-- ... --o <-- master 

什麼是正確的Git命令來實現這一目標?

PS:當然我們可以結賬start,建立一個新的分支並在那裏提交public分支的整個工作樹。但是,必須有一種不同的,更有魅力的git方式!

+0

@phlipsy這實際上並不是關於SU的主題,但我會根據要求將它遷移到SO,以便您不會必須重新發布。 – DMA57361

+0

以下信息可能有所幫助:http://help.github.com/remove-sensitive-data/。 – Barend

+0

看看http://stackoverflow.com/questions/872565/how-do-i-remove-sensitive-files-from-gits-history – Chris

回答

3

將所有公共提交合併爲一個提交(即將多個提交合併到一個提交或完全移除單個提交等)的正確方法是使用git rebase -i。所以,你會做什麼(假設第一承諾有一個標記start爲您的圖形表示):

git checkout public 
git rebase -i start 

的編輯器窗口時,你可以編輯所有補丁的順序 簡單地使用squash爲所有補丁。保存該文件並關閉編輯器後,git將根據請求重新組合補丁歷史記錄。當然,主分支根本不會改變它的歷史。

要重命名當前的主不安全,並開始對公衆所有的進一步發展,我會做:

git checkout -b unsafe master # <- creates a new branch "unsafe" 
git checkout master 
git reset --hard public # <- forces master branch to point to public 

如果不創建unsafe分公司,硬復位將失去在主所有提交和您將無法(輕鬆)訪問它們。所以確保你真的創建了這個分支。

另一種方法是重命名masterunsafe然後創建新的主分支:

git branch -m master unsafe # renames master to unsafe 
git checkout -b master public # creates new branch master as a copy of public 

兩者均應導致確切相同的支路結構。 (當然,第二個不會有失去歷史的危險......)

+0

我不得不擺弄一下,因爲你不能擠壓所有提交(哪一個會保持?)。但最後它爲我工作。謝謝,這就是解決方案! – phlipsy

+0

我在我們的現實生活中嘗試過它:哇!這是我一生中做過的最瘋狂的重生!準備好與您項目整個歷史的所有合併衝突保持聯繫。 – phlipsy