767

有没有办法恢复提交,以便我的本地副本保留在该提交中所做的更改,但它们成为我的工作副本中的未提交更改?回滚提交会将您带到上一个提交 - 我想保留所做的更改,但我将它们提交到错误的分支。

这没有被推送,只是提交。

4

9 回答 9

1329

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

如果您尚未公开提交提交:

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

于 2013-11-08T12:55:01.647 回答
14

如果您推送了更改,您可以undo将文件移回舞台,而无需使用其他分支。

git show HEAD > patch
git revert HEAD
git apply patch

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

于 2016-03-25T09:07:59.310 回答
10

对于案例:“这还没有被推送,只有提交。” - 如果您使用IntelliJ(或其他 JetBrains IDE)并且您尚未推送更改但您可以执行下一步。

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

完毕。

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

于 2018-06-04T16:17:40.573 回答
7

2020简单的方法:

git reset <commit_hash>

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

于 2020-06-04T17:59:25.253 回答
4

对我来说,这主要发生在我将更改推送到错误的分支并稍后意识到时。并且大部分时间都在关注作品。

git revert commit-hash
git push

git checkout my-other-branch
git revert revert-commit-hash
git push
  1. 恢复提交
  2. (创建和)结帐其他分支
  3. 还原还原
于 2018-10-26T04:55:44.583 回答
0

从 2021 年起面向谷歌同事的新更新。

如果您是 VSCode 用户,这是撤消上次提交的现代方法。

  1. 转到左侧的源代码管理选项卡(快捷方式:Ctrl + Shift + G G)。
  2. ...圆形更新图标左侧的。请参阅下面的屏幕截图: 源代码控制截图
  3. 导航到 Commit,然后到 Undo Last Commit。这是一个屏幕截图: 在此处输入图像描述

它所做的只是恢复您的存储库,就像您提交之前一样,您的更改保持不变。

于 2021-12-22T07:24:30.953 回答
0

添加我遵循的步骤,希望它对像我这样的初学者有所帮助。

下图显示了我已经推送到bitbucket 中远程分支“ A ”的提交。在此处输入图像描述

从这 5 个提交中,我想保持最后 2 个原样,但前 3 个提交我希望将它们推送到另一个分支“ B ”。

这些是我遵循的步骤:

内部分支' A ':

  1. git revert <commit-hash>对于 3 个提交中的每一个。例如,d4a3734是图片中最后一次提交的提交哈希。(如果您愿意,您可以一次还原多个提交 - 请参阅如何还原多个 git 提交?
  2. git push

推送后,它是这样的:-

在此处输入图像描述

现在,我的分支“ A ”中只有前 2 个提交,这就是我想要的。接下来,结帐到想要的分支。如果是新分支,请使用git checkout -b <branchname>. 就我而言,我做到了git checkout B

内部分支' B ':

我只是挑选了我想分支“ B ”的提交。就我而言,我做了:

git cherry-pick <commit-hash> 

对于我恢复的那 3 个提交。

(再次举个例子,git cherry-pick d4a3734其中d4a3734是图中最后一次提交的提交哈希)

于 2021-05-19T07:35:55.737 回答
0

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

git checkout 分支名称

在您的分行结帐

git 合并 --abort

中止合并

状态

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

git reset --hard origin/branch_name

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

于 2018-12-17T07:43:59.337 回答
0

撤消上一次 Git 提交的最简单方法是git reset使用以下选项之一执行命令

  • 柔软的
  • 难的
  • 混合

假设您添加了两个提交,并且您想要撤消最后一个提交

$ git log --oneline

45e6e13 (HEAD -> master) Second commit
eb14168 Initial commit

–soft选项撤消上次提交并保留对文件所做的更改

$ git reset --soft HEAD~1


$ git status

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
    modified:   file.html


$ git log --oneline

eb14168 (HEAD -> master) Initial commit

–hard选项撤消最后一次提交并丢弃工作目录和索引中的所有更改

$ git reset --hard HEAD~1


$ git status

nothing to commit, working tree clean


$ git log --oneline

eb14168 (HEAD -> master) Initial commit

--mixed选项撤消最后一次提交并将更改保留在工作目录中但不在索引中

$ git reset --mixed HEAD~1


$ git status

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   file.html

no changes added to commit (use "git add" and/or "git commit -a")


$ git log --oneline

eb14168 (HEAD -> master) Initial commit
于 2022-03-05T13:15:33.837 回答