我有2次提交,先提交A然后提交B。我意识到我忘了在A中添加一些内容。
如何使用Magit将此更改添加到A?我什至不知道我应该看一下Git文档的哪一部分。
我有2次提交,先提交A然后提交B。我意识到我忘了在A中添加一些内容。
如何使用Magit将此更改添加到A?我什至不知道我应该看一下Git文档的哪一部分。
Answers:
让我们假设您想向HEAD
提交中添加一些内容,即示例中的“第二个提交B”。
提交弹出窗口c具有绑定的“ a修订”。按下该键将“修改” HEAD
提交的阶段更改。由于提交在Git中不可更改,因此实际上将用新提交替换旧提交。将会弹出带有旧提交消息的缓冲区,以便您进行修改,以防添加的更改也需要您调整消息。与往常一样,C-c C-c在编辑完消息后按。这等效git commit --amend
于在命令行上运行。
HEAD
并编辑其提交消息由于通常只需要调整更改或消息,Magit提供了两个附加变体:
HEAD
而不编辑提交消息HEAD
而不向其添加分段更改当您要编辑一个不是的提交时,HEAD
以上内容将不起作用。这些命令总是“修改”(即替换)HEAD
提交。除了提供Git之外,它没有提供任何用于修改提交的命令,HEAD
因此涉及的更多。
Magit 确实提供了这样的命令,但是由于在某些情况下最好分多个步骤执行,因此我们将首先讨论。
修改提交HEAD
可以分为三个步骤:
A
)HEAD
。HEAD
(如上所述),生成commit A'
。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还提供了修正和壁球命令的“即时”变种F和S。这些变体会像“非即时”变体一样创建一个新的提交,但随后它们会使用rebase立即将修订提交与目标提交结合起来,而无需调用其他命令。
“即时修正”(c F)与“扩展HEAD
”(c e)基本相同,不同之处在于它适用于任何提交,而不仅仅是HEAD
。
进一步阅读:
git-commit(1)
git-rebase(1)
git-commit
手册页重定向到git-rebase(1)
以下行:折叠提交的建议提交消息是第一次提交和使用“ squash”命令的提交消息的串联,但是省略了使用“ fixup”提交的提交消息命令。IOW,如果只想修复上一次提交中的代码,请使用fixup,如果还想修复提交消息,请使用squash。
git commit --amend –C HEAD
是您要查找的Git命令,您可以使用进行Magit的修改C-c C-a
。
C-c C-a
版本,是较旧的版本(我认为)。此外,我在帮助缓冲区(?
)中看不到“修改”的痕迹。
因此,一个工作流程是:
然后
自动压扁将自动将所有!fixup提交移动到正确的位置,并将它们设置为在重新基准上被压扁。
i
让我屈服Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.
。除了我没有任何未提交的更改。:/
Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort
。是否要告诉我我的修正可能会拖延即将进行的合并?
merge in rebase
,请参见下的错误git help rebase
。我建议在拉向上游之前先进行修复。