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


7664

我在提交消息中写错了内容。

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


868
对于那些刚接触git的人:Laurie关于尚未推动的观点很重要。就像重新定基一样,这正在改变历史。如果有人在原始和重写的历史记录之间从您的存储库中克隆/提取了内容,则他们将无法在重写之后(对于该分支)进行提取。
Pat Notz

Answers:


16120

修改最新的提交消息

git commit --amend

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

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

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

确保你没有任何工作副本的修改上演这样做之前,否则它们可能会犯了。(未暂存的更改将不会提交。)

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

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

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

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

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


执行交互式变基

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

为了做一个壁球南瓜,请按照下列步骤操作:

// 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自动为您解决这些冲突。


文献资料


257
然而却git commit --amend不如git rebase -i
杰弗里·何塞

76
@jeffjose,绝对不需要。另外,git commit --amend可以修复(a?)主提交。
斯特拉格2010年

116
如果您已经推送,只需再次强行推送:git push -f origin branchname
拥抱2012年

177
git push -f如果其他人使用相同的存储库,@ hughes并不有点危险?
Armand 2012年

91
如果您不想重写整个提交消息,请访问git commit --amend -c HEAD。这将打开用旧的提交消息预填充的编辑器,因此您可以对其进行更改。
山姆

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

7
我做了git commit --amend -m“新消息”,但是推送到Github生成了“在再次推送之前合并远程更改”。拉动后,提交--amend,然后再次推动,新消息不会出现。相反,我有“合并github.com的分支'master':[myrepo]”
Dave Everitt

8
@DaveEveritt您最有可能在尝试修复之前将您的提交推向上游。
托尔比约恩Ravn的安徒生

12
@Kyralessa不是真的。在bash中,您只需完成操作就不关闭引号即可轻松编写多行提交消息(在引号内各行的末尾单击return)。
滚刀

32
我不知道答案看起来像两年前写出的答案的主要思想,而且被接受的答案也获得了如此多的选票。奇怪。(答案没有错)
快乐的编码人员,2014年

7
@AmalMurali,很好。我的意思不是问题的普遍性,还是答案的实用性。但是,此特定答案不是最古老的答案,也不能提供对已接受答案的任何进一步了解。它似乎是接受答案的一部分的副本。那是我的意思。干杯!
快乐的编码人员

2376

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

  1. git rebase --interactive $parent_of_flawed_commit

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

  2. 将出现一个编辑器,并列出您提交以来的所有提交。

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

  3. 对于您要重新编写单词的每次提交,Git都会将您带回到编辑器中。对于您要编辑的每个提交,Git会将您放入外壳。如果您在外壳中:

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

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


注意,您将不想更改已经推送的提交。也许您这样做了,但在那种情况下,您将必须格外小心,与可能撤消了您的承诺并在其上完成工作的所有人进行沟通。在有人将基准或重置推送到已发布的分支后,如何恢复/重新同步?


39
一个人可以更改第一次提交(没有父提交)的消息吗?
13ren

27
在其他答案之一中提到了这一点,但我将在此处进行注释。从git 1.6.6开始,您可以reword代替pick来编辑日志消息。
MitMaro

89
顺便说一句,$parent_of_flawed_commit等效于$flawed_commit^
Peeja

67
如果您已经向上游推销,则永远不要这样做(或总体上变基)!
Daniel Rinser

20
如果有缺陷的提交后存在合并,请使用-p--preserve-merges)。
ahven 2012年

778

要修改上一次提交,请进行所需的更改并进行这些更改,然后运行

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


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

2
如果您不想重新设基怎么办?您只想更改较旧的消息?
SuperUberDuper '16

3
git reset --hard消除未提交的更改。请替换--hard--soft
eel ghEEz

1
同意,这git reset --hard是完全合法的命令,但是考虑到这个问题,这是令人误解的。您可以使用--hard,如果你提交的修改要扔掉,而不是如果你在由错字提交信息!
索伦·比约恩斯塔德

398

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

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

4
如果你不希望添加的一切,你可以先做git add file.ext然后就git commit --amend
MalcolmOcean

358

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

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

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

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


4
如果正则表达式找不到任何东西,是否有一个不会改变提交的版本?
sjakubowski13年

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

4
@DavidHogue仅在使用filter-branch方法时才如此。如果使用交互式基础,则修改后的提交后的提交ID不会更改。
2013年

6
@Mark是的,他们必须这样做。提交ID取决于先前的提交。如果他们没有改变,git将是无用的。
Miles Rout 2014年

2
你需要$flawed_commit^..HEAD,没有$flawed_commit..HEAD。如手册页所述:« 该命令将只重写命令行中提到的正引用(例如,如果您传递a..b,则只会重写b)。»
安赫尔

319

我更喜欢这样:

git commit --amend -c <commit ID>

否则,将使用新的提交ID进行新的提交。


7
对我来说,使用上面的命令实际上会创建一个具有新提交ID的新提交以及一个额外的提交,其中包含“ merge branch”作为默认提交消息。
2013年

46
修改总是使用新的提交ID创建一个新的提交。提交ID是提交内容的SHA哈希,包括提交消息和创作/提交的时间戳。这是Git的一项功能,可以避免哈希冲突,从而确保具有相同ID的两个提交完全相同,并且内容,历史记录等也完全相同。
埃米尔·隆德伯格

7
同意埃米尔。另外,阅读文档-似乎所有的“ -c”都告诉git将哪个提交的消息用作您的新提交的默认/模板。 ,因此无需指定它。
2013年

2
-c做了几件事情。默认情况下,它使用旧消息,但它也复制作者信息(人和时间)。-C除了不要求您编辑消息外,其他操作相同。
Joseph K. Strauss 2014年

1
像@SantanuDey一样,它对我不起作用。我知道了fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
安德鲁·格林

312

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

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

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

4
这个答案从字面上看与这个较旧的答案相同。在提供另一个答案之前,您是否已经检查了现有答案?
丹·达斯卡斯库

284

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

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

现在您可以使用

$ git commit --amend

修改提交,然后

$ git rebase --continue

返回上一个头部提交。


1
如果您要确保所做的更改已git commit --amend生效,则可以使用git show它,它会显示新消息。
Steve Tauber

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

    git commit --amend
    

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

  1. 如果要更改最后三个提交消息,或者要更改到目前为止的任何提交消息,请提供HEAD~3以下git rebase -i命令:

    git rebase -i HEAD~3
    

6
这个较早的答案已经表示您可以使用git commit --amend,而且还说您可以使用git rebase -i HEAD~commit_count,您所做的只是插入3commit_count

也被否决了。人们只是不愿意阅读现有的答案
丹·达斯卡斯库

261

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

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

Git将创建一个临时目录进行重写,并另外将旧引用备份到中refs/original/

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

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

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

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

假设您要恢复您的母版并在branch中访问它old_master

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

3
这个答案没有解决OP的问题,因为他们纯粹是对修复刚刚完成的提交感兴趣。我经常使用git commit --amend来修复评论或添加文件我忘了git add,但只之前我已经git push编。git filter-branch当我想完全弄乱版本历史记录时,我也会使用它,但是OP不想这样做,因此此答案需要一个大的健康警告-请勿在家尝试此操作,偷看!
kbro

226

采用

git commit --amend

要详细了解它,一个出色的文章是4. Rewrite Git History。它还讨论何时不使用 git commit --amend


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

2
一句话,NOPE!没有好的方法来收回您已推送的内容。所有的撤退都或多或少受到不良影响。您需要采用在自己的私有存储库中的分支中工作的原则,在添加,测试,微调的同时进行多次提交。然后将您的整个分支合并到一个提交中,编写描述整个更改的新提交消息,进行PROOFREAD,然后推送。
kbro

1
只是要指出一个明显的事实,即从功能分支返回时不必进行一次提交。许多人要做的是基于目标分支(使事情看起来很整洁),然后与该选项合并以禁止快速转发。同意,但要加紧注意要点。
ShawnFumo

1
git commit --amend在您编写答案之前,答案已经(多次)给出。您为什么再次发布?如果要添加“重写Git历史记录”的链接,则可以编辑现有答案之一,或留下评论。
丹·达斯卡斯库

199

修改

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

git commit --amend

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

互动基础

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

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

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


191

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

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

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


如果是掩埋的提交,请使用超赞的交互式rebase

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

找到所需的提交,将其更改pickrreword),然后保存并关闭文件。做完了!



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

  • 运行vimtutor如果你有时间
  • hjkl 对应于运动键
  • 所有命令都可以以“范围”作为前缀,例如3j向下移动三行
  • i 进入插入模式-您键入的文本将出现在文件中
  • EscCtrlc退出插入模式并返回“正常”模式
  • u 撤销
  • Ctrlr 重做
  • dddwdl删除线,字或字母,分别
  • cccwcl以改变线,字或字母,分别为(相同ddi
  • yyywyl复制(“抽出”)的线,字或字母,分别
  • pP分别粘贴在当前位置之后或之前
  • :wEnter 保存(写入)文件
  • :q!Enter 不保存就退出
  • :wqEnterZZ保存并退出

如果您经常编辑文本,请切换到Dvorak键盘布局,学习触摸式输入法,并学习Vim。值得付出努力吗?是。



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

$ 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虽然-他们可以丢弃的数据。 * 另外,请勿在您正在合作的任何分支机构上重写历史记录。


3
vim部分完全是题外话,而不是鼓励用户花时间学习使用奥术编辑器,而是为什么不教他们更多的主题,例如如何将默认的git编辑器设置为用户友好型,例如nano?我们在谈论的是需要对文本文件进行的琐碎修改,而不是会产生关于“最佳”文本编辑器的激烈争论的硬核编码。
Dan Dascalescu,

1
@DanDascalescu:因为按照上面的说明学习Vim比使用nano进行多个基础更快。git打开文本编辑器而不是它自己的用于重新定基的界面的全部原因是因为Vim存在:它是轻量级的,默认情况下已安装在大多数系统上,并且非常易于学习,可以轻松地进行重新定基:例如,ddjjpZZ将commit 2下移。关于Vim的基本知识没有任何奥秘。Vim要比nano更舒适,需要10分钟。
Zaz

185

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

Commit/Amend Last Commit

168

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

勾选那个盒子

另外,这git rebase -i origin/master是一个不错的口头禅,它将始终向您展示您在master上所做的提交,并为您提供修改,删除,重新排序或压榨的选项。无需先掌握该哈希值。


4
我如何进入示例中显示的屏幕?
Marwanمروان2014年

2
它是Windows Git Gui的右下部分。只需选择“修改上一个提交”开关,它将显示最新的提交信息。
wbdarby

138

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

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

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

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

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


5
这与git commit --amend两步过程完全一样。
Joseph K. Strauss 2014年

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

4
@EvertonAgner你是对的。--amend将保留作者信息,但问题仅要求更改消息。
约瑟夫·施特劳斯

131

对于正在寻找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)运行另一个命令来强制按下分支。我建议您阅读所有内容并采取必要的警告!


在所有答案中—这是最适合所有git新手^^^(使用免费程序SourceTree并在要编辑的提交之前对提交进行“重新设置子级”)
revelt

127

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

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哈希。


2
git rebase -i <在错误的提交之前进行一次提交的哈希>对我有用。谢谢。
Viraths

127

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

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

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


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

2
话虽如此,您可以自由编辑最佳答案,因为确实存在人们将其用作“正确”答案的危险。可以很容易地用分阶段的东西来修改您的提交-它发生在我身上,当您碰巧推动它时,确实很烦人。但是数量仍然不能保证正确性。答案数和投票数均无。
David Ongaro 2014年

1
我不会说最多的答案是“不正确的”,并且“没有回答问题”。它肯定可以解决问题,您只需要确保在尝试修改时没有上演更改即可。但是,我明白您关于必须警告人们这一点的观点。如果有时间,我会在稍后进行编辑。

1
公平地说:即使自git 1.3.0版本开始提供--onlywith选项,但--amend在1.7.11.3(ea2d4ed35902ce15959965ab86d80527731a177c)中对其进行修复之前,该选项仍无法正常工作。因此,回想2008年的正确答案可能是:git stash; git commit --amend; git stash pop
David Ongaro 2014年

103

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

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.

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

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"

在这里,您已成功将上一个提交分为两个提交。


3
如果您只想编辑上一次提交的消息,则为此目的而使用软复位是过分的。只要使用git commit --amend酷似怎么说,在上投答案。此外,其git reset --soft HEAD^工作方式与此较早答案中的软重置相同,因为它们都重置为第一个父提交。

3
我只想添加git reset解决方案,只是想将一个提交消息拆分为多个提交消息。因为,当我开始使用时就遇到了这个问题git。有时,这确实很有帮助。:)
przbadu 2014年

87

关于这个问题,有很多答案,但是都没有一个非常详细地说明如何使用Vim更改旧的提交消息。我一直试图自己做这件事,所以在这里我将详细记述我是如何做到的,尤其是对于那些没有Vim经验的人!

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

假设您要更改最近的五个提交,然后在终端中键入以下内容:

git rebase -i HEAD~5

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

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

pick <commit hash> commit message

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

然后,您需要保存并退出此屏幕。您可以通过先按下Esc按钮进入“命令模式”来实现(如果底部的“ 插入 ”一词消失了,您可以检查自己是否处于命令模式)。然后,您可以通过键入键入命令:。保存和退出的命令是wq。因此,如果您键入内容,:wq您将走在正确的轨道上。

然后,Vim会遍历您要改写的所有提交消息,您实际上可以在此处更改提交消息。您将通过进入插入模式,更改提交消息,进入命令模式以及保存并退出来完成此操作。这样做五次,您就离开了Vim!

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

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

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


4
<nitpick>Stack Overflow上没有“线程”,因为它不是讨论论坛,只有“问题”,“答案”和“帖子”。</nitpick>。另外,并不是所有的Vim版本都相同,不是所有的Vim版本都可以让您在插入模式下删除字符(在某种意义上对吧?)。如果您希望始终能够删除Vim中的字符,X并且x可以这样做(仅x删除光标前面的字符,X而后面删除的字符)。如果您犯了错误,则可以u反复使用以撤消操作。最后,rreword交互式rebase编辑器中的简写。

1
要在vim中更改单词,必须cw在其开头输入(尽管我同意问题不在于vim)。
Yaroslav Nikitenko 2015年

您无需使用该可憎性。您可以将git编辑器设置为理智且用户友好的名称,例如nanoMidnight Commander的mcedit。
丹·达斯卡斯库

79

您可以使用git-rebase-reword

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

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

它是基于对rebase交互式操作进行修改以修改提交的名称:“ reword”。请参阅此帖子人-部分交互模式-

例子:

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

6
这需要安装外部程序。我认为,最好学会更有效地使用内置工具和别名。我将输入:(g c; g rb -i @~9提交并变基),将新提交移至所需位置,更改commitffixup),然后保存。如果您想要更快的速度,可以使用别名 git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Zaz 2015年

79

我已经加入了别名reci,并recmrecommit (amend)它。现在,我可以使用git recm或进行操作git recm -m

$ vim ~/.gitconfig

[alias]

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

57

我意识到我已经推了一个错字的提交。为了撤消操作,我执行了以下操作:

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

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


7
git中没有任何内容被“覆盖”。在这种情况下,分支指针将设置为您的新提交,并且如果没有剩余引用,则旧提交将变得陈旧,并且可能在几周后被清除。(直到那时其他人仍然可以找到并引用它,例如,通过阅读reflog。)
David Ongaro 2014年


46

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

这是更改提交消息(如果已被推送)的最佳实践。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.