使用Magit将更改添加到先前的提交


43

我有2次提交,先提交A然后提交B。我意识到我忘了在A中添加一些内容。

如何使用Magit将此更改添加到A?我什至不知道我应该看一下Git文档的哪一部分。

Answers:


68

让我们假设您想向HEAD提交中添加一些内容,即示例中的“第二个提交B”。

提交弹出窗口c具有绑定的“ a修订”。按下该键将“修改” HEAD提交的阶段更改。由于提交在Git中不可更改,因此实际上将用新提交替换旧提交。将会弹出带有旧提交消息的缓冲区,以便您进行修改,以防添加的更改也需要您调整消息。与往常一样,C-c C-c在编辑完消息后按。这等效git commit --amend于在命令行上运行。

  • a 修改 -将分段更改添加到HEAD并编辑其提交消息

由于通常只需要调整更改消息,Magit提供了两个附加变体:

  • e 扩展 -将分段更改添加到HEAD而不编辑提交消息
  • w Reword-更改消息,HEAD而不向其添加分段更改

当您要编辑一个不是的提交时,HEAD以上内容将不起作用。这些命令总是“修改”(即替换)HEAD提交。除了提供Git之外,它没有提供任何用于修改提交的命令,HEAD因此涉及的更多。

Magit 确实提供了这样的命令,但是由于在某些情况下最好分多个步骤执行,因此我们将首先讨论。

修改提交HEAD可以分为三个步骤:

  1. 暂时使其他提交(AHEAD
  2. 修改HEAD(如上所述),生成commit A'
  3. 告诉Git重新应用随后的提交A,但要优先于A'

这可以使用交互式变基来完成。键入r以显示变基弹出窗口。然后键入m以调用“编辑提交”变基变种。出现具有最近提交的缓冲区。移至要修改的提交,然后键入C-c C-c以选择它。然后,Git将历史记录回退到该提交,并在状态缓冲区中显示有关正在进行的变基的信息。

HEAD如上所述进行修改。然后通过键入告诉Git您已完成r r。如果A'B冲突,则重新定位将在处停止,B您必须解决冲突。完成后,请按r r继续。

如果您知道对的更改A将导致与冲突B,请按照上述说明进行操作,否则请使用以下方法。


Git允许使用创建“修复提交” git commit --fixup A。这将创建一个新的提交,其中记录了“应该在另一个提交中进行的更改”。那个提交变成了新的提交HEAD。还存在一个--squash变体。有关差异的信息,请参见git-commit手册页。

要实际合并A提交和新提交A',然后重新应用B,必须使用rebase。Magit提供了一个方便的命令来执行此操作r f

与上述方法的主要区别在于,这里我们首先创建一个新的提交,然后将其重新组合以将其与“ target”组合并重新应用B。上面我们从重新定级而不是提交开始。

在Magit中,--fixup--squash变体都可以从提交弹出式窗口中f和上获得s。但Magit还提供了修正和壁球命令的“即时”变种FS。这些变体会像“非即时”变体一样创建一个新的提交,但随后它们会使用rebase立即将修订提交与目标提交结合起来,而无需调用其他命令。

“即时修正”(c F)与“扩展HEAD”(c e)基本相同,不同之处在于它适用于任何提交,而不仅仅是HEAD


进一步阅读:


晶莹剔透!谢谢你,超棒的BTW。
Mathieu Marques's

1
好吧,我认为答案的后半部分有些糊涂。但是要避免这些问题,我将不得不把这个已经很长的答案的长度加倍,所以我很高兴这对您
有用

感谢您的回答tarsius,这确实对我有用。
anquegi

上半部分的解释很清楚,使得阅读后半部分非常困难,令人沮丧!
Lyn Headley

git-commit手册页重定向到git-rebase(1)以下行:折叠提交的建议提交消息是第一次提交和使用“ squash”命令的提交消息的串联,但是省略了使用“ fixup”提交的提交消息命令。IOW,如果只想修复上一次提交中的代码,请使用fixup,如果还想修复提交消息,请使用squash
Yasushi Shoji

3

git commit --amend –C HEAD是您要查找的Git命令,您可以使用进行Magit的修改C-c C-a


我使用的是Magit最新C-c C-a版本,是较旧的版本(我认为)。此外,我在帮助缓冲区(?)中看不到“修改”的痕迹。
Mathieu Marques's

有关等效的magit 2.x,请参见Rémi的答案
npostavs

3

因此,一个工作流程是:

  • 做出改变
  • c(提交)f(修复-选择提交您的修复)

然后

  • r(变基)-a(自动压扁,可以默认)i(交互式)

自动压扁将自动将所有!fixup提交移动到正确的位置,并将它们设置为在重新基准上被压扁。


我唯一没有做的是在第一颗子弹和第二颗子弹之间上演。击中i让我屈服Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.。除了我没有任何未提交的更改。:/
Mathieu Marques's

拉动后再次尝试Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort。是否要告诉我我的修正可能会拖延即将进行的合并?
Mathieu Marques's

@MathieuMarques:“除了我没有任何未提交的更改”-git认为你可以。请注意,该消息表明已进行阶段性更改,而不是未进行阶段性更改。回复:merge in rebase,请参见下的错误git help rebase。我建议在拉向上游之前先进行修复。
npostavs

1

为了修改上一次提交,它是“ c a”。修正是为了修正一些较旧的提交。


在这种情况下,我先提交A,然后提交B。为清楚起见,更新了帖子。
Mathieu Marques's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.