Git - 如何撤销在错误本地分支提交的更改?

5
我的Git设置是在本地的“feature”分支上工作,并随着工作进展将更改提交到此分支。当代码准备好时,我将其合并到本地的“develop”分支中。然后,我将本地“develop”分支中的更改推送到远程的“develop”分支。
我对一个文件进行了一些更改并将它们提交了,但没有意识到我实际上是在本地的“develop”分支上而不是我的“feature”分支上。在将“develop”分支推送到远程的“develop”分支之前,我发现了我的错误,因此更改仍然在本地。
如何撤消对本地“develop”分支的此次提交?我正在使用Tortoise Git,但如果需要,我仍然可以使用Git命令行。
注意:这不是我对“feature”分支的第一次提交或对“develop”分支的第一次合并。

这是在“develop”分支中的最后一次提交吗,还是你在此之后又进行了其他的“develop”分支提交? - melpomene
@melpomene - 这是本地开发分支的最后一次提交。 - webworm
1
可能是从Git中删除分支的提交的重复问题。 - melpomene
git reset --hard HEAD~1 将删除您分支中的最后一次提交(以及您可能进行的任何本地更改)。请谨慎使用。 git rebase -i 可用于从您的历史记录中删除提交。请谨慎使用。 - melpomene
3个回答

11

有几种方法可以解决这个问题。其中一种方法是在你的 feature 分支上 cherry-pick 提交记录。然后将你的 develop 分支重置到之前的提交记录。

  1. git checkout feature
  2. git cherry-pick <提交记录哈希值>
  3. git checkout develop
  4. git reset --hard HEAD~1

1
请注意,如果您已经有一个包含一些提交的“feature”分支,则只有第1点和第2点是必需的。 - Code-Apprentice

4
如果你忘了为你的功能创建分支,那么你应该创建一个分支:
git branch feature

然后您可以将develop重置回正确的位置:

git reset --hard HEAD~

如果您已经有一个功能 (feature)分支,并且想要将您意外在develop上提交的更改移动到该分支,那么您可以使用git cherry-pick:
git checkout feature
git cherry-pick develop

然后您可以按上述方式重置develop。只需确保首先进行检查:
git checkout develop

0

那么,让我们来谈谈如何将这些提交移动到功能分支,然后撤消它们。为了说明这一点,我们假设只有错误提交已经在您的本地develop分支上。

  1. 获取每个错误提交的提交哈希值在develop上。您可以在GUI中执行此操作,或者在终端中检出develop并运行git log。将它们复制粘贴到稍后可以引用它们的某个地方。

  2. 检出您的feature分支。现在,您将为步骤#1中保存的每个提交哈希值运行git cherry-pick <commit_hash>。您要按照它们被提交到develop分支的顺序进行操作。这会将每个提交重新播放到您的本地feature分支上。

  3. 对您的develop分支进行硬重置,以将其恢复到远程版本。假设远程引用是origin/develop,则应执行git reset --hard origin/develop

请注意还有其他的方法可以做到这一点,比如使用 git rebase 或使用交互式的 rebase。但这是我能想到的最简单的方法,适用于那些 git 经验不确定的人。
请注意,如果你担心万一出了意外无法恢复,你可以使用 git tag 来创建 rescue tags。

如果有多个“错误提交”,您可以使用 git rebase 而不是多个 git cherry-pick - Code-Apprentice
1
当然可以 - 有更快、更聪明的方法,但是挑选可能需要更多手动操作。我认为这是一种“更安全”的方法,特别是对于相对不熟悉 git 的初学者来说。 - Alexander Nied
请注意,我的评论更多是为了问题提出者和未来的访问者,而不是为了回答者。我假设既然您在[tag:git]中回答问题,那么您很可能熟悉rebase。 - Code-Apprentice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接