2010-06-17 117 views
18

有沒有辦法在指定提交之前移除所有提交併將該提交用作初始提交?在特定提交之前移除提交

+0

我知道我已經看過一個教程在某處做類似的事情......它展示瞭如何讓歷史回購結束於提交X,然後將提交X提交到HEAD並從它們開始新的回購,在X上註釋關於如何訪問歷史回購。 我現在找不到它,但它是可能的。 – Daenyth 2010-06-17 15:41:34

回答

16

比方說,新的歷史最悠久的提交的哈希值是X,我們可以用「oldroot」和「newroot」暫時:

git checkout -b oldroot X 
TREE=`git write-tree` 
COMMIT=`echo "Killed history" | git commit-tree "$TREE"` 
git checkout -b newroot "$COMMIT" 
git rebase --onto newroot oldroot master 
# repeat for other branches than master that should use the new initial commit 
git checkout master 
git branch -D oldroot 
git branch -D newroot 
git gC# WARNING: if everything's done right, this will actually delete your history from the repo! 

這將創建一個「newroot」具有相同的內容爲「oldroot」承諾承諾,但沒有任何父母。然後,它將所有其他分支重新分配到新根,這應該是所有分支的歷史。

編輯:測試和固定;稍晚,精一點

+2

請注意,「Killed History」成爲初始提交的新提交消息。如果你想要別的東西,比如原始信息,就把它放在那裏。 – 2010-06-17 16:26:34

0

更容易的解決辦法是, 考慮最初你的分支有提交主要和你沒有提交第一,現在還沒有一個上第一頂提交第二。所以,你有這樣的:

main->first->second 

現在你想對的主要頂部第二上,而不是第一頂部。喜歡的東西:

main->second->first or main->second 

你可以簡單地做,

git rebase -i main 

這會給你一個交互式shell,你可以重新提交的順序或刪除任何提交您所選擇的。