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

问题描述 投票:827回答:11

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

有没有办法做到这一点?

git push commit
11个回答
1203
投票

Changing history

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

git commit --amend

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

Pushing

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

git push --force-with-lease <repository> <branch>

或者您可以使用“+”:

git push <repository> +<branch>

或者你可以使用--force

git push --force <repository> <branch>

使用这些命令时要小心。

  • 如果其他人将更改推送到同一分支,您可能希望避免破坏这些更改。 --force-with-lease选项是最安全的,因为如果有任何上游变化它会中止(
  • 如果您没有明确指定分支,Git将使用默认的推送设置。如果您的默认推送设置为“匹配”,则您可以同时销毁多个分支上的更改。

Pulling / fetching afterwards

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

git fetch origin
git reset --hard origin/master # Loses local commits

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

A note about modifying history

被破坏的数据实际上只是旧的提交消息,但--force不知道这一点,并且也乐意删除其他数据。因此,将--force视为“我想破坏数据,我确切知道哪些数据正在被破坏。”但是当提交被破坏的数据时,您通常可以从reflog中恢复旧的提交 - 数据实际上是孤立的而不是被破坏的(尽管孤立的提交会被定期删除)。

如果你认为你没有破坏数据,那就远离--force ... bad things might happen

这就是--force-with-lease更安全的原因。


1
投票

这对我很有用,

git checkout origin / branchname

如果你已经在分支机构,那么最好做拉或退刀

git pull

要么

git -c core.quotepath=false fetch origin --progress --prune

以后你可以简单地使用

git commit --amend -m "Your message here"

或者如果你想打开文本编辑器然后使用

git commit --amend

如果你有很多评论我会更喜欢使用文本编辑器。您可以使用命令设置首选文本编辑器

git config --global core.editor your_preffered_editor_here

无论如何,当您完成更改提交消息后,保存并退出

然后跑

git push --force

而且你已经完成了


0
投票

如果您使用bitbucket管道,相同问题的其他信息

编辑你的信息

git commit --amend

推送到服务器

git push --force <repository> <branch>

然后在管道上添加--force到push命令

git ftp push --force

这将删除您之前的提交并推送您当前的提交。

首次推送后删除--force

我在bitbucket管道上试了一下它的工作正常


371
投票

说啊 :

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

然后

git push --force

194
投票

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

第1步:git rebase -i HEAD~n为受影响的最后一个n提交进行交互式rebase。

git会弹出一个编辑器来处理这些提交,请注意这个命令:# r, reword = use commit, but edit the commit message,这正是我们需要的。

第2步:将pick更改为r,以获取要更新msg的提交。保存并关闭编辑器。

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

Step4:在所有提交后更新msgs。你可能想做git push -f更新遥控器。


38
投票

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

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

然后

git push -f

完成:)


18
投票

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

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


11
投票

如果要修改较旧的提交,而不是最后一个提交,则需要使用rebase命令,如Github help page中所述,修改旧的或多个提交消息的消息部分


8
投票

命令1。

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

然后,

命令2。

git push origin --force

3
投票
git commit --amend

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

git push --force-with-lease

2
投票

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

$ git log
commit 0c28141c68adae276840f17ccd4766542c33cf1d
Author: First Last 
Date:   Wed Aug 8 15:55:52 2018 -0600

    Errata commit:
    This commit has no substantive code change.
    This commit is provided only to document a correction to a previous commit message.
    This pertains to commit object e083a7abd8deb5776cb304fa13731a4182a24be1
    Original incorrect commit message:
        Changed background color to red
    Correction (*change highlighted*):
        Changed background color to *blue*

commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Author: First Last 
Date:   Wed Aug 8 15:43:16 2018 -0600

    Some interim commit message

commit e083a7abd8deb5776cb304fa13731a4182a24be1
Author: First Last 
Date:   Wed Aug 8 13:31:32 2018 -0600

    Changed background color to red
© www.soinside.com 2019 - 2024. All rights reserved.