使用Sourcetree撤销推送到远程的更改

28

我无意中将一个功能分支推到了远程主分支。现在我想将主分支还原到之前的提交记录。当我选择“将当前分支恢复到此提交”时,只有本地分支被还原了,由于远程主分支已经超前了55个提交(因为我不小心推送了代码),所以我无法将刚刚还原的本地主分支推送到远程。

在查阅了 Stack Overflow 和 Google 后,我发现许多人使用命令行进行强制推送。但由于我使用的是 Source Tree,我希望找到一种实际使用 Source Tree 的方法。

我也发现了 rebase 选项,但似乎找不到逐步教程...

有什么好的建议吗?

3个回答

30
当您提交代码时,如果需要撤销提交(而不是使用 -f 强制提交),最安全的方法是使用 revert 函数,这样会在之前的提交上创建一个新的提交。
在 Sourcetree 中可以通过右键单击要撤销的提交并选择“Reverse commit…”来实现。

enter image description here

您需要对每个要还原的提交进行此操作,按相反的顺序进行。


4
最好的方法是使用下图中显示的 Reset <branch> to this commit 选项。

Reset to previous commit

会弹出一个窗口供您选择代码重置的模式。[见下图] Choose the mode of reset 请注意:这不完全是代码撤销,而是将您的提交从本地完全删除,并使其看起来更加清洁。

10
这只影响本地分支。如果你已经推送了你的提交,这只是从你的本地代码库中删除数据 - 远程库将会保留所有更改。 - Mage Xy
1
如果您阅读了Atlassian git最佳实践,那么硬重置只允许在本地级别上进行。如果您已经将分支推送到远程,则只需单击“还原此提交”,在观看代码被还原后再将其推送到远程。之前的“坏”提交仍然存在,同时最新的推送对其产生了还原效果。 :) 来源:https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting - CodeFarmer
1
这是我需要的答案,因为我已经在本地机器上推送了代码。但我想要删除本地分支中已经推送的提交。这个方法完美地帮助了我。感谢@LearnerAllTheWay。 - Arun Prasad

1

Sourcetree不向您公开-f标志:https://answers.atlassian.com/questions/54469/how-do-i-perform-a-forced-push-push-f-from-sourcetree

因此,将远程还原到其原始状态的唯一方法是以相反的顺序git revert每个引入的提交。

假设远程在提交A上,并且您推送了包含提交BCD的功能分支,则必须执行以下操作:

git revert D
git revert C
git revert B
git push

推送操作会正常工作,因为您没有修改已推送的历史记录,而是推送了一组新的更改。
如果您想将撤消的系列缩短为一个提交,则可以执行以下操作:
git rebase -i origin/master

选择每个需要撤销的提交(commit)并将它们合并(squashed)。这样,你的推送(push)只会包含一个提交(commit),一次性撤销了 DCB


我发现大多数与sourcetree相关的答案都说不需要使用-f参数,而可以使用rebase命令来完成。我有点猜测应该有一种sourcetree的方式可以实现这个功能,但是你的回答似乎意味着不能仅使用sourcetree来完成?SO上的其他答案也展示了实际的GIT命令,而非sourcetree步骤。我不够精通GIT,无法自己进行翻译。 - KrekkieD
这不能使用rebase完成。如果您愿意使用控制台,请在那里指定“-f”标志。 - eckes
那么仅使用SourceTree是不可能的吗? - Michael Kloet
@MichaelKloet,是的,只使用Sourcetree也是可以实现的,详见我的回答。 - Jesús Carrera

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