2014-10-28 75 views
2

我早先在我的git倉庫中做了一個混亂,做了合併和添加標籤之類的東西。現在我已經恢復我的開發分支提交我想(在一個粗體),但仍然有提交的提前了歷史上的混亂承諾:強制刪除頭部之前的所有提交?

enter image description here

如何擺脫那些提交(從487ff69分支開始的地方開始),好像它們從未發生過一樣?這不一定需要在SourceTree中發生 - 終端命令也很好。

謝謝!

+0

你是否將這些(雜亂)提交到公共存儲庫? – 2014-10-28 16:13:45

+0

如果這些提交沒有從其他地方引用,它們應該被git的垃圾收集刪除。 (儘管您可能需要刪除標籤。)請參閱此答案獲取更多信息:http://stackoverflow.com/a/7907518/245915 – nofinator 2014-10-28 16:16:04

回答

2

Git非常努力地從未嘗試過刪除提交(有幾個例外,我們可以在這裏忽略)。我認爲你想在這裏做的是提交無法訪問,這很容易,因爲引用 - 主要是分支和標記名稱(像git的「藏匿」也是引用,但我們可以忽略這一點) - 是什麼使提交可達。

因此,爲了使提交不可訪問,我們只需移動或刪除引用。

您的develop已被移動:它現在指向粗體提交,就像您想要的那樣。據推測,你做了一個git reset或GUI相當於實現。現在不需要提交通過你添加的標籤,0.1.30.1.20.1.1只引用。因此,你所要做的就是刪除標籤(或停止使用它們),並且提交將(似乎)消失。 (根據其他細節,它們仍然會停留一段時間,默認情況下爲30到90天,但如果沒有「命名」參考,它們將在該點之後消失;另請參見此處的腳註。)


通過git的「reflog」,對這些提交有一種副作用,或者真的有不止一種提法。每當git更新一個引用(如develop等分支名稱)或者甚至是名爲HEAD的間接「當前樹頭」引用時,它都會更新該引用的reflog(如果引用日誌存在)。這些reflog條目是保護提交的內容:每個條目都有一個時間戳和一個原始SHA-1值,並且這些條目用作保留提交(或標籤,如果它們指向帶註釋的標籤)的引用。對提交的任何引用都會保留它,然後如果它具有對父提交的自己引用,則該提交將保留其父對象,等等。這就是讓git如此堅持保持存儲在存儲庫中的任何東西的原因。