2014-10-07 141 views
1

我有提交A,B,C和D,我需要保留最近的一個是D. 我看到一種方法是使用git rebase -i --root,因爲您可以挑選和壓扁提交。git rebase保持最近的提交

儘管我不太瞭解pick和squash之間的區別,但這讓我想知道,因爲提交是增量式的,所以提交D包含所有在兩者之間的變化,爲什麼你必須通過git rebase來保持最最近的提交而不是隻刪除其餘的提交?

或者我錯過了一些有關git的基本知識?你可以提交彼此不相關的提交嗎?即有一天使用提交B,在另一種情況下使用最近的提交D?

回答

6

git提交併非真正的增量,每個提交都包含整個樹。只有用戶界面根據與其父項的差異提交提交。從這個意義上說,你不用已經去通過git rebase來保持最近的提交併放棄其餘的,你也可以使用git commit-tree plumbing命令來創建提交。底墊完全等同會是這樣的一行:

git reset --hard $(git commit-tree HEAD: -m message) 

那密線執行以下操作:

  • HEAD:是指包含在當前頭部提交的樹對象。

  • git commit-tree TREE -m MESSAGE創建一個新的無父提交,其中包含指定的樹,在我們的示例中爲HEAD的樹。它的輸出是新創建的提交的SHA1。

  • git reset --hard COMMIT將當前分支和工作樹重置爲指定的提交,在本例中爲新創建的根提交。

創建沒有歷史記錄的提交是git阻止的,因爲這樣的提交使得git難以在數據上操作。諸如git annotategit merge之類的命令在很大程度上依賴於可用的歷史記錄,沒有這些git是一個不太有用的工具。