[英]Git revert back to previous commit but keep newer commits as unstaged
我有一個Git
存儲庫,其提交歷史如下: A -> B -> C
( C
是最新的提交),整個歷史都被推送到公共遠程存儲庫中。 我可以做以下事情嗎?
返回到B
狀態, C
為未分段的更改?
由於A -> B -> C
被推送到遠程倉庫,我不能期望git reset B
但是我可以期待的是A -> B -> C -> B'
,其中, B'
與B
處於相同狀態,但C
為無階段變化。
正如Ovsyanka回答的那樣 , git reset
確實按照工作樹的要求進行了工作 (就此而言,它也是索引/臨時區域:您可以使用--mixed
控制索引是否重置為目標提交B
,或者--mixed
vs --soft
)。 但是,如果執行常規的git revert C
,然后執行通常的edit-add-commit序列,則會得到:
A--B--C--unC--D
即,總共5次提交。 如果你不希望這樣,您可以使用:
git revert -n C
無需實際提交即可還原工作樹(和索引)中的C
然后,您可以進行進一步的更改並再次提交,從而得到:
A--B--C--D
D
撤消C
並進行進一步更改。
不過,有充分的理由堅持簡單的還原。 假設某個人(也許甚至是您自己)將來會回到這個項目,例如從現在開始一年。 這個人想知道過去發生了什么,並正在查看提交。 他們遇到了提交D
,然后對其進行檢查,該提交顯然被撤消了提交C
某些操作,並且還做了其他一些工作,他們想知道:“嘿,誰把C
所有出色工作都扔了?等一下,是寫 C
那個人什么...?”
如果他們C--unC--D
了C--unC--D
序列,而提交unC
是“ revert”,那么他們(可能又是你自己)將立即知道:“啊哈,恢復C
的人在說C
是錯的 ,然后加D
的人正在做出不同的更改……哦,那個人是我 。哦,是的,我現在記得!”
即使您尚未推送/發布提交C
,將其恢復為這樣仍然是一個不錯的主意。 然后,在實際使用git push
提交順序之前,可以運行git rebase -i
並刪除C
及其版本,以使其看起來從未犯過該錯誤。 (或者,等效地,將一堆提交壓縮在一起,以便您進行一次“非常好”的更改,或者進行一小組“非常明智的”更改,而不是曲折地收集“嘗試一下,也嘗試一下,哦,等一下第一個是錯誤的,嗯,我們也需要此輔助修復程序,哦,在進行任何更改之前,如果我們在測試中解決了這個主要問題,那就太好了!錯誤,很明顯,我們正在修復什么以及為什么!”)
git reset --mixed B
做你想要的:
重置索引,但不重置工作樹(即,已更改的文件將保留,但未標記為提交),並報告尚未更新的內容。 這是默認操作。
但是,如果您要刪除的是C更改,而不僅僅是對其進行修復,則最好還原C提交然后再執行其他提交。 對其他人來說,您將完成已丟棄的C提交更改。
您可以使用git revert C
然后將擁有clezn工作目錄和歷史記錄“ A-B-C-C(rev)”,並且文件的狀態將與B中的一樣。
您可以使用以下命令來滿足您的要求:
git revert <commit id for B>
git checkout <commit id for C> -- *.* & git reset HEAD *.*
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.