如何修改提交记录而不改变提交信息(重复使用之前的信息)?

969

是否有一种方法可以修改提交内容,而不需要弹出 vi (或您的 $EDITOR)选项来更改提交消息,而只需重复使用先前的消息?


10
在吃过亏、了解修改的危害之后,我会给自己的问题投反对票。 - Sridhar Sarnobat
67
只要你遵守一定的规则(例如不修改已经提交的内容),修订就没有必要成为一件坏事。 - paullb
7
修订提交不应用于在单个逻辑更改期间间歇性提交工作。对此,您应该正确地在本地提交,然后在完成后压缩提交历史记录。 - DBCerigo
4
我完全同意 @DBCerigo 的观点。我认为修改操作只有一种情况是有用的,就是当我在之前的提交中忘记将某个文件加入到暂存区(例如,这是一个新文件,在运行 git commit -a 时未自动加入),并且想要对其进行追加提交。 - Sridhar Sarnobat
1
即使您意识到更改历史记录的危险,有时修改仍然很有用,例如如果您对最近的提交消息不满意并希望重新措辞而无需进行变基。 - Sridhar Sarnobat
显示剩余3条评论
8个回答

1507
自 Git 1.7.9 起,您也可以使用 git commit --amend --no-edit 来获得结果。
请注意,这将不包括其他提交的元数据,如时间戳或标签,这可能重要或不重要。

63
您还可以通过添加别名来更轻松地默认使用“--no-edit”标志:“amend = commit -a --amend --no-edit”。 - Jherico
12
我建议你去掉"-a"。请进行原子提交,这样更容易审核或者变基 :) - frouo
21
git config --global alias.amend 'commit --amend --no-edit' - mfink
3
“不包括其他提交的元数据”是什么意思?据我所知,它的行为与没有使用“--no-edit”时完全相同,只需保存提交消息即可。它保留了“AuthorDate”,并更新了“CommitDate”。 - detuur
1
除了 --amend 命令,实际上还有一个很有用的命令可以改变最后一次提交的信息... - Ben

158

git commit -C HEAD --amend会实现你想要的功能。 -C选项会从另一个提交中获取元数据。


23
补充安迪的回答。如果这是你经常需要做的事情,那么你可以使用 git config --global alias.amend 'commit --amend -C HEAD' 命令设置一个别名来代替它。之后你可以使用 git amend 作为快捷方式。 - mikej
12
来吧,伙计们,不要懒惰,升级Git并使用Shaggle建议的内置命令!虽然-C选项也很好。 - Dimitris Baltas
6
不仅需要时间戳,还需要作者信息! - user1338062
4
@RyanCastner,确实,你所说的评论是来自2013年。使用我当前运行的git版本中的--amend选项,即使没有其他选项,也会保留作者日期(但更改提交日期)。因此,我已经删除了我的旧评论。 - Ruben Verborgh
2
实际上,即使这不是被接受的答案,它也有不同的价值。与其他答案不同,你不必使用“--amend”。你可以创建一个新的提交,但使用与之前提交相同的消息。这听起来可能没有用处,但当我只是保存工作而不必考虑良好的提交消息时,默认情况下的提交消息是“--message=“正在进行的工作(未经测试)””。 - Sridhar Sarnobat
显示剩余4条评论

89

如果你的编辑器是vi(m),那么另一个(有些傻)的可能性是使用git commit --amend <<< :wq命令。


53
即使在这种情况下不必要,我还是不知道你可以将内容管道导入到vim中。这打开了一些有趣的可能性。好的提示。 - Sridhar Sarnobat
10
“...<<< ZZ” 可能需要的键入甚至更少 ;) - Ruslan
9
甚至更少 - ... <<< :x :) - skwisgaar
3
我不认为这是愚蠢的。这是改进任何打开vi命令工作流程的好方法。 - B Seven
17
三角括号,这很新奇。 - oligofren
显示剩余3条评论

43

扩展已接受的答案,您还可以执行以下操作:

git commit --amend --no-edit -a

添加当前更改的文件。


27

您可以保存一个使用别名的命令,该命令使用被接受的答案,因此它可以像这样使用:

git oops

将所有修改内容加入,并使用相同的提交信息进行修订。

git oops -m "new message"

使用新的提交信息。


这是别名:

 oops = "!f(){ \
    git add -A; \
    if [ \"$1\" == '' ]; then \
        git commit --amend --no-edit; \
    else \
        git commit --amend \"$@\"; \
    fi;\
}; f"

12
只是为了更加清晰,您需要使用 git add 来分步提交更改,然后修改上一次的提交记录:
git add /path/to/modified/files
git commit --amend --no-edit

这对于你忘记在上次提交时添加一些更改或者想要添加更多更改而不创建新的提交非常有用。

5

我看到这个问题已经被回答了,但如果你想像高效的机器一样添加、提交和推送,你可以将所有命令合并在一起,在一行中完成。

git add .; git commit --amend --no-edit; git push

现在,当您每次提交只进行小的更改时,您可以按UP键并一次性完成所有更改。

希望这能帮助到某些人 :)

注意:这不是使用git的干净方式,我只建议在经常进行小更改时使用。例如,总是使用添加.(所有更改)可能会导致您暂存不想添加的更改,从而导致commit混乱。


1
git commit --amend 不需要使用 --force 参数来推送。 - Sagiv b.g
1
git commit --amend 不需要使用 --force 参数来推送。 - undefined
1
@Sagivb.g 谢谢你的回答。是的,如果你想修改的上一个提交已经在远程仓库中存在,那么就需要使用强制推送。根据反馈,我会修改我的回答。 - vince

3

白痴级别的完整教程

当你完成代码更改后。

1.- 使用git status终端中检查更改;

2.- 通过使用git add .git add /your.file/逐个文件地添加,使用前一个命令将帮助你在最后一种情况下进行操作;

3.- 一旦您的更改已经被暂存,现在可以使用git commit --amend --no-edit。这将将您最近的更改添加到上次提交中,而无需编辑消息。

4.- 最后,如果您没有推送您之前的提交,只需执行git pushgit push origin/yourBranch.
如果您已经推送了上次提交,请使用git push -fgit push -f origin/yourBranch


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