在 magit 中,我可以交互地变基到另一个分支吗?

In magit, can I interactively rebase onto another branch?

我有一个功能分支,我想在 master 上交互变基,比如:

A - B - C - D (master)
     \
      E - F (feature)

想要的结果是

A - B - C - D (master) - E - F (feature)

在 E 和 F 之后使用一些健全性检查脚本 运行(在 rebase-todo 文件上使用 exec 行)。

但是,如果我转到 magit 的日志缓冲区并在提交点 D 上键入 r e,magit 将执行 git rebase -i D^ 而不是 git rebase -i D,因此功能的提交从 C 重播。我想要的是rebase到master的尖端,而不是master^。

所以:

  1. 有没有办法强制 magit 将交互式变基基于 D,我在日志缓冲区中指向的位置,而不是我指向的位置的父级?
  2. magit 似乎不会在非交互式 rebase 中自动附加 ^。为什么会出现差异?跨分支交互式 rebase 是不是一个坏主意?

顺便说一句,我知道有解决方法:我可以下拉到命令行;我可以将其拆分为一个分支内交互式 rebase,然后是一个非交互式 rebase;或者我可以在 master 上做一个虚拟提交。 None 其中非常方便。我想知道的是是否有一种方法可以一步完成,如果没有,是否有一些我应该知道的智慧。

在 Git 中,必须 select 在第一个要变基的提交之前提交。在 Magit 中,必须 select 第一个提交要变基。就这么简单 - select 你想要变基的第一个提交。

问:为什么 select Git 中的 "prior commit" 之一?

A:因为 FROM..TO 在所有 Git 中都是这样解释的。 FROM 是排他性的,TO 是包容性的。从 "language" 的角度来看,这是有道理的。

问:为什么在Magit中不一样?

A:因为考虑到 Magit 的 UI,这没有多大意义。 "To select X you have to select Y, because it comes before X"有点奇怪。

在某些情况下,这也会使开始变基变得更加困难。例如。状态缓冲区列出未推送的提交。要以交互方式对其中一些提交进行变基,请移至要变基的第一个提交,并且 r e。第一个要变基的提交可能是第一个未推送的提交。如果您必须 select 提交 "before that",那么从状态缓冲区就不可能轻易实现,因为 "last commit which was pushed" 不是 "commits that haven't been pushed yet" 的一部分,因此是' 如此列出。相反,您必须在单独的缓冲区中显示完整的日志 (l l),移动到提交,启动 rebase,然后退出日志缓冲区以返回到状态缓冲区,其中正在显示有关正在进行的 rebase 的信息。


此外,您使用了错误的命令 "transplant" 一个分支到另一个分支。而是使用 r r。如果 master 被正确配置为 feature 的上游,那么它将作为分支的默认选择提供,以将当前分支 变基到 .