撤销 Git Rebase

4

我正在使用IntelliJ在一个功能分支上工作,我想将我的团队在主分支上所做的更改集成到我的分支中,但我搞砸了。
我检出了主分支,在Git弹出窗口中选择了功能分支,并选择了“将当前重新定位到所选”,认为这会将来自主分支的更改添加到功能分支的顶部,不幸的是它发生了相反的情况。 现在我想撤消这个在主分支上的rebase,我想将主分支恢复到最新的head commit。
有什么建议吗?
我读到说rebase会创建一个新的提交,但我认为这没有成功,因为我有冲突,当我从git命令行运行git status从主分支时,我看到:

You are currently rebasing branch 'master' on 'FEATURE/....'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

没有更改添加到提交中(使用“git add”和/或“git commit -a”)


3
由于您使用的是IntelliJ而不是命令行,我只能说,是的,您仍处于rebase的某个部分中。如果您想放弃,请从命令行运行git rebase --abort来终止并返回到开始之前的状态,但如何在IntelliJ中执行此操作,我不知道。 - torek
2
@torek 我想我会关闭IntelliJ并从命令行中运行它,然后重新启动IntelliJ,我认为从现在开始最好全部通过命令行进行操作。 - JBoy
@JBoy FWIW,我建议人们通过命令行来操作Git。Git本身已经很难懂了,不需要再增加另一层。我建议使用可视化工具来检查和呈现存储库,但不要用于进行更改。 - Schwern
3个回答

11
如果rebase没有完成,只需中止它。如果由于冲突而停止了rebase,则会出现解决冲突的提示。如果您取消合并提示而不解决冲突,则应出现一个通知,其中包含解决冲突、继续和中止的选项。 Rebase notification 此外,在进行rebase时,中止rebase的操作可在“分支”弹出窗口的顶部执行。

Branches popup

它也可以在VCS - Git菜单中找到。您可以始终使用“查找操作”(Ctrl + Shift + A)或“搜索所有内容”(双重Shift)来查找它。或者在命令行中使用git rebase --abort,例如通过内置终端(Alt + F12打开它)。
如果rebase已经完成,则应将当前分支(仍为master)重置为其曾经存在的提交。除非有未推送的提交,否则可以将其重置为与origin/master相同的提交。
如果有未推送的提交,则必须在命令行上使用git reflog查找提交的哈希值,然后在那里重置当前分支。
顺便说一下,IntelliJ显示提示以澄清操作。当您在分支弹出窗口中选择操作时,状态栏会显示该操作的描述及确切的分支名称。

2

有什么建议吗?

首先从命令行使用Git,等熟悉了日常命令再切换到GUI界面。

我建议您了解一下 git rebase 来便于操作。

git-rebase - 重新应用提交到另一个基础上

(来自: https://git-scm.com/docs/git-rebase)

回答...

您正在进行rebase过程中,但根据我的经验,大多数GUI界面都无法正确处理rebase过程。

请按照以下步骤操作:

  1. 在终端(linux、osx)或Git Bash(Windows)中打开存储库文件夹。
  2. 让我们放弃当前过程并重新开始,在终端执行:"git rebase --abort"。此命令将使您的master 回退到在rebase 开始之前的HEAD状态。

从现在开始,我们通过终端来执行rebase,但请记住像合并一样,rebase也必须从要更新的分支开始:

  1. git checkout master 或您想要从feature branch中获取新提交的branch
  2. git rebase my_feature_branch:请阅读终端输出! 您将获得足够的指示来完成此rebase过程。

PS: 您可能会遇到许多步骤和许多 git rebase --continue ,但不用担心,这是Git的正常行为。一旦出现冲突,请像普通合并一样处理它,如果需要提交并继续进行。


0
所以现在我想要做的是撤销这个在主分支上的变基,我想要将主分支恢复到最新的提交。
假设你正在自己本地的仓库副本中工作,该仓库托管在某个服务器上。在这种情况下,服务器上有一个完好无损的主分支版本,你只需要告诉 Git 用服务器上的主分支替换你本地的主分支即可。假设共享仓库名为“upstream”。你可以执行以下操作:
git checkout master

为确保您真正处于所期望的master分支上,请执行以下操作。您即将删除所有本地更改以切换到master分支,因此最好确认您所在的位置正确无误。然后执行以下步骤:

git fetch upstream master
git reset --hard upstream/master

完成后,你的master应该与服务器上的一致。有关此主题的更多信息,请查看相关问题如何强制“git pull”覆盖本地文件?


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