如何取消提交上次未推送的git提交而不丢失更改


539

有没有一种方法可以还原提交,以使我的本地副本保留在该提交中所做的更改,但它们在我的工作副本中变为未提交的更改?回滚提交会将您带到上一个提交-我想保留所做的更改,但是将它们提交到错误的分支。

这尚未被推动,仅已落实。



6
git reset --softgit reset --mixed两者做到这一点(有点不同),看到的git复位
托雷克

Answers:


930

有很多方法可以做到这一点,例如:

如果你还没有推动公开承诺尚未:

git reset HEAD~1 --soft   

就是这样,您的提交更改将在您的工作目录中,而LAST提交将从当前分支中删除。见git reset man


如果您确实公开(在名为“ master”的分支上)推送:

git checkout -b MyCommit //save your commit in a separate branch just in case (so you don't have to dig it from reflog in case you screw up :) )

正常还原提交并推送

git checkout master
git revert a8172f36 #hash of the commit you want to destroy
# this introduces a new commit (say, it's hash is 86b48ba) which removes changes, introduced in the commit in question (but those changes are still visible in the history)
git push origin master

现在,如果您想在工作副本中进行本地更改时进行这些更改(“以便您的本地副本保留在该提交中所做的更改”)-只需使用以下--no-commit选项还原还原提交:

git revert --no-commit 86b48ba (hash of the revert commit).

我制作了一个小例子:https//github.com/Isantipov/git-revert/commits/master


5
非常感谢,在我的情况下,我想取消两次提交,并且连续两次运行'git reset HEAD〜1 --soft'使我到达了需要的位置。
杰夫·冈特

2
为了使您不使用CLI更加清晰,reset提到的第一个命令是说在磁头之前“软”重置为1 rev,这将保留所有本地更改。对我来说,在SourceTree中使用它并不是立即显而易见的。只需确保您已将软重置为先前的版本,而不是您尝试重置的版本
Jon B

1
我尝试了“已经推送”的方法,它对我不起作用,在git 2.14.1中:它表示"Already up to date"进行合并时。
Fabio A.

1
@FabioA。,我已经用工作版本更新了答案。感谢您的注意!
Isantipov '18

1
这行不通。我跳过了重置和提交操作,只做了git还原并推出了操作...现在可能不确定是否丢失了...幸运的是,我以一种简单的方式进行了备份,希望它仍然可以工作;)否则可以从该副本中复制更改。
Skybuck Flying

13

如果您推送了更改,则可以使用undo它,而无需使用另一个分支即可将文件移回舞台。

git show HEAD > patch
git revert HEAD
git apply patch

它将创建一个包含最后一个分支更改的补丁文件。然后,它还原更改。最后,将补丁文件应用于工作树。


你可能想rm patch太多
马克斯科普兰

6

对于这种情况:“尚未推送,仅已提交。” -如果您使用IntelliJ(或其他JetBrains IDE),但尚未推送更改,则可以继续。

  1. 转到版本控制窗口(Alt + 9 / Command + 9)-“日志”选项卡。
  2. 右键单击最后一个提交之前的提交。
  3. 重置当前分支到这里
  4. 选择(!!!)
  5. 按下对话视窗底部的[重设]按钮。

做完了

这将“取消提交”您的更改,并将您的git状态返回到上一次本地提交之前的状态。您将不会丢失所做的任何更改。


2
我喜欢学习JetBrains的方式,谢谢!相当于git reset --soft "HEAD^"在Windows上,顺便说一句。:)
payne

3

对于我来说,大多数情况发生在我将更改推送到错误的分支并稍后实现时。在大多数情况下,后续工作都是如此。

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. 恢复提交
  2. (创建并)签出其他分支
  3. 还原还原

1
我测试了这个。如果您尚未推送到远程,则您的方法也适用。$ git revert <commit-hash> ...然后检出其他分支,然后键入$ git revert <revert-commit-hash>(不执行推送)。感谢您分享这种简单的方法!!
娜塔莉·科特里尔

1

请确保在运行这些命令之前在一个单独的文件夹中备份您的更改

git checkout branch_name

在您的分支结帐

git merge --abort

中止合并

git状态

中止合并后检查代码的状态

git reset --hard origin / branch_name

这些命令将重置您的更改,并使您的代码与branch_name(分支)代码对齐。


1

2020年简单方法:

git reset <commit_hash>

提交要保留的最后一次提交的哈希。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.