如何修改现有的,未刷新的提交消息?

时间:2008-10-07 15:44:48

标签: git git-commit git-rewrite-history amend

我在提交消息中写错了。

如何更改讯息?提交尚未推出。

27 个答案:

答案 0 :(得分:15320)

修改最近的提交消息

git commit --amend

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

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

...但是,这可能会使多行提交消息或小修正更加麻烦。

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

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

如果您已将提交推送到远程分支,那么您将need to force push the commit

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

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

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


使用交互式rebase

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

要进行git squash,请按以下步骤操作:

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

一旦你压缩你的提交 - 选择e/r来编辑消息

enter image description here

关于Interactive rebase的重要说明

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

好提示:

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


文档

答案 1 :(得分:2459)

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

答案 2 :(得分:2333)

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

  1. git rebase --interactive $parent_of_flawed_commit

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

  2. 将出现一个编辑器,其中包含自您提交的所有提交后的列表。

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

  3. 对于您想要 reword 的每次提交,Git会将您退回到您的编辑器中。对于您想要编辑的每个提交,Git会将您带入shell。如果你在shell中:

    1. 以您喜欢的任何方式更改提交。
    2. git commit --amend
    3. git rebase --continue
  4. 大多数此序列将通过各种命令的输出向您解释。这很容易,你不需要记住它 - 只要记住git rebase --interactive让你无论多久以前都能正确提交。


    请注意,您不希望更改已推送的提交。或者也许你这样做,但在这种情况下,你必须非常谨慎地与每个可能已经完成提交并完成工作的人进行沟通。 How do I recover/resynchronise after someone pushes a rebase or a reset to a published branch?

答案 3 :(得分:761)

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

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

打开的编辑器“进行所需的更改”

答案 4 :(得分:392)

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

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

答案 5 :(得分:352)

你也可以使用git filter-branch

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

它并不像一个简单的git commit --amend那么容易,但如果你在错误的提交消息之后已经有一些合并,它就特别有用。

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

答案 6 :(得分:311)

我更喜欢这种方式。

git commit --amend -c <commit ID>

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

答案 7 :(得分:310)

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

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

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

答案 8 :(得分:283)

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

$ git rebase bbc643cd^ --interactive

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

进行更改
$ git add <filepattern>

现在你可以使用

$ git commit --amend

修改提交,然后修改

$ git rebase --continue

返回上一个头部提交。

答案 9 :(得分:276)

  1. 如果您只想修改上次提交消息,请执行以下操作:

    git commit --amend
    

    这将使您进入文本存储器并让您更改最后一次提交消息。

  2. 如果要更改最后3条提交消息或任何提交消息,请向HEAD~3命令提供git rebase -i

    git rebase -i HEAD~3
    

答案 10 :(得分:258)

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

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

答案 11 :(得分:222)

使用

git commit --amend

为了详细了解它,一篇优秀的帖子是 4. Rewriting Git History 。它还讨论了何时不使用 git commit --amend

答案 12 :(得分:195)

修改

你有几个选择。你可以做到

git commit --amend

只要是你的最后一次提交。

交互式rebase

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

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

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

答案 13 :(得分:183)

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

Commit/Amend Last Commit

答案 14 :(得分:171)

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

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更改为rreword),然后保存并关闭该文件。完成!



微型vim教程(或者,如何只用8次击键进行重新定义 3j cw r Esc < / KBD> ZZ ):

  • 如果有时间,请运行vimtutor
  • h j k l 对应于移动键
  • 所有命令都可以以“范围”作为前缀,例如: 3j 向下移动3行
  • i 进入插入模式 - 您输入的文字将显示在文件中
  • Esc Ctrl c 退出插入模式并返回“正常”模式
  • u 撤消
  • Ctrl r 重做
  • dd dw dl 删除一行,一个字或一个字母,分别
  • cc cw cl 更改行,字或字母,分别(与 dd i 相同
  • yy yw yl 复制(“yank”)一行,字或字母分别
  • 分别在当前位置之后或之前粘贴
  • p P
  • :w 输入以保存(写入)文件
  • :q! 输入退出而不保存
  • :wq 输入 ZZ 以保存并退出

如果您经常编辑文本,请切换到Dvorak键盘布局,学习触摸式,并学习vim。 Is it worth the effort?是的。



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

$ git reset @~3   # go back 3 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等选项 - 他们可以丢弃数据。
* 此外,请勿在您正在协作的任何分支上重写历史记录。

答案 15 :(得分:165)

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

Tick that box

此外,git rebase -i origin/master是一个很好的口头禅,它将始终为您提供您在主人身上完成的提交,并为您提供修改,删除,重新排序或压缩的选项。不需要先掌握那个哈希值。

答案 16 :(得分:135)

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

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

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

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

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

答案 17 :(得分:125)

对于寻找Windows / Mac GUI以帮助编辑旧消息(即不仅仅是最新消息)的人,我建议SourceTree。要遵循的步骤如下。

SourceTree interactive rebase

对于尚未推送到遥控器的提交:

  1. 确保您已提交或隐藏所有当前更改(即所以&#34;文件状态&#34;标签中没有列出文件) - 否则无法正常工作。
  2. 在&#34;日志/历史&#34;选项卡,右键单击图表中相邻行的条目下面一个您要编辑的提交,然后选择&#34; &lt; commit ref&gt; <的基础子项< / em>以交互方式...&#34;
  3. 选择您要更改的提交消息的整行(即点击&#34;消息&#34;列)。
  4. 点击&#34;编辑讯息&#34;按钮。
  5. 在出现的对话框中根据需要编辑消息,然后单击“确定”。
  6. 如果还有其他提交消息需要更改,请重复步骤3-4。
  7. 单击“确定”:将重新开始重新定位。如果一切顺利,输出将结束&#34;成功完成&#34;。
  8. ...或者......对于已经被推送的提交:

    按照this answer中的步骤进行操作,这些步骤与上述类似,但需要从命令行运行另一个命令来强制推送分支 - 全部阅读并应用必要的注意事项!

答案 18 :(得分:124)

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

git commit --amend

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

但是如果你想连续编辑几个提交,你应该使用rebasing:

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

git rebase editing

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

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

git commit --amend

保存并退出并输入

git rebase --continue 

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

请注意,这些内容会在特定提交后更改所有SHA哈希值。

答案 19 :(得分:123)

如果您只想更改上一封邮件,则应使用--only标记或其-o快捷方式commit --amend

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

这可确保您不会意外地使用分段内容增强您的提交。当然,最好有$EDITOR配置。然后你可以退出-m选项,git将使用旧的预先填充提交消息。这样就可以轻松编辑。

答案 20 :(得分:99)

使用新提交消息在一行中更新上次错误的提交消息:

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

或者,尝试git reset,如下所示:

# 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 seperately 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"

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

答案 21 :(得分:82)

在这个问题上有很多答案,但没有一个能够详细解释如何使用VIM更改旧的提交消息。我自己一直试图这样做,所以在这里我会详细记录我是如何做到这一点的,尤其是那些没有VIM经验的人!

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

我们假设你要更改你的五个最新提交,然后在终端输入:

git rebase -i HEAD~5 *其中5是您要更改的提交消息数。 (所以如果你想改变你输入的第10个到最后一次提交的话)

此命令将让您进入VIM,您可以“编辑”您的提交历史记录。 你会在这里看到你最近的5次提交:

pick <commit hash> commit message

而不是pick,您需要编写reword。您可以通过键入i在VIM中执行此操作,这将使您进入INSERT模式。 (您可以通过底部的INSERT一词看到您处于插入模式)对于您要更改的提交,请键入reword而不是pick

然后你需要保存并退出这个屏幕,你可以先按下esc按钮进入'命令模式'。 (如果底部的INSERT单词消失,您可以检查您是否处于命令模式)然后您可以通过键入:键入命令,保存和退出命令为wq。因此,如果您输入:wq,那么他就是正确的。

然后VIM将遍历您想要重写的每个提交消息,在这里您可以实际更改提交消息。您将通过进入INSERT模式,更改提交消息,进入命令模式并保存并退出来执行此操作。这样做5次,你就离开了VIM!

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

现在您已经更改了提交消息!

(如你所见,我在VIM中没有经验,所以如果我使用了错误的语言来解释发生了什么,请随时纠正我!)

答案 22 :(得分:76)

我为reci添加了recmrecommit (amend)的别名,现在我可以使用git recmgit recm -m

$ vim ~/.gitconfig

[alias]

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

答案 23 :(得分:76)

您可以使用git-rebase-reword

它旨在编辑任何提交(不仅仅是最后一次)与commit --amend

相同的方式
$ git rebase-reword <commit-or-refname>

以rebase交互操作命名,以修改提交:&#34; reword&#34;。请参阅this postman - section interactive mode -

示例:

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

答案 24 :(得分:54)

我意识到我已经在其中输入了一个拼写错误的提交。为了撤消,我做了以下事情:

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

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

答案 25 :(得分:49)

我喜欢使用以下内容:

  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>

答案 26 :(得分:43)

如果您尚未将代码推送到远程分支(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

这是更改提交消息的最佳做法,如果它已被推送。