这个问题的答案是社区的努力。编辑现有答案以改进这篇文章。它目前不接受新的答案或交互。
我在提交消息中写错了。
如何更改消息?提交尚未推送。
修改最近的提交信息
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 -m "your new message"
如果您要修复的提交不是最新的:
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?
reword
代替 pick
来编辑日志消息。
$parent_of_flawed_commit
等价于 $flawed_commit^
。
-p
(--preserve-merges
)。
要修改先前的提交,请进行所需的更改并暂存这些更改,然后运行
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
是金色的!谢谢
如前所述,git commit --amend
是覆盖最后一次提交的方式。注意事项:如果您还想覆盖文件,则命令为
git commit -a --amend -m "My new commit message"
git add file.ext
,然后再执行 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
命令 ;-)
$flawed_commit^..HEAD
,而不是 $flawed_commit..HEAD
。如手册页所述:«该命令只会重写命令行中提到的正引用(例如,如果您传递 a..b,则只会重写 b)。»
我更喜欢这种方式:
git commit --amend -c <commit ID>
否则,将会有一个带有新提交 ID 的新提交。
-c
做了一些事情。它默认使用旧消息,但它也复制作者信息(人和时间)。 -C
做同样的事情,只是它不要求您编辑消息。
fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
如果您使用的是 Git GUI 工具,则有一个名为 Amend last commit 的按钮。单击该按钮,然后它将显示您的最后提交文件和消息。只需编辑该消息,您就可以使用新的提交消息来提交它。
或者从控制台/终端使用这个命令:
git commit -a --amend -m "My new commit message"
您可以使用 Git rebasing。例如,如果你想修改回提交 bbc643cd,运行
$ git rebase bbc643cd^ --interactive
在默认编辑器中,将要修改其提交的行中的“pick”修改为“edit”。进行更改,然后使用
$ git add <filepattern>
现在你可以使用
$ git commit --amend
修改提交,然后
$ git rebase --continue
返回到上一个头部提交。
git commit --amend
的更改生效,您可以使用 git show
,它会显示新消息。
如果您只想修改上一条提交消息,请执行以下操作: git commit --amend
这将使您进入您的文本编辑器并让您更改最后的提交消息。
如果您想更改最后三个提交消息,或者到该点的任何提交消息,请将 HEAD~3 提供给 git rebase -i 命令: git rebase -i HEAD~3
git commit --amend
,它还说你可以使用 git rebase -i HEAD~commit_count
,你所做的只是为 commit_count
插入 3
。
如果您必须在多个分支上更改旧的提交消息(即,带有错误消息的提交存在于多个分支中),您可能需要使用:
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
git commit --amend
来修正评论或将我忘记的文件添加到 git add
,但只是在我git push
编辑之前曾经。当我想完全弄乱版本历史时,我也使用 git filter-branch
,但 OP 不想要这个,所以这个答案需要一个很大的健康警告 - 不要在家里尝试这个,偷看!!
如果这是您的最后一次提交,只需修改提交:
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 次击键进行变基 3j
cw
r
EscZZ
):
如果你有时间,运行 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
这样的选项——它们可以丢弃数据。 * 另外,不要重写你正在合作的任何分支的历史记录。
nano
?我们谈论的是需要对文本文件进行的微不足道的修改,而不是会引发关于“最佳”文本编辑器的激烈争论的硬核编码。
ddjjpZZ
移动提交2下来。基本的 Vim 知识一点也不神秘。 Vim 比 nano 更舒服需要 10 分钟。
-o
标志正是我所寻找的:如何在不添加暂存文件的情况下更改提交消息。谢谢!
利用
git commit --amend
4. Rewriting Git History 是一篇出色的文章,要详细了解它。它还谈到了何时不使用 git commit --amend
。
git commit --amend
答案。你怎么又发了?如果您想添加指向“重写 Git 历史”的链接,您可以编辑现有答案之一,或留下评论。
修正
您在这里有几个选择。你可以做
git commit --amend
只要这是您的最后一次提交。
交互式变基
否则,如果这不是您的最后一次提交,您可以进行交互式变基,
git rebase -i [branched_from] [hash before commit]
然后在交互式变基中,您只需向该提交添加编辑。当它出现时,执行 git commit --amend
并修改提交消息。如果您想在该提交点之前回滚,您也可以使用 git reflog
并删除该提交。然后您只需再次执行 git commit
。
如果您使用的是 Git GUI,您可以修改尚未推送的最后一个提交:
Commit/Amend Last Commit
我尽可能多地使用 Git GUI,这使您可以选择修改最后一次提交:
https://i.stack.imgur.com/qXMzu.png
此外,git rebase -i origin/master
是一个很好的口头禅,它将始终向您展示您在 master 之上所做的提交,并为您提供修改、删除、重新排序或压缩的选项。无需先获取该哈希值。
对于正在寻找 Windows/Mac GUI 来帮助编辑旧消息(即不仅仅是最新消息)的任何人,我建议您使用 Sourcetree。要遵循的步骤在图像下方。
https://i.stack.imgur.com/CcA2P.png
对于尚未推送到远程的提交:
确保您已提交或隐藏所有当前更改(即,“文件状态”选项卡中没有列出任何文件) - 否则它将无法正常工作。在“日志/历史”选项卡中,右键单击要编辑的提交下方的图表中具有相邻线的条目,然后选择“以交互方式重新设置
...或者...对于已经推送的提交:
按照 this answer 中的步骤,这些步骤与上述类似,但需要从命令行 (git push origin <branch> -f
) 运行进一步的命令来强制推送分支。我建议阅读所有内容并采取必要的谨慎措施!
哇,所以有很多方法可以做到这一点。
另一种方法是删除最后一次提交,但保留其更改,以免丢失工作。然后,您可以使用更正的消息进行另一次提交。这看起来像这样:
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
如果我忘记添加文件或进行更改,我总是这样做。
记住指定 --soft
而不是 --hard
,否则您将完全丢失该提交。
git commit --amend
完全相同,只是它是一个两步过程。
--amend
将保留作者信息,但问题仅要求更改消息。
如果您只想编辑最新的提交,请使用:
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 哈希值。
如果您只想更改最后一条消息,您应该使用 --only
标志或其快捷方式 -o
和 commit --amend
:
git commit --amend -o -m "New commit message"
这可以确保您不会意外地使用分阶段的东西增强您的提交。当然,最好有一个正确的 $EDITOR
配置。然后你可以去掉 -m
选项,Git 会用旧的预填充提交消息。通过这种方式,它可以很容易地编辑。
git commit --amend
进行了一般性介绍。这个问题非常具体,因此更长!=更好。 -o
标志的决定性提及可能会隐藏在其余信息中。我也不愿意编辑已经有这么多选票的答案。
--amend
的 --only
选项从 git 1.3.0 开始可用,但它在 1.7.11.3 (ea2d4ed35902ce15959965ab86d80527731a177c) 中修复之前无法正常工作。所以 2008 年的正确答案可能是:git stash; git commit --amend; git stash pop
。
在一行中用新的提交消息更新你最后一个错误的提交消息:
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"
在这里,您已成功将最后一次提交分成两个提交。
git commit --amend
,就像它在 the top voted answer 中所说的那样。此外,git reset --soft HEAD^
的工作方式与 this earlier answer 中的软重置相同,因为它们都重置回第一个父提交。
git reset
只是为了给出将一个提交消息拆分为多个提交消息的想法。因为,当我开始使用 git
时,我遇到了这个问题。有时,这真的很有帮助。 :)
关于这个问题有很多答案,但没有一个非常详细地解释了如何使用 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 中删除字符,X
和 x
将执行此操作(小 x
删除光标前面的字符,X
将删除后面的字符)。如果出现错误,可以反复使用 u
来撤消。最后,r
是交互式变基编辑器中 reword
的简写。
cw
(尽管问题与 vim 无关,我同意)。
nano
或 Midnight Commander 的 mcedit。
我为 recommit (amend)
添加了别名 reci
和 recm
。现在我可以用 git recm
或 git recm -m
做到这一点:
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
您可以使用 git-rebase-reword
它旨在以与 commit --amend
相同的方式编辑任何提交(不仅仅是最后一次)
$ git rebase-reword <commit-or-refname>
它以修改提交的 rebase 交互操作命名:“reword”。请参阅 this post 和 man -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>^
我意识到我已经推送了一个包含拼写错误的提交。为了撤消,我做了以下事情:
git commit --amend -m "T-1000, advanced prototype"
git push --force
警告:强制推送您的更改将用您的本地分支覆盖远程分支。确保您不会覆盖您想要保留的任何内容。如果其他人与您共享分支,还要小心强制推送修改(重写)的提交,因为如果他们拥有您刚刚重写的提交的旧副本,他们将需要重写自己的历史记录。
我喜欢使用以下内容:
git status git add --all git commit -am "关于更改的消息在这里" git pull
如果您尚未将代码推送到远程分支 (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
如果已推送,这是更改提交消息时的最佳实践。
不定期副业成功案例分享
git commit --amend
不如git rebase -i
强大。git commit --amend
可以修复(a?)主提交。git push -f origin branchname
git push -f
会不会有点危险?git commit --amend -c HEAD
。这将打开预先填充了您的旧提交消息的编辑器,因此您可以更改它。