Git 中如何修改现有的、未推送到远程仓库的的提交消息 commit mesage?

我在提交消息中写错了信息 commit message。

如何更改这些消息?因为这些提交还没有推送。

3276511 次浏览

修改最近的提交消息

git commit --amend

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

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

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

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

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

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

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

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

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


执行交互式rebase

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

为了做一个Git壁球,请遵循以下步骤:

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

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

编辑提交时的终端截图

关于交互式rebase的重要说明

当你使用git rebase -i HEAD~n时,可以有更多而不是n次提交。Git将“收集”最后n次提交中的所有提交,如果在该范围之间的某个地方进行了合并,你也将看到所有提交,因此结果将是n+。

好提示:

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


需求文档

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

  1. git rebase --interactive $parent_of_flawed_commit

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

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

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

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

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

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


请注意,您不希望更改已经推送的提交。或者您可能会这样做,但在这种情况下,您必须非常小心地与可能已经提取您的提交并在其上完成工作的每个人进行沟通。在有人推送rebase或重置到已发布的分支后,如何恢复/重新同步?

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

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

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

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

git commit --amend

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

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

git commit --amend -C HEAD

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

git reset --hard HEAD^

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

git rebase -i HEAD~commit_count

(Replace commit_count with number of commits that you want to edit.) This command launches your editor. Mark the first commit (the one that you want to change) as “edit” instead of “pick”, then save and exit your editor. Make the change you want to commit and then run

git commit --amendgit rebase --continue

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

您也可以使用git filter-branch

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

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

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

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

    git commit --amend

That will drop you into your text editor and let you change the last commit message.

  1. If you want to change the last three commit messages, or any of the commit messages up to that point, supply HEAD~3 to the git rebase -i command:

    git rebase -i HEAD~3

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

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

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

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

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

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

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

  • --将filter分支选项与修订选项分开。

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

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

假设,您想恢复您的主服务器并在分支old_master中访问它:

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

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

Commit/Amend Last Commit

我更喜欢这种方式:

git commit --amend -c <commit ID>

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

修改

你有很多选择,你可以

git commit --amend

只要这是你最后的承诺。

交互式rebase

否则,如果这不是你的最后一次提交,你可以做一个交互式的rebase,

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

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

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

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

现在你可以使用

$ git commit --amend

来修改提交,然后

$ git rebase --continue

返回到上一个head提交。

使用

git commit --amend

要详细了解它,一个很好的帖子是4.重写Git历史记录。它还谈到了何时不使用git commit --amend

我尽可能多地使用gitgui,这给了你修改最后一次提交的选项:

勾选该框

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

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

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

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

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

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

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

$ vim ~/.gitconfig
[alias]
......cm = commitreci = commit --amendrecm = commit --amend......

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

git commit --amend

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

但是,如果您想连续编辑多个提交,则应该使用rebasing:

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

Git rebase编辑

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

现在您将处于第一次错误提交的位置。在文件中进行更改,它们将自动为您暂存。键入

git commit --amend

保存并退出并键入

git rebase --continue

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

请注意,这些东西会在特定提交后更改您的所有SHA哈希。

在一行中使用新的提交消息更新您最后一条错误的提交消息:

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 commitsgit reset --soft HEAD^
# It will reset you last commit. Now, you# can re-commit it with new commit message.

使用重置将提交拆分为更小的提交

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 commitsgit reset HEAD
# Add and commit your files separately to make multiple commits: e.ggit add app/git commit -m "add all files in app directory"
git add config/git commit -m "add all files in config directory"

在这里,您成功地将上次提交分解为两次提交。

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

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

这可确保您不会意外地使用分阶段的东西增强您的提交。当然,最好有一个适当的$EDITOR配置。然后您可以将-m选项保留,Git将使用旧选项预填充提交消息。这样就可以轻松编辑它。

我意识到我推了一个有错字的提交。为了撤消,我做了以下操作:

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

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

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

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

假设您想更改最近的五次提交,然后在终端中键入:

git rebase -i HEAD~5

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

此命令将使您进入Vim,您可以在那里“编辑”您的提交历史记录。您将在顶部看到您的最后五次提交,如下所示:

pick <commit hash> commit message

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

然后你需要保存并退出这个屏幕。你首先通过按下Esc按钮进入“命令模式”(如果底部的单词插入消失了,你可以检查你是否处于命令模式)。然后你可以通过键入:输入命令。保存和退出的命令是wq。所以如果你键入:wq,你就在正确的轨道上。

然后Vim会检查你想要重写的每个提交消息,在这里你实际上可以更改提交消息。你将通过进入插入模式、更改提交消息、进入命令模式、保存和退出来做到这一点。这样做五次,你就退出了Vim!

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

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

(如你所见,我在Vim方面没有经验,所以如果我用了错误的行话来解释发生了什么,请随时纠正我!)

我喜欢使用以下内容:

  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>

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

源代码树交互式重构

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

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

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

按照这个答案中的步骤进行操作,这些步骤与上面类似,但需要从命令行(git push origin <branch> -f)运行另一个命令来强制推送分支。我建议阅读全部并应用必要的谨慎!

如果您没有将代码推送到远程分支(github/比特桶),您可以在命令行上更改提交消息,如下所示。

 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-NAMEgit push -f origin BRANCH-NAME

这是更改提交消息(如果已推送)时的最佳做法。

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

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

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


如果这是一个掩埋的提交,使用令人敬畏的交互式数据库

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

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



微型Vim教程(或者,如何仅用8次击键#0#1rEsc#3重新设置基础):

  • vimtutor如果你有时间
  • #0#1#2#3对应移动键j0j1
  • 所有命令都可以以“范围”为前缀,例如#0向下移动三行
  • #0进入插入模式-您键入的文本将出现在文件中
  • EscCtrl#0退出插入模式并返回“正常”模式
  • #0撤销
  • Ctrl#0重做
  • #0#1#2分别删除一行、单词或字母
  • #0#1#2分别更改一行、单词或字母(与#3#4相同)
  • #0#1#2分别复制(“yank”)一行、单词或字母
  • #0#1分别粘贴在当前位置之后或之前
  • #0输入保存(写入)文件
  • #0输入退出而不保存
  • #0输入#1保存并退出

如果你编辑文本很多,然后切换到德沃夏克键盘布局,学习触摸类型,学习Vim。值得付出努力吗?是的。



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

$ git reset @~3   # Go back three commits$ git reflogc4f708b HEAD@{0}: reset: moving to @~32c52489 HEAD@{1}: commit: more changes4a5246d HEAD@{2}: commit: make important changese8571e4 HEAD@{3}: commit: make some changes... earlier commits ...$ git reset 2c52489... and you're back where you started

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

您可以使用git-rebase代码更新

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

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

它以rebase交互修改提交的操作命名:“reword”。参见这篇文章-部分交互模式-

示例:

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