如何修改现有的、未推送的提交消息?

git git-commit git-rewrite-history git-amend

这个问题的答案是社区的努力。编辑现有答案以改进这篇文章。它目前不接受新的答案或交互。

我在提交消息中写错了。

如何更改消息?提交尚未推送。

对于那些对 git 有点陌生的人:Laurie 关于尚未推送的观点很重要。就像变基一样,这正在改变历史。如果有人在原始历史记录和重写历史记录之间从您的仓库中克隆/拉取,那么他们将无法在重写之后拉取(对于该分支)。

3
34 revs, 28 users 18% user456814

修改最近的提交信息

git commit --amend

将打开您的编辑器,允许您更改最近提交的提交消息。此外,您可以直接在命令行中设置提交消息:

git commit --amend -m "New commit message"

…但是,这会使多行提交消息或小的更正输入更加麻烦。

确保在执行此操作之前没有暂存任何工作副本更改,否则它们也会被提交。 (未暂存的更改不会被提交。)

更改已推送到远程分支的提交消息

如果您已经将提交推送到远程分支,那么 - 在本地修改提交之后(如上所述) - 您还将 need to force push the commit 使用:

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

警告:强制推送将用本地分支的状态覆盖远程分支。如果远程分支上有本地分支中没有的提交,您将丢失这些提交。

警告:修改您已与其他人共享的提交时要小心。 修改提交实质上是重写它们以具有不同的 SHA ID,如果其他人会造成问题有你重写的旧提交的副本。任何拥有旧提交副本的人都需要将他们的工作与您新重写的提交同步,这有时会很困难,因此请确保在尝试重写共享提交历史时与其他人协调,或者只是避免重写共享提交共。

执行交互式变基

另一种选择是使用交互式变基。这允许您编辑要更新的任何消息,即使它不是最新消息。

为了做一个 Git squash,请按照以下步骤操作:

// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n

压缩提交后 - 选择 e/r 来编辑消息:

https://i.stack.imgur.com/LVcm9.png

关于交互式变基的重要说明

当您使用 git rebase -i HEAD~n 时,可能会有 更多 次提交。 Git 将“收集”最后 n 次提交中的所有提交,如果在该范围之间的某处有合并,您也会看到所有提交,因此结果将为 n + 。

好提示:

如果您必须为多个分支执行此操作,并且在修改内容时可能会遇到冲突,请设置 git rerere 并让 Git 自动为您解决这些冲突。

文档

git-commit(1) 手册页

git-rebase(1) 手册页

git-push(1) 手册页

但是 git commit --amend 不如 git rebase -i 强大。

@jeffjose,绝对不需要。此外,git commit --amend 可以修复(a?)主提交。

如果您已经推送,只需再次强制推送:git push -f origin branchname

如果其他人使用同一个存储库,@hughes git push -f 会不会有点危险?

如果您不想重写整个提交消息,请选择 git commit --amend -c HEAD。这将打开预先填充了您的旧提交消息的编辑器,因此您可以更改它。

D
David Ferenczy Rogožan
git commit --amend -m "your new message"

我做了 git commit --amend -m "New message",但是推送到 Github 生成了“在再次推送之前合并远程更改”。 pull 之后,commit --amend,再push,新消息就没有出现了。相反,我有“合并 github.com 的分支'master':[myrepo]”

@DaveEveritt 您很可能在尝试修复之前将您的提交推送到上游。

@Kyralessa 不正确。在 bash 中,您可以通过在完成之前不关闭引号来轻松编写多行提交消息(在引号内的每行末尾点击 return)。

我不明白一个看起来很像两年前写的答案的主要思想的答案,而且接受的答案也获得了如此多的选票。奇怪的。 (虽然答案没有错)

@AmalMurali,好吧。我的观点与问题的受欢迎程度无关,也与答案的实用性无关。但是这个特定的答案不是最古老的答案,也没有提供任何对已接受答案的进一步洞察。它似乎是已接受答案的一部分的副本。那是我的观点。干杯!

P
Peter Mortensen

如果您要修复的提交不是最新的:

git rebase --interactive $parent_of_flawed_commit 如果你想修复几个有缺陷的提交,请传递其中最旧的提交的父级。一个编辑器会出现,列出自你提交以来的所有提交。在您要修复的任何提交之前更改选择以重新编写(或在旧版本的 Git 上进行编辑)。保存后,Git 将重播列出的提交。对于您想要改写的每个提交,Git 都会将您拉回到您的编辑器中。对于您要编辑的每个提交,Git 会将您放入 shell。如果您在 shell 中:以您喜欢的任何方式更改提交。 git commit --amend git rebase --continue

这个序列的大部分内容将通过各种命令的输出向您解释。这很容易;您无需记住它 - 只需记住 git rebase --interactive 可让您更正提交,无论它们是多久以前的。

请注意,您不会想要更改已推送的提交。或者你可能会这样做,但在这种情况下,你将不得不非常小心地与每个可能已经取消你的提交并在他们之上完成工作的人进行沟通。 How do I recover/resynchronise after someone pushes a rebase or a reset to a published branch?

可以更改第一次提交的消息(没有父项)吗?

这在其他答案之一中有所提及,但我会在此处记下。从 git 1.6.6 开始,您可以使用 reword 代替 pick 来编辑日志消息。

顺便提一下,$parent_of_flawed_commit 等价于 $flawed_commit^

如果您已经向上游推送,永远不要这样做(或一般地变基)!

如果在有缺陷的提交后有合并,请使用 -p (--preserve-merges)。

P
Peter Mortensen

要修改先前的提交,请进行所需的更改并暂存这些更改,然后运行

git commit --amend

这将在您的文本编辑器中打开一个文件,代表您的新提交消息。它开始填充旧提交消息中的文本。根据需要更改提交消息,然后保存文件并退出编辑器以完成。

要修改先前的提交并保持相同的日志消息,请运行

git commit --amend -C HEAD

要通过完全删除之前的提交来修复它,请运行

git reset --hard HEAD^

如果要编辑多个提交消息,请运行

git rebase -i HEAD~commit_count

(将 commit_count 替换为您要编辑的提交数。)此命令将启动您的编辑器。将第一个提交(您要更改的那个)标记为“编辑”而不是“选择”,然后保存并退出您的编辑器。进行您要提交的更改,然后运行

git commit --amend
git rebase --continue

注意:您还可以从 git commit --amend 打开的编辑器中“进行所需的更改”

git rebase -i HEAD~commit_count 还允许您更改您选择的提交的提交消息。只需将所选提交标记为“reword”而不是“pick”。

如果你不想变基怎么办?您只想更改旧消息?

git reset --hard 消除未提交的更改。请将 --hard 替换为 --soft

同意,git reset --hard 是一个完全合法的命令,但考虑到这个问题,它会产生误导。如果您提交了想要丢弃的更改,则使用 --hard,而不是在提交消息中输入错误!

git commit --amend -C HEAD 是金色的!谢谢

Z
Zombo

如前所述,git commit --amend 是覆盖最后一次提交的方式。注意事项:如果您还想覆盖文件,则命令为

git commit -a --amend -m "My new commit message"

如果您不想添加所有内容,您可以先执行 git add file.ext,然后再执行 git commit --amend

P
Peter Mortensen

您也可以为此使用 git filter-branch

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

它不像微不足道的 git commit --amend 那样简单,但它特别有用,如果您在错误的提交消息之后已经进行了一些合并。

请注意,这将尝试重写 HEAD 和有缺陷的提交之间的 每个 提交,因此您应该非常明智地选择 msg-filter 命令 ;-)

如果正则表达式没有找到任何东西,是否有一个版本不会更改提交?

AFAIK filter-branch --msg-filter 无论如何都会生成新的提交。但是,您可以在 msg-filter 中检查 sed 是否成功,并在 filter-branch 操作结束时使用此信息将树重置为 refs/original。

@DavidHogue 仅在使用 filter-branch 方法时才适用。如果您使用交互式变基,则修改提交后的提交 ID 不会更改。

@Mark 是的,他们这样做,他们必须这样做。提交 ID 取决于之前的提交。如果它们不改变,git 将毫无用处。

您需要 $flawed_commit^..HEAD,而不是 $flawed_commit..HEAD。如手册页所述:«该命令只会重写命令行中提到的正引用(例如,如果您传递 a..b,则只会重写 b)。»

P
Peter Mortensen

我更喜欢这种方式:

git commit --amend -c <commit ID>

否则,将会有一个带有新提交 ID 的新提交。

对我来说,使用上面的命令实际上会创建一个带有新提交 ID 的新提交以及一个额外的提交,将“合并分支”作为默认提交消息。

修改总是使用新的提交 ID 创建一个新的提交。提交 ID 是提交内容的 SHA 哈希,包括提交消息和创作/提交的时间戳。这是 Git 的一个特性,除非哈希冲突,否则可以确保具有相同 ID 的两个提交是完全相同的提交,具有完全相同的内容、历史记录等。

同意埃米尔的观点。此外,阅读文档-似乎所有“-c”所做的都是告诉git将哪个提交的消息用作新提交的默认/模板。实际上它已经默认执行“-c ” ,所以不需要指定。

-c 做了一些事情。它默认使用旧消息,但它也复制作者信息(人和时间)。 -C 做同样的事情,只是它不要求您编辑消息。

就像@SantanuDey 一样,它对我不起作用。我得到了fatal: Option -m cannot be combined with -c/-C/-F/--fixup.

P
Peter Mortensen

如果您使用的是 Git GUI 工具,则有一个名为 Amend last commit 的按钮。单击该按钮,然后它将显示您的最后提交文件和消息。只需编辑该消息,您就可以使用新的提交消息来提交它。

或者从控制台/终端使用这个命令:

git commit -a --amend -m "My new commit message"

此答案字面上与此 older one 相同。在提供另一个答案之前,您是否检查过现有答案?

P
Peter Mortensen

您可以使用 Git rebasing。例如,如果你想修改回提交 bbc643cd,运行

$ git rebase bbc643cd^ --interactive

在默认编辑器中,将要修改其提交的行中的“pick”修改为“edit”。进行更改,然后使用

$ git add <filepattern>

现在你可以使用

$ git commit --amend

修改提交,然后

$ git rebase --continue

返回到上一个头部提交。

如果您想确保对 git commit --amend 的更改生效,您可以使用 git show,它会显示新消息。

P
Peter Mortensen

如果您只想修改上一条提交消息,请执行以下操作: git commit --amend

这将使您进入您的文本编辑器并让您更改最后的提交消息。

如果您想更改最后三个提交消息,或者到该点的任何提交消息,请将 HEAD~3 提供给 git rebase -i 命令: git rebase -i HEAD~3

This earlier answer 已经说你可以使用 git commit --amend,它还说你可以使用 git rebase -i HEAD~commit_count,你所做的只是为 commit_count 插入 3

也被否决了。人们只是懒得去read existing answers

这不是完整的答案,缺少“找到您想要的提交,将选择更改为 r(改写)...”,如此处所述 stackoverflow.com/a/28421811/1818723

P
Peter Mortensen

如果您必须在多个分支上更改旧的提交消息(即,带有错误消息的提交存在于多个分支中),您可能需要使用:

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

Git 将创建一个临时目录用于重写并另外备份 refs/original/ 中的旧引用。

-f 将强制执行操作。如果临时目录已经存在或者已经有引用存储在 refs/original 下,则这是必要的。如果不是这种情况,您可以删除此标志。

-- 将过滤器分支选项与修订选项分开。

--all 将确保重写所有分支和标签。

由于旧引用的备份,您可以轻松地回到执行命令之前的状态。

假设您想恢复您的 master 并在分支 old_master 中访问它:

git checkout -b old_master refs/original/refs/heads/master

这个答案没有解决 OP 的问题,因为他们纯粹对修复他们刚刚完成的提交感兴趣。我经常使用 git commit --amend 来修正评论或将我忘记的文件添加到 git add,但只是在我git push编辑之前曾经。当我想完全弄乱版本历史时,我也使用 git filter-branch,但 OP 不想要这个,所以这个答案需要一个很大的健康警告 - 不要在家里尝试这个,偷看!!

P
Peter Mortensen

如果这是您的最后一次提交,只需修改提交:

git commit --amend -o -m "New commit message"

(使用 -o (--only) 标志确保您只更改提交消息)

如果它是一个隐藏的提交,请使用很棒的交互式 rebase:

git rebase -i @~9   # Show the last 9 commits in a text editor

找到您想要的提交,将 pick 更改为 r (reword),然后保存并关闭文件。完毕!

微型 Vim 教程(或者,如何仅用 8 次击键进行变基 3jcwrEscZZ ):

如果你有时间,运行 vimtutor

hjkl 对应移动键←↓↑→

所有命令都可以以“范围”为前缀,例如 3j 向下移动三行

进入插入模式 - 您输入的文本将出现在文件中

Esc 或 Ctrlc 退出插入模式并返回“正常”模式

你撤消

Ctrlr 重做

dd, dw, dl 分别删除一行、单词或字母

cc、cw、cl 分别更改行、单词或字母(与 ddi 相同)

yy, yw, yl 分别复制(“yank”)一行、单词或字母

或 P 分别粘贴在当前位置之后或之前

:wEnter 保存(写入)文件

:q!Enter 退出而不保存

:wqEnter 或 ZZ 保存并退出

如果你经常编辑文本,那么切换到 Dvorak keyboard layout,学习触摸输入,学习 Vim。 Is it worth the effort? 是的。

ProTip™:不要害怕尝试重写历史记录的“危险”命令*——Git 默认在 90 天内不会删除您的提交;您可以在 reflog 中找到它们:

$ git reset @~3   # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* 注意像 --hard--force 这样的选项——它们可以丢弃数据。 * 另外,不要重写你正在合作的任何分支的历史记录。

vim 部分完全是题外话,与其鼓励用户花时间学习使用神秘的编辑器,不如教他们一些更切题的东西,比如如何将默认的 git 编辑器设置为用户友好的东西,比如nano?我们谈论的是需要对文本文件进行的微不足道的修改,而不是会引发关于“最佳”文本编辑器的激烈争论的硬核编码。

@DanDascalescu:因为使用上面的说明学习 Vim 比使用 nano 执行几个 rebase 更快。 git 打开一个文本编辑器而不是它自己的变基界面的全部原因是因为 Vim 存在:它是轻量级的,默认安装在大多数系统上,并且非常容易学习,足以轻松执行变基:例如 ddjjpZZ 移动提交2下来。基本的 Vim 知识一点也不神秘。 Vim 比 nano 更舒服需要 10 分钟。

-o 标志正是我所寻找的:如何在不添加暂存文件的情况下更改提交消息。谢谢!

s
skin

利用

git commit --amend

4. Rewriting Git History 是一篇出色的文章,要详细了解它。它还谈到了何时不使用 git commit --amend

有没有一种好方法来修复已经推送到公共存储库的提交消息?到目前为止,我得出的结论是,一旦被推送,我的提交信息错别字和 thinkos 必须永远存在。

一句话,不!没有很好的方法来收回你推动的东西。所有的缩回或多或少都是坏的。您需要采用在您自己的私有存储库中的分支中工作的纪律,在添加一点、测试一点、调整一点时进行多次提交。然后将你的整个分支合并到一个提交中,写一个新的提交消息来描述整体的变化,校对它,然后推送。

只是为了指出一个明显的问题,即从功能分支返回时不必进行一次提交。许多人所做的是基于目标分支(使事情看起来干净)然后与抑制快速转发的选项合并。同意在你推高之前要小心的要点。

在您写答案之前,已经(多次)给出了 git commit --amend 答案。你怎么又发了?如果您想添加指向“重写 Git 历史”的链接,您可以编辑现有答案之一,或留下评论。

P
Peter Mortensen

修正

您在这里有几个选择。你可以做

git commit --amend

只要这是您的最后一次提交。

交互式变基

否则,如果这不是您的最后一次提交,您可以进行交互式变基,

git rebase -i [branched_from] [hash before commit]

然后在交互式变基中,您只需向该提交添加编辑。当它出现时,执行 git commit --amend 并修改提交消息。如果您想在该提交点之前回滚,您也可以使用 git reflog 并删除该提交。然后您只需再次执行 git commit

P
Peter Mortensen

如果您使用的是 Git GUI,您可以修改尚未推送的最后一个提交:

Commit/Amend Last Commit
A
Amal Murali

我尽可能多地使用 Git GUI,这使您可以选择修改最后一次提交:

https://i.stack.imgur.com/qXMzu.png

此外,git rebase -i origin/master 是一个很好的口头禅,它将始终向您展示您在 master 之上所做的提交,并为您提供修改、删除、重新排序或压缩的选项。无需先获取该哈希值。

它是 Windows Git Gui 的右下部分。只需选择“修改上次提交”切换,它将填充最新的提交信息。

D
Deni J.

对于正在寻找 Windows/Mac GUI 来帮助编辑旧消息(即不仅仅是最新消息)的任何人,我建议您使用 Sourcetree。要遵循的步骤在图像下方。

https://i.stack.imgur.com/CcA2P.png

对于尚未推送到远程的提交:

确保您已提交或隐藏所有当前更改(即,“文件状态”选项卡中没有列出任何文件) - 否则它将无法正常工作。在“日志/历史”选项卡中,右键单击要编辑的提交下方的图表中具有相邻线的条目,然后选择“以交互方式重新设置 的子节点...” 选择整个您希望更改的提交消息的行(单击“消息”列)。单击“编辑消息”按钮。在出现的对话框中根据需要编辑消息,然后单击确定。如果还有其他提交消息要更改,请重复步骤 3-4。单击确定:变基将开始。如果一切顺利,输出将结束“成功完成”。注意:我有时会看到失败,因为无法创建“project_path/.git/index.lock”:文件存在。尝试同时修改多个提交消息时。不确定到底是什么问题,或者它是否会在 Sourcetree 的未来版本中得到修复,但如果发生这种情况,建议一次重新设置一个(速度较慢但似乎更可靠)。

...或者...对于已经推送的提交:

按照 this answer 中的步骤,这些步骤与上述类似,但需要从命令行 (git push origin <branch> -f) 运行进一步的命令来强制推送分支。我建议阅读所有内容并采取必要的谨慎措施!

在所有答案中——这对所有 git 新手来说是最合适的 ^^^(使用免费程序 SourceTree 并在要编辑之前的提交上应用“Rebase children of”)

R
Radu Murzea

哇,所以有很多方法可以做到这一点。

另一种方法是删除最后一次提交,但保留其更改,以免丢失工作。然后,您可以使用更正的消息进行另一次提交。这看起来像这样:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

如果我忘记添加文件或进行更改,我总是这样做。

记住指定 --soft 而不是 --hard,否则您将完全丢失该提交。

这与 git commit --amend 完全相同,只是它是一个两步过程。

@JosephK.Strauss 我相信修改提交也会保留原始提交作者和日期信息,分别拥有新的提交者和日期信息。我不确定这种方法能做到这一点。

@EvertonAgner你是对的。 --amend 将保留作者信息,但问题仅要求更改消息。

如果所有文件都不是 git add ,则在此处进行小修正,以再次添加文件。可以使用 git commit -m "New message" 和 git push origin BRANCH_NAME 的帖子

4
4 revs, 3 users 81%

如果您只想编辑最新的提交,请使用:

git commit --amend

或者

git commit --amend -m 'one line message'

但是如果你想连续编辑多个提交,你应该使用 rebase 来代替:

git rebase -i <hash of one commit before the wrong commit>

https://i.stack.imgur.com/jRTRr.png

在上面的文件中,写入 edit/e 或其他选项之一,然后点击保存并退出。

现在你将处于第一个错误的提交。对文件进行更改,它们将自动为您暂存。类型

git commit --amend

保存并退出并输入

git rebase --continue

移动到下一个选择,直到完成所有选择。

请注意,这些事情会在特定提交之后更改您的所有 SHA 哈希值。

git rebase -i 对我有用。谢谢。

P
Peter Mortensen

如果您只想更改最后一条消息,您应该使用 --only 标志或其快捷方式 -ocommit --amend

git commit --amend -o -m "New commit message"

这可以确保您不会意外地使用分阶段的东西增强您的提交。当然,最好有一个正确的 $EDITOR 配置。然后你可以去掉 -m 选项,Git 会用旧的预填充提交消息。通过这种方式,它可以很容易地编辑。

“最高”的答案没有回答这个问题。它只是对 git commit --amend 进行了一般性介绍。这个问题非常具体,因此更长!=更好。 -o 标志的决定性提及可能会隐藏在其余信息中。我也不愿意编辑已经有这么多选票的答案。

话虽如此,您可以自由编辑最佳答案,因为人们将其用作“正确”答案存在真正的危险。很容易用分阶段的东西修改你的提交——它发生在我身上,当你碰巧推动它时真的很烦人。但是,数量并不能保证正确性。无论是答案的数量还是投票的数量。

我不会说 top answer 是“不正确的”并且它“没有回答问题”。它确实有效并回答了问题,您只需要确保在尝试修改时没有进行阶段性更改。但我明白你关于必须警告人们的观点。以后有时间我会编辑的。

公平地说:即使带有 --amend--only 选项从 git 1.3.0 开始可用,但它在 1.7.11.3 (ea2d4ed35902ce15959965ab86d80527731a177c) 中修复之前无法正常工作。所以 2008 年的正确答案可能是:git stash; git commit --amend; git stash pop

P
Peter Mortensen

在一行中用新的提交消息更新你最后一个错误的提交消息:

git commit --amend -m "your new commit message"

或者,尝试如下 Git 重置:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# It will reset you last commit. Now, you
# can re-commit it with new commit message.

使用 reset 将提交拆分为更小的提交

git reset 也可以帮助您将一个提交分解为多个提交:

# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

在这里,您已成功将最后一次提交分成两个提交。

如果您只想编辑上次提交的消息,那么为此目的使用软重置是over-kill。只需使用 git commit --amend就像它在 the top voted answer 中所说的那样。此外,git reset --soft HEAD^ 的工作方式与 this earlier answer 中的软重置相同,因为它们都重置回第一个父提交。

我只是费心在解决方案中添加 git reset 只是为了给出将一个提交消息拆分为多个提交消息的想法。因为,当我开始使用 git 时,我遇到了这个问题。有时,这真的很有帮助。 :)

P
Peter Mortensen

关于这个问题有很多答案,但没有一个非常详细地解释了如何使用 Vim 更改旧的提交消息。我自己也被困住了,所以在这里我将详细写下我是如何做到这一点的,特别是对于那些没有 Vim 经验的人!

我想更改我已经推送到服务器的五个最新提交。这是非常“危险的”,因为如果其他人已经从中撤出,您可以通过更改提交消息来搞砸事情。但是,当您在自己的小分支上工作并且确定没有人拉它时,您可以像这样更改它:

假设您要更改五个最新提交,然后在终端中键入:

git rebase -i HEAD~5

*其中 5 是您要更改的提交消息的数量(因此,如果您想将第 10 次提交更改为最后一次提交,请输入 10)。

这个命令会让你进入 Vim,在那里你可以“编辑”你的提交历史。你会在顶部看到你最近的五次提交,如下所示:

pick <commit hash> commit message

您需要编写 reword 而不是 pick。您可以在 Vim 中通过输入 i 来执行此操作。这会让你进入 insert 模式。 (您可以通过底部的词 INSERT 看到您处于插入模式。)对于您想要更改的提交,输入 reword 而不是 pick

然后您需要保存并退出此屏幕。您首先通过按 Esc 按钮进入“命令模式”(如果单词 INSERT 在底部消失了)。然后您可以通过输入 : 来输入命令。保存和退出的命令是 wq。因此,如果您输入 :wq,您就走在了正确的轨道上。

然后 Vim 会检查你想要改写的每条提交信息,在这里你可以真正改变提交信息。您将通过进入插入模式、更改提交消息、进入命令模式、保存并退出来完成此操作。这样做五次,你就退出了 Vim!

然后,如果您已经推送了错误的提交,则需要 git push --force 覆盖它们。请记住,git push --force 是一件非常危险的事情,因此请确保在您推送错误的提交后没有人从服务器中拉出!

现在你已经改变了你的提交信息!

(如您所见,我对 Vim 的经验并不丰富,所以如果我使用了错误的“行话”来解释正在发生的事情,请随时纠正我!)

<nitpick>Stack Overflow 上没有“主题”,因为它不是论坛,只有“问题”、“答案”和“帖子”。</nitpick>。此外,并非所有版本的 Vim 都是相同的,并非所有版本都允许您在插入模式下删除字符(在某种程度上是有道理的,对吧?)。如果您希望始终能够在 Vim 中删除字符,Xx 将执行此操作(小 x 删除光标前面的字符,X 将删除后面的字符)。如果出现错误,可以反复使用 u 来撤消。最后,r 是交互式变基编辑器中 reword 的简写。

在 vim 中更改一个单词是在其开头输入 cw (尽管问题与 vim 无关,我同意)。

您不需要使用 that abomination。您可以 set your git editor 到一些理智且用户友好的内容,例如 nano 或 Midnight Commander 的 mcedit。

P
Peter Mortensen

我为 recommit (amend) 添加了别名 recirecm。现在我可以用 git recmgit recm -m 做到这一点:

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
a
albfan

您可以使用 git-rebase-reword

它旨在以与 commit --amend 相同的方式编辑任何提交(不仅仅是最后一次)

$ git rebase-reword <commit-or-refname>

它以修改提交的 rebase 交互操作命名:“reword”。请参阅 this postman -section 交互模式-

例子:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

这需要安装外部程序。在我看来,学习更有效地使用内置工具和别名会更好。我会输入:g c; g rb -i @~9(提交和变基),将新提交移动到我想要的位置,将 commit 更改为 f (fixup),然后保存。如果你想要比这更快的东西,你可以别名 git commit --fixup=<commit>; git rebase -i --autosquash <commit>^

n
neoneye

我意识到我已经推送了一个包含拼写错误的提交。为了撤消,我做了以下事情:

git commit --amend -m "T-1000, advanced prototype"
git push --force

警告:强制推送您的更改将用您的本地分支覆盖远程分支。确保您不会覆盖您想要保留的任何内容。如果其他人与您共享分支,还要小心强制推送修改(重写)的提交,因为如果他们拥有您刚刚重写的提交的旧副本,他们将需要重写自己的历史记录。

在 git 中没有任何东西会被“覆盖”。在这种情况下,分支指针将设置为您的新提交,如果没有留下任何引用,旧提交将变得陈旧,并且可能会在几周后被清理。 (在此之前,其他人仍然可以找到并引用它,例如通过查看 reflog。)

P
Peter Mortensen

我喜欢使用以下内容:

git status git add --all git commit -am "关于更改的消息在这里" git pull git push

P
Peter Mortensen

如果您尚未将代码推送到远程分支 (GitHub/Bitbucket),您可以在命令行上更改提交消息,如下所示。

 git commit --amend -m "Your new message"

如果您正在处理特定分支,请执行以下操作:

git commit --amend -m "BRANCH-NAME: new message"

如果您已经推送了错误消息的代码,并且在更改消息时需要小心。也就是说,在您更改提交消息并尝试再次推送它之后,您最终会遇到问题。为了使其顺利,请按照下列步骤操作。

在做之前请阅读我的全部答案。

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

重要提示:当您直接使用强制推送时,您可能会遇到其他开发人员在同一分支上工作的代码问题。因此,为了避免这些冲突,您需要在强制推送之前从分支中提取代码:

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

如果已推送,这是更改提交消息时的最佳实践。