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

Posted

技术标签:

【中文标题】推送后更改 git commit 消息(假设没有人从远程拉出)【英文标题】:Changing git commit message after push (given that no one pulled from remote) 【发布时间】:2012-02-17 08:48:17 【问题描述】:

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

有没有办法做到这一点?

【问题讨论】:

你试过什么?假设您已经知道如何更改提交消息,然后尝试推送,Git 会告诉您需要做什么才能实现它。 查看问题“如何在 git 中编辑不正确的提交消息(我已推送)?”的答案***.com/a/457396/444639 help.github.com/articles/changing-a-commit-message 如果您修改 HEAD 提交并通常推送(没有 --force),那么令人惊讶的是它不会失败。 HEAD 提交消息使用更改后的提交 ID 进行更新。这意味着除了 HEAD 之外的其他提交 ID 保持不变。我注意到 git 2.8.1 版本的这种行为。 所有提交都简单易用,不仅是最近的:***.com/a/5032614/7705712 【参考方案1】:

只要说:

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

然后

git push --force

【讨论】:

它应该可以工作@ahnbizcad,你可能还有其他remote名字,好吧(y)!! 它不起作用,因为 - 正如 QUESTION 所说 - 提交已经是 PUSHED。修改适用于未推送的提交。 尝试此操作后,我收到此错误:remote: To prevent you from losing history, non-fast-forward updates were rejected.remote: Merge the remote changes (e.g. 'git pull') before pushing again. See the 'Noteremote: about fast-forwards' section of 'git push --help' for details.` [remote denied] master -> master (pre-receive hook denied)` 我只是在暂时“取消保护”我的分支后成功应用了这些命令,这发生在我的 GitLab 托管项目中。如果你有这个问题,在应用这些命令之前,请参考这个***.com/a/32267118/1423345来“取消保护”分支,你可以在修改提交信息后再次“保护”它:) 对我来说很好。 1. git commit --amend -m "New commit message" 2. git push --force remoteName branchName 在我的例子中 remoteName 是 origin【参考方案2】:

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

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

然后

git push -f

完成:)

【讨论】:

【参考方案3】:

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

git checkout 

#确保您在正确的分支上进行更改 只是为了确定:

git checkout branchname

然后

git commit --amend -m "new message"

然后推

git push --force

【讨论】:

【参考方案4】:
git commit --amend

编辑提交消息 输入键盘

git push --force

【讨论】:

【参考方案5】:

我对 Git 有点陌生,但我只是想补充一下我的经验。

git commit --amend -m "新的和正确的消息"

这很好,但接下来是我的问题。 在更改提交消息之前,我已经推送了提交。 最后,当我尝试推送到远程时,它 git 抛出了异常。 所以我应该在更新远程分支之前再次下拉。

git pull origin 分支名称

git push origin 分支名称

希望我的小经历对你有所帮助。 谢谢。

【讨论】:

这不是一个很好的解决方案,因为现在您将提交两次,一次是旧消息,一次是更正的消息,合并在一起。【参考方案6】:

命令 1

您需要使用以下命令更改您的提交消息

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

命令 2

添加新消息后执行下面的命令

git push -f origin <your_branch_name>

【讨论】:

【参考方案7】:

要编辑不是最近的提交:

Step1git rebase -i HEAD~n 为最后一个受到影响的n 提交进行交互式变基。 (即,如果您想更改提交消息 3 次提交,请执行 git rebase -i HEAD~3

git 会弹出一个编辑器来处理这些提交,注意这个命令:

#  r, reword = use commit, but edit the commit message

这正是我们需要的!

第 2 步:将 pick 更改为 r 以获取您想要更新消息的提交。不要在此处更改提交消息,它将被忽略。您将在下一步中执行此操作。保存并关闭编辑器。

请注意,如果您编辑了您的变基“计划”,但它并没有开始让您重命名文件的过程,请运行:

git rebase --continue

如果您想更改用于交互式会话的文本编辑器(例如,从默认的 vi 更改为 nano),请运行:

GIT_EDITOR=nano git rebase -i HEAD~n

Step3:Git 会为您之前输入的每个修订版弹出另一个编辑器 r。根据需要更新提交消息,然后保存并关闭编辑器。

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

【讨论】:

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

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

git push --force-with-lease

【讨论】:

【参考方案9】:

如果您使用的是 bitbucket 管道,请提供有关相同问题的其他信息

编辑您的消息

git commit --amend

推送到服务器

git push --force <repository> <branch>

然后将 --force 添加到管道上的推送命令中

git ftp push --force

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

第一次推送后去掉--force

我在 bitbucket 管道上尝试过它并且工作正常

【讨论】:

【参考方案10】:

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

$ 混帐日志 提交 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 commit -m “fixed feature A” (假设 git 给这个提交 ID e3ab7312 ... ...(后来你意识到你的消息不正确,所以现在对文件进行无关紧要的更改,比如在自述文件中添加空格,或者使用 @ 987654324@git 选项)...git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’''' ...如果您稍后需要在 git 日志中搜索对“功能 B”的引用,则会显示勘误表提交,但勘误表提交消息包含对原始提交 ID 的引用,该 ID 提供完全可追溯。顺便说一句,术语“勘误提交”并没有什么特别之处(在 git 中没有“勘误”命令或选项)......这只是我对正常提交的术语,它提供了对先前有错误/错字的提交的更正。 抢劫,效果很好。通过使用 SHA,我能够添加一个具有正确描述的新空提交,它指向原始提交。现在,两者都显示在我的模块的“git 链”中。谢谢! 我很高兴这对你有用。我使用相同的技术来纠正提交消息中的错误。作为替代方案,我最近刚刚发现git notes 这与“勘误提交”的目的相同。只需在之前的提交中添加注释即可注释或更正提交消息中的任何错误:https://git-scm.com/docs/git-notes【参考方案11】:

命令1

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

那么,

命令2

git push origin --force

【讨论】:

【参考方案12】:

这对我来说很好用,

git checkout origin/branchname

如果你已经在分支中,那么最好做 pull 或 rebase

git pull

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

以后你可以简单地使用

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

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

git commit --amend

如果你有很多 cmets,我会更喜欢使用文本编辑器。您可以使用命令设置您喜欢的文本编辑器

git config --global core.editor your_preffered_editor_here

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

然后运行

git push --force

你已经完成了

【讨论】:

【参考方案13】:

如果你想修改一个较旧的提交,而不是最后一个,你需要使用rebase 命令,如这里解释的Github help page,在修改旧的或多个提交消息的消息 部分

【讨论】:

【参考方案14】:

改变历史

如果是最近的提交,你可以这样做:

git commit --amend

这会打开带有最后一条提交消息的编辑器,并允许您编辑该消息。 (如果您想清除旧消息并使用新消息,可以使用-m。)

然后当你推动时,这样做:

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

或者你可以使用“+”:

git push <repository> +<branch>

或者你可以使用--force:

git push --force <repository> <branch>

使用这些命令时要小心。

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

如果您没有明确指定分支,Git 将使用默认推送设置。如果您的默认推送设置是“匹配”,那么您可以同时销毁多个分支上的更改。

事后拉/取

任何已经拉取的人现在都会收到一条错误消息,他们需要通过执行以下操作进行更新(假设他们自己没有进行任何更改):

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

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

关于修改历史记录的说明

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

如果您认为自己不会破坏数据,请远离--force...bad things might happen。

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

【讨论】:

小心那个“修复”,就好像他们有任何本地的、未推送的提交一样,他们将被“丢失”(lost 真正的意思是 orphaned ,但恢复它们并不明显)。 你可能想在推送时指定分支名称--force,否则你可能会推送比你预期的更多。 @user693960:Git 只会推送你配置它推送的内容。 如果您设置了上游,只需 git push --force 没有 选项也可以。 你能举一个&lt;repository&gt;的例子吗?是origin吗? org/repo?或者只是repo【参考方案15】:

需要注意的是,如果你使用push --force 和多个引用,它们都会因此被修改。请务必注意你的 git repo 被配置为推送到哪里。幸运的是,有一种方法可以稍微保护该过程,方法是指定一个要更新的分支。从 git 手册页中阅读:

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

【讨论】:

非常重要提示。 没有一个强制答案对我有用,因为我在服务器上没有 ForcePush 权限。相反,我想执行一个更改先前提交消息的提交。我可以在该提交的评论部分写“提交消息已更改”。

以上是关于推送后更改 git commit 消息(假设没有人从远程拉出)的主要内容,如果未能解决你的问题,请参考以下文章

Git - Android Studio不再允许我提交更改并推送到GitHub

Git 修改已提交 commit 的信息

git撤销commit

版本控制 GIT-Commit 未显示任何更改

Git撤回已经推送(push)至远程仓库提交(commit)的版本

更改 git 合并分支冲突消息 [重复]