推送后更改git提交消息(假设没有人从远程拉取)

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

有办法做到这一点吗?

851515 次浏览

改变历史

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

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 origingit reset --hard origin/master # Loses local commits

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

关于修改历史的笔记

被销毁的数据实际上只是旧的提交消息,但是--force不知道这一点,并且也会很高兴地删除其他数据。所以把--force想象成“我想销毁数据,我确定哪些数据正在被销毁。”但是当被销毁的数据被提交时,你通常可以从reflg中恢复旧的提交——数据实际上是孤儿而不是被销毁(尽管孤立的提交会定期删除)。

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

这就是为什么--force-with-lease更安全。

只要说:

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

然后

git push --force

需要注意的是如果你使用#0和多个引用,它们都将被修改。请务必注意您的git repo配置为推送到的位置。幸运的是,有一种方法可以通过指定要更新的单个分支来稍微保护该过程。从git手册页面阅读:

注意--force适用于所有被推送的引用,因此使用push.default设置为匹配或多个推送配置有远程.*. ush的目标可能会覆盖其他引用比当前分支(包括严格落后的本地裁判)要强制仅向一个分支推送,请使用+在refspec前面推送(例如git推送起源+主强制###返回主分支

如果你想修改一个旧的提交,而不是最后一个,你需要使用rebase命令,如这里所述,github帮助页面,在修改旧的或多个提交消息的消息部分

要编辑最新提交以外的提交:

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

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

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

这正是我们所需要的!

step2:将要更新消息的提交更改为pickr。不要在此处更改提交消息,它将被忽略。您将在下一步中执行此操作。保存并关闭编辑器。

请注意,如果您编辑rebase'plan'但它没有开始让您重命名文件的过程,请运行:

git rebase --continue

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

GIT_EDITOR=nano git rebase -i HEAD~n

Step3:Git会为您之前放置r的每个版本弹出另一个编辑器。根据需要更新提交msg,然后保存并关闭编辑器。

Step4:更新所有提交消息后。你可能想做git push -f来更新远程。

命令1

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

然后,

命令2

git push origin --force

这对我很有效,

git检出来源/分支名称

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

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

你就完蛋了

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

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

然后

git push -f

已完成:)

git commit --amend

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

git push --force-with-lease

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

$ git logcommit 0c28141c68adae276840f17ccd4766542c33cf1dAuthor: First LastDate:   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 e083a7abd8deb5776cb304fa13731a4182a24be1Original incorrect commit message:Changed background color to redCorrection (*change highlighted*):Changed background color to *blue*
commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4Author: First LastDate:   Wed Aug 8 15:43:16 2018 -0600
Some interim commit message
commit e083a7abd8deb5776cb304fa13731a4182a24be1Author: First LastDate:   Wed Aug 8 13:31:32 2018 -0600
Changed background color to red

如果您使用的是比特桶管道,则有关同一问题的其他信息

编辑您的消息

git commit --amend

推到断路器

git push --force <repository> <branch>

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

git ftp push --force

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

第一次推送后删除--force

我尝试了它在bit的管道和它的工作正常

  • 命令1

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

    git commit --amend -m "New and correct message"
  • 命令2

    添加新消息后,然后执行以下命令

    git push -f origin <your_branch_name>

我对Git有点陌生,但我只想添加我的经验。

git提交--修改-m"新的和正确的消息"

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

git拉取源分支名称

git推送源分支名称

希望我的经验对你有所帮助。谢谢!

git commit --amend

编辑提交消息键入键盘

git push --force

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

git checkout

#确保您在正确的分支上进行更改请注意:

git checkout branchname

然后

git commit --amend -m "new message"

那就推

git push --force

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

  1. -$git提交--修改-m"新提交消息。"
  2. -$git推送

case 1:未推送+最近一次提交:引用这个

case 2:已推送+最近一次提交:引用这个

case 3:未推送+旧提交:引用这个

case 4:已推送+旧提交:引用这个

如果您使用以下-S参数提交worng消息,则事件将起作用:

 git checkout branch
git commit --amend -m "Your new message"

此时不要忘记您添加了更改并且您的遥控器不同,这就是为什么您需要执行:

 git push --force

如果您在VSCode中,您会看到差异,使用--force参数,您忽略git拉取并将更改的消息推送到相同的提交。

我第一次尝试重命名大约6条已经推送的旧提交消息,此后我做了进一步的提交。

所以这是最糟糕的情况Case 4:已推送+旧提交

我是Vim(现在是Nvim)用户和维姆的逃犯的超级粉丝。所以这就是我用它做的。

这是您在在逃犯中重新定位周围的一般帮助:

Rebase maps ~
ri                      Perform an interactive rebase.  Uses ancestor ofu                       commit under cursor as upstream if available.
rf                      Perform an autosquash rebase without editing the todolist.  Uses ancestor of commit under cursor asupstream if available.
ru                      Perform an interactive rebase against @{upstream}.
rp                      Perform an interactive rebase against @{push}.
rr                      Continue the current rebase.
rs                      Skip the current commit and continue the currentrebase.
ra                      Abort the current rebase.
re                      Edit the current rebase todo list.
rw                      Perform an interactive rebase with the commit underthe cursor set to `reword`.
rm                      Perform an interactive rebase with the commit underthe cursor set to `edit`.
rd                      Perform an interactive rebase with the commit underthe cursor set to `drop`.
r<Space>                Populate command line with ":Git rebase ".
r?                      Show this help.
  1. 获取提交列表。

    :Git log --oneline输入图片描述

  2. 我想修复第12行(4d43a1b build(MPL-402): editorconfig fix for messges.json)的提交消息,因为它不是正确的常规提交格式。

  3. 我将光标放在提交哈希4d43a1b上并键入rw

    这将“执行交互式rebase,将光标下的提交设置为reword”。请注意,与git rebase -i HEAD~X相比,这有多好-知道X是什么并不那么简单。输入图片描述

  4. 现在应该会给你正确的git rebase命令。所以用:wq写入并退出该缓冲区

  5. 然后按照git/fugitive指导你的步骤进行操作。我的一个提交遇到了合并冲突,我通过正常的逃逸合并冲突进程修复了它。

希望这足以让你克服第一个“我以前从未做过rebase,我到底该怎么办?”的障碍。如果您需要帮助完成后面的步骤,请给我留言。