ChatGPT解决这个技术问题 Extra ChatGPT

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

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

有没有办法做到这一点?

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

C
Community

改变历史

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

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 更安全的原因。


小心那个“修复”,就好像他们有任何本地的、未推送的提交一样,他们将“丢失”(丢失真正意味着孤立,但恢复它们并不明显)。
您可能希望在推送时指定分支名称--force,否则您可能会推送比预期更多的内容。
@user693960:Git 只会推送您配置它推送的内容。
只需 git push --force,无需 <repository>和<分支>如果您设置了上游,选项也可以使用。
你能举一个<repository>的例子吗?是origin吗? org/repo?还是只是repo
U
Uwe Keim

说啊:

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 'Note remote: about fast-forwards' section of 'git push --help' for details. ` [remote denied] master ->主人(预接收挂钩被拒绝)`
我只是在暂时“取消保护”我的分支后成功应用了这些命令,这发生在我的 GitLab 托管项目中。如果你有这个问题,在应用这些命令之前,请参考这个stackoverflow.com/a/32267118/1423345来“取消保护”分支,你可以在修改提交信息后再次“保护”它:)
对我来说很好。 1. git commit --amend -m "New commit message" 2. git push --force remoteName branchName 在我的例子中 remoteName 是 origin
N
Notts90 supports Monica

要编辑不是最近的提交:

第 1 步git 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

第 3 步: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
我对此进行了编辑以添加更多信息。请看一下。这是我想要做的事情的答案,但我滚动了它,因为它没有标题。
这使用更正的提交消息创建了额外的提交。
n
nCardot

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

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

接着

git push -f

完毕 :)


S
Steve Benner

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

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


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

命令 1。

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

然后,

命令 2。

git push origin --force

B
Beu
git commit --amend

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

git push --force-with-lease

C
Carlos

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


D
Denzel Akwany

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

git checkout 

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

git checkout branchname

然后

git commit --amend -m "new message"

然后推

git push --force

r
rob_7cc

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

$ 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

抢,这看起来很有希望。你能显示执行“勘误提交”所需的命令吗?根据这些条款,只有这篇文章会出现在谷歌中。
“勘误提交”只是一个正常的提交,其中包含一条引用先前错误提交的消息,记录并提供对先前错误的更正。 git commit -m “fixed feature A”(假设 git 给它一个 e3ab7312 的提交 ID ... ...(后来您意识到您的消息不正确,所以现在对文件进行无关紧要的更改,例如在自述文件中添加空格,或使用 { 2} git 选项)... git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’ '''
...如果您稍后需要在 git 日志中搜索对“功能 B”的引用,则会显示勘误表提交,但勘误表提交消息包含对原始提交 ID 的引用,它提供了完整的可追溯性。顺便说一句,术语“勘误提交”并没有什么特别之处(在 git 中没有“勘误”命令或选项)......这只是我对正常提交的术语,它提供了对先前有错误/错字的提交的更正。
抢,效果很好。通过使用 SHA,我能够添加一个具有正确描述的新空提交,它指向原始提交。现在,两者都显示在我的模块的“git链”中。谢谢!
我很高兴这对你有用。我使用相同的技术来纠正提交消息中的错误。作为替代方案,我最近刚刚发现 git notes 这与“勘误提交”的目的相同。只需在之前的提交中添加注释即可注释或更正提交消息中的任何错误:https://git-scm.com/docs/git-notes
r
rNkL

只需使用这 2 个命令来更改您上次推送的提交消息

-$ git commit --amend -m "新的提交信息。" -$ git push --force-with-lease


S
Syscall

命令 1 您需要使用以下命令更改您的提交消息 git commit --amend -m "New and correct message"

命令 2 添加新消息后,然后执行以下命令 git push -f origin


u
unicorn

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

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

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

git pull origin 分支名称

git push origin 分支名称

希望我的小经验能帮到你。谢谢。


这不是一个很好的解决方案,因为现在您将提交两次,一次与旧消息,一次与更正的消息,合并在一起。
A
Anupam Maurya
git commit --amend

使用类型键盘编辑提交消息

git push --force

H
Hasasn

这对我来说很好,

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

你完成了


修改配置设置的有趣想法 - 但我实际上在改变什么,你为什么推荐它?没有这个,你的答案只是多年后给出的答案。
A
Abdallah Awwad Alkhwaldah

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

编辑您的消息

git commit --amend

推送到服务器

git push --force <repository> <branch>

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

git ftp push --force

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

第一次推送后删除 --force

我在 bitbucket 管道上试过了,它工作正常