推送后更改git commit消息(假设没有人从远程拉出)

K_U*_*K_U 919 git push commit

我做了一个git提交和随后的推送.我想更改提交消息.如果我理解正确,这是不可取的,因为有人可能在我进行此类更改之前从远程存储库中取出.如果我知道没有人拉过怎么办?

有没有办法做到这一点?

Die*_*Epp 1299

改变历史

如果它是最近的提交,您可以简单地执行此操作:

git commit --amend
Run Code Online (Sandbox Code Playgroud)

这会使编辑器显示最后一次提交消息,并允许您编辑消息.(-m如果要删除旧邮件并使用新邮件,则可以使用.)

推动

然后当你推动时,执行以下操作:

git push --force-with-lease <repository> <branch>
Run Code Online (Sandbox Code Playgroud)

或者您可以使用"+":

git push <repository> +<branch>
Run Code Online (Sandbox Code Playgroud)

或者您可以使用--force:

git push --force <repository> <branch>
Run Code Online (Sandbox Code Playgroud)

使用这些命令时要小心.

  • 如果其他人将更改推送到同一分支,您可能希望避免破坏这些更改.该--force-with-lease选项是最安全的,因为如果有任何上游变化它将中止(

  • 如果您没有明确指定分支,Git将使用默认的推送设置.如果您的默认推送设置为"匹配",则您可以同时销毁多个分支上的更改.

之后拉/取

任何已经拉过的人现在都会收到一条错误消息,他们需要通过这样的方式更新(假设他们自己没有做任何更改):

git fetch origin
git reset --hard origin/master # Loses local commits
Run Code Online (Sandbox Code Playgroud)

使用时要小心reset --hard.如果您对分支进行了更改,那么这些更改将被销毁.

关于修改历史的说明

被破坏的数据实际上只是旧的提交消息,但--force不知道,并且也会愉快地删除其他数据.所以想到--force"我想破坏数据,我确切知道哪些数据被破坏了." 但是当提交被破坏的数据时,您通常可以从reflog中恢复旧的提交 - 数据实际上是孤立的而不是被破坏的(尽管孤立的提交会被定期删除).

如果你认为你没有破坏数据,那就远离--force...... 可能会发生坏事.

这就是为什么--force-with-lease有点安全.

  • 小心那个"修复",好像他们有任何本地的,未被提交的提交,他们将"丢失"(*丢失*真正意义*孤立*,但恢复它们是不明显的). (13认同)
  • 如果你有上游设置,那么简单地`git push --force`没有<repository>和<branch>选项也可以工作. (10认同)
  • @MikeSchinkel:它是远程名称,例如“origin”。 (4认同)
  • 你能举一个`&lt;repository&gt;`的例子吗?是“起源”吗?`组织/回购`?或者只是`repo`? (3认同)
  • 您可能希望在推送 --force 时指定分支名称,否则推送的内容可能超出您的预期。 (2认同)

Man*_*ava 411

说啊 :

git commit --amend -m "New commit message"
Run Code Online (Sandbox Code Playgroud)

然后

git push --force
Run Code Online (Sandbox Code Playgroud)

  • 它不起作用,因为 - 正如“问题”所说 - 提交已经被“推送”。修改适用于未推送的提交。 (13认同)
  • 在我的情况下,`git push origin <BRANCH-NAME>`不起作用,我不得不使用`git push --force`,如接受的答案中所述. (7认同)
  • @ahnbizcad,它应该工作.只需确保分支名称正确即可. (4认同)
  • 对我来说效果很好。1. git commit --amend -m "New commit message" 2. git push --force remoteName 在我的例子中,remoteName 是 origin (4认同)
  • 对我来说效果很好 (4认同)
  • 我为你的解释简单而欢呼!我经常使用它 (3认同)
  • 我成功应用这些命令后,暂时"取消保护"我的分支,这发生在我的GitLab托管的项目上.如果您遇到此问题,在应用这些命令之前,请参阅此/sf/answers/2258698291/以"取消保护"分支,并在完成修改提交消息后再次"保护"它: ) (3认同)

Jin*_* Li 224

聚会可能会迟到,这是我在这里看不到的答案.

步骤1:git rebase -i HEAD~n为最后一次n受影响的提交做交互式rebase .

git会弹出一个编辑器来处理这些提交,请注意这个命令:git rebase -i HEAD~3这正是我们所需要的.

第二步:改变pickr为您要更新的味精这些提交.保存并关闭编辑器.

步骤3:在以下提交文件中,根据需要更新提交消息

Step4:在所有提交后更新msgs.您可能想要r更新遥控器.

  • 这应该是接受的答案,因为它提供了比最近提交更改其他提交的可能性,这与接受的答案不同.你救了我的一天.谢谢! (17认同)
  • 我编辑了此内容以添加更多信息。请看一下。这是我想做的事情的答案,但我滚动了它,因为它没有标题。 (4认同)
  • 如果您编辑了变基“计划”,但它没有开始让您重命名文件的过程,请运行“git rebase --continue”。如果您想更改用于交互式会话的文本编辑器(例如从默认的“vi”到“nano”),请运行“GIT_EDITOR=nano git rebase -i HEAD~n”。 (3认同)
  • 为最后 3 次提交选择 n=3:`git rebase -i HEAD~3` (2认同)
  • 这将使用更正的提交消息创建额外的提交。 (2认同)

Abd*_*wan 41

在控制台中使用这两个步骤:

git commit --amend -m "new commit message"
Run Code Online (Sandbox Code Playgroud)

然后

git push -f
Run Code Online (Sandbox Code Playgroud)

完成:)

  • 简单而有效.我认为这个应该是选择的答案 (4认同)
  • 你是绝地武士.谢谢,没有其他工作! (2认同)

Ste*_*ner 19

应该注意的是,如果你使用多个push --force引用,它们将被修改为结果.确保注意git repo配置的位置.幸运的是,通过指定要更新的单个分支,有一种方法可以稍微保护进程.从git手册页中读取:

请注意, - force适用于所有被推送的引用,因此使用它将push.default设置为匹配或使用远程配置的多个推送目的地.*.push可能会覆盖当前分支以外的引用(包括本地引用)严格落后于他们的远程对手).要强制推送到一个分支,请使用refspec前面的+来推送(例如git push origin + master强制推送到主分支).

  • *非常重要的说明. (3认同)

Jay*_*eli 17

情况 1:未推送 + 最近提交: 请参阅

情况 2:已推送 + 最近提交: 请参阅

情况 3:未推送 + 旧提交: 参考

情况 4:已推送 + 旧提交: 参考


Den*_*any 14

确保您在正确的分支上进行更改

git checkout 
Run Code Online (Sandbox Code Playgroud)

#确保您在正确的分支上进行更改以确保:

git checkout branchname
Run Code Online (Sandbox Code Playgroud)

然后

git commit --amend -m "new message"
Run Code Online (Sandbox Code Playgroud)

然后推

git push --force
Run Code Online (Sandbox Code Playgroud)


Car*_*los 11

如果要修改较旧的提交,而不是最后一个提交,则需要使用rebase命令,如此处所述,Github帮助页面,修改旧的或多个提交消息的消息部分


Teo*_*ing 9

命令1.

git commit --amend -m "New and correct message"
Run Code Online (Sandbox Code Playgroud)

然后,

命令2.

git push origin --force
Run Code Online (Sandbox Code Playgroud)


小智 8

只需使用这两个命令即可更改上次推送的提交消息

  1. -$ git commit --amend -m “新提交消息。”
  2. -$ git push --force-with-lease


rob*_*7cc 7

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

$ git 日志
提交 0c28141c68adae276840f17ccd4766542c33cf1d
作者: 第一 最后
日期:2018 年 8 月 8 日星期三 15:55:52 -0600

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

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

    一些临时提交消息

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

    将背景颜色更改为红色

  • ...如果您稍后需要在 git 日志中搜索对“功能 B”的引用,则会显示勘误提交,但勘误提交消息包含对原始提交 ID 的引用,这提供了完整的可追溯性。顺便说一句,术语“勘误提交”没什么特别的(git 中没有“勘误”命令或选项)...这只是我对正常提交的术语,它提供了对先前有错误/拼写错误的提交的更正。 (2认同)

eve*_*oob 7

FWIW 在最简单的情况下,检查的答案是正确的。我只是想分享一下最近的经历。

这有效。

git commit --amend -m“这里有新消息”

git push --强制原点

测试人员能够第一次检查该分支,并且只有修改后的消息。

因此,在最简单的情况下(单个开发人员和/或知道没有人获取/拉取或签出分支)就足够了。


Beu*_*Beu 5

git commit --amend
Run Code Online (Sandbox Code Playgroud)

然后在当前窗口中编辑和更改消息。在那之后

git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

490231 次

最近记录:

6 年 前