【问题标题】:Git: cancel an interactive rebaseGit:取消交互式变基
【发布时间】:2015-11-06 01:05:46
【问题描述】:

我喜欢git rebase -i HEAD~5 来压缩我的提交。有时我认为我需要返回 5 次提交,但后来意识到我需要 7 次。但是 git 已经在 vim 中调出了 rebase 编辑器.git/rebase-merge/git-rebase-todo

如果我退出该缓冲区(vim),那么 git 会说:

Successfully rebased and updated refs/heads/my-branchname

有没有办法在编辑器中阻止变基?我想我可以从另一个 shell 中git rebase --abort,但不确定这会对我正在另一个缓冲区中编辑的git-rebase-todo 文件产生什么影响。

【问题讨论】:

  • 如果您没有更改文件中的任何内容,那么即使分支“已成功重新定位”所有提交都是相同的,因此它实际上是无操作的。
  • @MikeH-R 不一定是无操作。我已经这样做了,它产生了一堆与起源不同的差异。因为变基删除了分支拥有的合并提交。您的 :cq 不会这样做,导致实际无操作。

标签: git vim rebase


【解决方案1】:

您可以通过键入:cq 使 vim 退出并使用非零退出代码来取消变基。这样做的结果是:

$ git rebase -i HEAD~4
# enter vim, then type :cq<enter>
Could not execute editor

从vim帮助页面我们看到cq是cquit的缩写:

                                                        *:cq* *:cquit*
:cq[uit][!]             Quit Vim with an error code, so that the compiler
                        will not compile the same file again.
                        WARNING: All changes in files are lost!  Also when the
                        [!] is not used.  It works like ":qall!" |:qall|,
                        except that Vim returns a non-zero exit code.

【讨论】:

  • 好吧,我咬一口; :cq 是什么?
  • @Meltemi 我用cq 的解释更新了我的答案。
【解决方案2】:

如果您在初始交互式 rebase 编辑器窗口中,如下所示:

pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file

# Rebase 710f0f8..a5f4a0d onto 710f0f8
...
...
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.

您可以通过删除编辑器窗口的全部内容并保存它来中止变基,或者导致编辑器关闭并显示错误代码。

在 vim 中,这可以通过 d SHIFT+g 后跟 :wq 来完成,或者像 Mike H-R 指出的那样使用 :cq 导致编辑器出现错误退出。

如果您已经离开该窗口并继续执行以下 squash/edits/etc,则这不会中止整个 rebase,而只会中止对当前正在编辑的提交的更改。此时您可以像上面一样杀死编辑器,但另外您还必须在命令行上执行git rebase --abort

【讨论】:

  • 这是不正确的。如果您想中止整个变基操作,但您处于一系列交互式变基的最后一个壁球,这不会“中止”交互式变基。它只会中止当前的变基步骤提交。
  • @fourpastmidnight 我不太确定我是否跟随。删除和保存仅适用于您选择选择/挤压/编辑/等的初始编辑器窗口。如果您已经离开它并且在编辑器中进行单独的壁球分辨率,那么这不适用。你说的是这种情况吗?
  • 是的,完全正确。我理解 OP 的问题是关于中止 整个 变基过程,但仅在 OP 在编辑器窗口中进行壁球之后,例如。昨天我发现自己处于类似情况,并尝试了您在回答中提出的建议。不幸的是,它的行为方式与您刚才在评论中描述的方式相同。也许澄清你的答案会帮助其他人避免我的错误(我自己对交互式 rebase 有点陌生)。无论如何,我能够再次变基并编辑/拆分提交,但行为出乎意料。
  • 与其说“它将中止 rebase”,不如说“这将导致当前的 rebase 提交被中止”。这使得真正发生的事情更加清楚。您是否知道在编辑器窗口中中止 整个 rebase 的方法? vim :cq “技巧”是否真的可以从上面的答案中工作?
  • @fourpastmidnight 我已经改写了它并添加了更多信息。希望这有助于避免将来出现混淆。据我所知,:cq 技巧相当于删除和保存这种特殊情况。
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 2020-11-08
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2021-07-23
  • 2016-01-24
相关资源
最近更新 更多