git commit --amend包括上次提交的文件吗?

3
Git书似乎在关于git commit --amend的内容上存在自相矛盾的情况:
引用如下:

该命令将使用您的暂存区进行提交。如果您没有进行任何更改,那么您的快照将完全相同,并且您要更改的只是提交消息。

首先,它说:“该命令将使用您的暂存区进行提交。”
现在,如果我运行git add -A; git commit -m“Initial”;git status;,状态消息会显示暂存区为空。
然后,该书说:“如果您自上次提交以来没有进行任何更改...您的快照将完全相同...”
现在,如果它使用我的(空)暂存区进行提交,那么修改后的提交是否应该为空呢?但是修改后的提交并不为空,它包括上次提交中的文件。
因此,Git书应该这样写:
引用如下:

该命令将使用您的暂存区,将其添加到上次提交中,并从组合中创建新的提交...

请帮我看一下,我是否漏掉了什么?

你看过 https://dev59.com/6l8e5IYBdhLWcg3wPIaA#25948372 吗? - jub0bs
1
不,它不会创建一个新的分支。相反,当您修改提交时,指向该提交的分支将指向由 git commit --amend 创建的新提交。 - jub0bs
@Jubobs 在你的回答中,第二张图中的 master 指向的是 c 而不是 d。我猜这是因为我们处于分离 HEAD 的状态。你回答中的分离 HEAD 部分增加了原问题所需的复杂度,也让回答对我来说不够清晰。 - Shaun Luttin
1
@ShaunLuttin 是的。我在那里回答的案例有点特殊,因为我们处于分离的 HEAD 状态。但通常情况下,当前分支只是被指向由 git commit --amend 创建的新提交。 - jub0bs
@Jubobs 我问了一个新问题:https://dev59.com/D18e5IYBdhLWcg3wJXrm - Shaun Luttin
显示剩余3条评论
1个回答

4

这段话的措辞有点别扭,但你的理解是正确的。这正是--amend的作用。

这本书似乎在说它不会自动将未暂存的更改添加到提交中。

相反,正如您正确指出的那样(并且该书我认为表述不够清楚),旧的提交被替换为另一个提交,该提交具有与原始提交相同的更改,但可能具有新的提交消息、时间戳和提交哈希值。这就是所谓的快照:repo在那个时刻的状态。

当然,如果您确实有暂存的更改,则这些更改将被合并到新的提交中。


1
提交消息可能完全相同,但作者/提交时间戳将与原始提交不同。 - jub0bs
@Jubobs 你说得对,我在说旧的提交被新的提交替换时已经提到了这一点。我会更明确地表述这个区别。 - Jason Baker
一些建议的修改:「它与原始版本具有相同的更改,但可能有一个新的提交消息(可能来自暂存区的新文件),以及一个新的时间戳。」 - Shaun Luttin
我能理解那可能会让人感到困惑;我已经更加明确地表述了,并且添加了一个我在研究这个答案时遇到的有趣边缘情况。 - Jason Baker
这是不正确的。git commit仅适用于已暂存到索引中的更改,无论是否存在--amend选项,甚至对于在您要修改的提交中修改的文件的未暂存更改也是如此。 - Code-Apprentice
@Code-Apprentice 这是更明智的行为,而且这正是我实际观察到的;我需要停止在那么晚回答问题。 - Jason Baker

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