簡體   English   中英

Git恢復為先前的提交,但將新提交保留為未暫存

[英]Git revert back to previous commit but keep newer commits as unstaged

我有一個Git存儲庫,其提交歷史如下: A -> B -> CC是最新的提交),整個歷史都被推送到公共遠程存儲庫中。 我可以做以下事情嗎?

返回到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--DC--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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM