2017-06-29 98 views
1

比方說,我有一個這樣的提交歷史:刪除提交,但保留更改

commit 1 - The first commit 
commit 2 - The commit I want to revert, but keep the changes of 
commit 3 - The third commit 
commit 4 - The fourth commit 
[uncommited work] 

如果我沒有推任何東西(或最多隻能提交1),我怎麼能刪除提交2 ,但是將提交2中所做的更改應用於當前未完成的工作?

我能找到的所有東西都是關於如何刪除提交,並將其更改或重置爲該提交,這將會(據我所知)從歷史記錄中刪除所有提交。

+0

觀看[如何推送特定提交](https://stackoverflow.com/questions/3230074/how-can-i-push-a-specific-commit-to-a-remote-and-not-previous-commits) – arracso

+0

我不想推特定的提交。我想刪除特定的提交,但保留所做的更改(現在)。 –

回答

3

我會重新安排修訂,您想要的方式,然後摘櫻桃提交2,藏匿彈出,然後將頭指針,以「重建」承諾4:

git stash save "will come back" 
git checkout commit1 
git cherry-pick commit2..commit4 
git cherry-pick commit2 
git stash pop 
git reset --soft HEAD~1 

這應該做

+0

你說得對,應該這樣做。但我認爲可能會有一個單一的命令,所以如果其他人有這樣的命令,我會接受這個答案。也許@Pandelis的答案也適用,但我還不確定。 –

+0

不要聽起來太悲觀,但我不認爲git社區不能爲可能出現的每種情況提供單獨的git命令。通過使用git已有的命令,你所暴露的情況恰好是(種類)「很容易解決的」。 – eftshift0

+0

是的,這很有道理。我只是想我可能錯過了一個選項。我也沒有意識到你可以像這樣挑選櫻桃,所以非常感謝! –

0

我相信git rebase -i HEAD~3應該做伎倆。

然後,您就可以選擇提交2進行編輯,修改的提交或已更改的文件,然後git會「重播」在編輯的頂部承諾3和4犯2

內容
+0

但我不想編輯提交2並在其上應用提交3和4。也許我甚至認爲當前的變化和第2次提交所做的更改都是無用的,我將它們全部刪除。 –