有没有办法在GitHub上编辑提交消息?


129

在提交并推送到GitHub后,是否可以编辑提交消息?我看到有一个“添加注释”以及内联注释,但是没有实际编辑提交消息。git扩展中也有“修改提交”,但这不会编辑现有消息。


您可以尝试还原提交(请参见此SO问题中的一些选项:stackoverflow.com/questions/4114095/…)-仅确保您首先备份任何代码更改,以免因评论而丢失这些更改!
Traveling Tech Guy 2014年

另请参阅如何在Git中编辑错误的提交消息?在堆栈溢出。
2014年

Answers:


182
  1. git rebase -i <commit hash you want to change>^

    这将打开您的默认编辑器(通常为),其中包含每个提交和操作的列表。默认情况下,操作为pick

  2. 对于您希望更改消息的任何提交,请更改pickreword

  3. 保存并退出(在vi中:):wq

  4. 对于每个这样的提交,您都会得到一个编辑器来编辑提交消息。根据需要进行更改,保存并退出。

    完成所有提交消息的编辑后,将返回到命令提示符,并使用更新后的消息创建一棵新树。

  5. 您现在可以使用将它们上传到github git push origin --force

如果您只需要更正最后一次提交,则可以用替换步骤1-4 git commit --amend


3
@MatthewPeters我认为应该有办法,但是我不知道-我直接使用命令行。
Mureinik

4
似乎您无法指定<要更改的提交哈希>,而是需要在要更改的提交之前指定提交的哈希,或使用HEAD〜x,其中x是HEAD提交的数量您要更改的项目位于。
ssc327

3
@ ssc327注意,我在^那儿-我确实建议基于要更改的提交的父级。
Mureinik

2
@Murenik你是正确的,我不知何故错过了^
ssc327 '18

1
@deadfish使用Windows命令行,您必须键入^^以文本结尾的命令,^ 例如: git rebase -i 2c747b32^^
Wyck

35

在Intellij Idea中,您可以轻松做到。

  1. 打开版本控制(历史记录)
  2. 选择日志标签
  3. 选择提交以更改评论
  4. 按F2(Mac fn + F2),然后更新您的提交消息

1
如果您已经推送到远程,则无法正常工作。
支付

8
然后必须git push origin --force按照@Mureinik的答案中的建议执行。
丹·马克(DanMacák)'18

1
如果提交已经被推送,则禁用“ reword”选项。
huyz

1
要使用Intellij IDEA对已推送的提交执行此操作,您必须首先从交互式变基开始(就像在Git命令行中所做的那样)。为了进行重新设置,请右键单击您的项目->“ Git”菜单项->“存储库”->“重新设置...”(最后一个菜单项)。在“ Onto”字段中将提交的SHA插入到要修改的SHA之前,然后单击“ Rebase”。然后,您将获得交互式变基提示。在要修改的提交旁边的操作下拉框中选择“ reword”,然后单击“开始重新设置”按钮(在下
一条

1
(续)然后,将为您要修改的每个提交显示一个文本提示。修改日志消息后,您可以应用进一步的修改(请注意,现在“ reword”选项不再变为灰色)。完成后,您可以强行推入您的修改以结束交互式变基。整个过程实际上与@Mureinik的答案完全相同,后者是通过命令行执行的。
jplandrain

3

前提:

如果你的git图看起来像...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

df9c192并且b7ec061分别是target-commit和parent-commit的提交哈希)

解:

您只需输入以下说明即可...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

说明:

  1. git reset --soft b7ec061 将保留您对文件的更改并重置为父提交(即b7ec061)
  2. git commit -m "..." 将在本地创建一个新的提交
  3. git push -f 会将您的新提交推送到服务器并替换旧提交(即df9c192)

2

另一个选择是创建一个附加的“勘误提交”(并推送),该引用引用包含错误的提交对象-新的勘误提交也提供了更正。勘误提交是指没有实质性代码更改而是重要的提交消息的提交-例如,在您的自述文件中添加一个空格字符,然后使用重要的提交消息来提交更改,或者使用git选项--allow-empty。它肯定比重定基础更加容易和安全,它不会修改真实的历史记录,并且可以使分支树保持干净(使用amend如果您要更正最新的提交,它也是一个不错的选择,但是对于较早的提交,勘误提交可能是一个不错的选择。这种事情很少发生,仅记录错误就足够了。将来,如果您需要在git日志中搜索功能关键字,则可能不会出现原始(错误)提交,因为该原始提交(原始错字)使用了错误的关键字-但是,该关键字会出现在勘误提交中,然后将您指向具有错字的原始提交。这是一个例子:

$ git日志
提交0c28141c68adae276840f17ccd4766542c33cf1d
作者:先到后 
日期:2018年8月8日星期三15:55:52 2018-06-06

    勘误提交:
    该提交没有实质性的代码更改。
    仅提供此提交是为了记录对先前提交消息的更正。
    这涉及提交对象e083a7abd8deb5776cb304fa13731a4182a24be1
    原始不正确的提交消息:
        将背景色更改为红色
    校正(*更改突出显示*):
        将背景色更改为*蓝色*

提交032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
作者:先到后 
日期:2018年8月8日星期三15:43:16 -0600

    一些临时提交消息

提交e083a7abd8deb5776cb304fa13731a4182a24be1
作者:先到后 
日期:2018年8月8日星期三13:31:32 2018-0600

    将背景色更改为红色

可以肯定它是安全的,但是要阅读很多文本。我希望重写历史记录:)
pkalinow,

0

@Mureinik的答案很好,但是新手无法理解。

第一种方法:

  1. 如果您只想编辑最新的提交消息,则只需git commit --amend,您将看到:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. 如您所见,在顶部没有任何命令前缀就提交消息pick,这已经是编辑页面,您可以直接编辑顶部消息保存并退出,例如:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. 然后执行 git push -u origin master --force<how you push normally> --force。关键是--force

第二种方法:

  1. 您可以查看git log存储库URL或从中提取提交哈希,在我的例子中是881129d771219cfa29e6f6c2205851a2994a8835

  2. 然后,您可以执行git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835git rebase -i HEAD^(如果是最新的)

  3. 您会看到:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. 但是,如果看到的noop话,可能是您键入的错误,例如,如果git rebase -i 881129d771219cfa29e6f6c2205851a2994a88最后遗漏^了该错误,则最好退出编辑器而不保存并找出原因:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. 如果没有noop问题,则只需将单词更改pickreword,剩下的就保留了(此时您不编辑提交消息),例如:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. 保存并退出后将看到类似于方法1 的编辑页面
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. 与方法1相同,在顶部编辑消息,然后保存并退出,例如:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. 同样,与方法#1相同,执行do git push -u origin master --force<how you push normally> --force。关键是--force

有关更多信息,请阅读文档

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.