7656

我在提交消息中写错了。

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

4

27 回答 27

17479

修改最近的提交信息

git commit --amend

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

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

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

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

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

如果您已经将提交推送到远程分支,那么 - 在本地修改提交之后(如上所述) - 您还需要强制推送提交

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编辑消息:

编辑提交时的终端屏幕截图

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

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

好提示:

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


文档

于 2008-10-07T15:50:34.630 回答
2606
git commit --amend -m "your new message"
于 2010-02-08T04:26:11.333 回答
2445

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

  1. git rebase --interactive $parent_of_flawed_commit

    如果您想修复几个有缺陷的提交,请传递其中最旧的提交的父级。

  2. 一个编辑器会出现,列出自你提交以来的所有提交。

    1. 在您要修复的任何提交之前更改pickreword(或在旧版本的 Git 上为)。edit
    2. 保存后,Git 将重播列出的提交。

  3. 对于您想要改写的每个提交,Git 都会将您拉回到您的编辑器中。对于您要编辑的每个提交,Git 会将您放入 shell。如果您在外壳中:

    1. 以您喜欢的任何方式更改提交。
    2. git commit --amend
    3. git rebase --continue

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


请注意,您不会想要更改已推送的提交。或者你可能会这样做,但在这种情况下,你将不得不非常小心地与每个可能已经取消你的提交并在他们之上完成工作的人进行沟通。有人将变基或重置推送到已发布的分支后,我如何恢复/重新同步?

于 2008-10-07T19:52:21.803 回答
810

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

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

于 2011-08-15T21:20:49.540 回答
409

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

git commit -a --amend -m "My new commit message"
于 2011-06-06T21:16:18.283 回答
366

你也可以使用git filter-branch它。

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

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

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

于 2012-09-01T20:35:29.813 回答
333

我更喜欢这种方式:

git commit --amend -c <commit ID>

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

于 2013-01-10T14:23:28.703 回答
316

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

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

git commit -a --amend -m "My new commit message"
于 2012-11-08T03:51:46.947 回答
290

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

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

现在你可以使用

$ git commit --amend

修改提交,然后

$ git rebase --continue

返回到上一个头部提交。

于 2013-01-22T17:23:19.293 回答
282
  1. 如果您只想修改最后一条提交消息,请执行以下操作:

    git commit --amend
    

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

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

    git rebase -i HEAD~3
    
于 2012-10-22T11:22:13.827 回答
266

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

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

Git 将创建一个临时目录用于重写并另外备份refs/original/.

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

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

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

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

说,你想恢复你的主人并在分支中访问它old_master

git checkout -b old_master refs/original/refs/heads/master
于 2012-11-15T09:29:35.820 回答
229

采用

git commit --amend

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

于 2013-03-27T20:43:50.643 回答
226

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

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

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


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

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

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



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

  • vimtutor有时间就跑
  • hjkl对应移动键←</kbd>↓</kbd>↑</kbd>→</kbd>
  • 所有命令都可以以“范围”为前缀,例如3j向下移动三行
  • i进入插入模式——您输入的文本将出现在文件中
  • EscCtrlc退出插入模式并返回“正常”模式
  • u撤销
  • Ctrlr重做
  • dd, dw,dl分别删除一行、单词或字母
  • cc, cw,cl分别更改行、单词或字母(与 相同ddi
  • yy, yw,yl分别复制(“yank”)一行、单词或字母
  • pP分别粘贴在当前位置之后或之前
  • :wEnter保存(写入)文件
  • :q!Enter不保存就退出
  • :wqEnterZZ保存并退出

如果你编辑文本很多,那么切换到Dvorak 键盘布局,学习触摸输入,学习 Vim。值得付出努力吗?是的。



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尽管它们可以丢弃数据。 * 此外,不要在您正在合作的任何分支上重写历史记录。

于 2015-02-10T00:01:01.093 回答
201

修正

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

git commit --amend

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

交互式变基

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

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

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

于 2013-01-18T01:45:12.053 回答
186

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

Commit/Amend Last Commit
于 2012-12-01T05:03:58.357 回答
169

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

勾选那个框

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

于 2013-08-04T23:13:36.997 回答
144

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

Sourcetree 交互式变基

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

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

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

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

于 2014-11-06T15:01:00.440 回答
141

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

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

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

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

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

于 2013-12-02T21:31:02.410 回答
130

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

git commit --amend

或者

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

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

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

Git 变基编辑

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

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

git commit --amend

保存并退出并输入

git rebase --continue

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

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

于 2014-01-06T22:03:35.997 回答
128

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

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

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

于 2014-05-23T08:40:05.847 回答
104

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

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"

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

于 2014-01-22T08:57:20.010 回答
90

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

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

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

git rebase -i HEAD~5

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

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

pick <commit hash> commit message

而不是pick你需要写reword. 你可以在 Vim 中输入i. 这使您进入插入模式。(您可以通过底部的INSERT一词看到您处于插入模式。)对于您要更改的提交,请输入reword而不是pick.

然后您需要保存并退出此屏幕。您首先通过按下按钮进入“命令模式” (如果底部的INSERTEsc字样消失,您可以检查您是否处于命令模式)。然后,您可以通过键入来键入命令。保存和退出的命令是. 因此,如果您输入,您就在正确的轨道上。:wq:wq

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

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

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

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

于 2014-08-07T09:18:35.723 回答
80

我已经为它添加reci了别名recmrecommit (amend)现在我可以用git recmor来做git recm -m

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
于 2014-01-06T07:24:14.737 回答
80

你可以使用git-rebase-reword

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

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

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

例子:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^
于 2015-02-21T12:21:22.373 回答
58

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

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

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

于 2014-07-19T17:27:29.153 回答
53

我喜欢使用以下内容:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>
于 2014-09-08T09:14:03.843 回答
47

如果您还没有将代码推送到远程分支(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?

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

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

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

于 2015-01-13T07:03:07.230 回答