如何修改现有的、未推送的提交消息?

问题描述:

这个问题的答案是社区的努力。编辑现有答案以改进这篇文章。它目前不接受新的答案或交互。

我在提交消息中写错了。

如何更改消息?提交尚未推送。

解决方案1:

huntsbot.com – 高效赚钱,自由工作

修改最近的提交信息

git commit --amend

将打开您的编辑器,允许您更改最近提交的提交消息。此外,您可以直接在命令行中设置提交消息:

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

…但是,这会使多行提交消息或小的更正输入更加麻烦。

确保在执行此操作之前没有暂存任何工作副本更改,否则它们也会被提交。 (未暂存的更改不会被提交。)

更改已推送到远程分支的提交消息

如果您已经将提交推送到远程分支,那么 - 在本地修改提交之后(如上所述) - 您还将 need to force push the commit 使用:

git push   --force
# Or
git push   -f

警告:强制推送将用本地分支的状态覆盖远程分支。如果远程分支上有本地分支中没有的提交,您将丢失这些提交。

警告:修改您已与其他人共享的提交时要小心。 修改提交实质上是重写它们以具有不同的 SHA ID,如果其他人会造成问题有你重写的旧提交的副本。任何拥有旧提交副本的人都需要将他们的工作与您新重写的提交同步,这有时会很困难,因此请确保在尝试重写共享提交历史时与其他人协调,或者只是避免重写共享提交共。

执行交互式变基

另一种选择是使用交互式变基。这允许您编辑要更新的任何消息,即使它不是最新消息。

为了做一个 Git squash,请按照以下步骤操作:

// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n

压缩提交后 - 选择 e/r 来编辑消息:

https://i.stack.imgur.com/LVcm9.png

关于交互式变基的重要说明

当您使用 git rebase -i HEAD~n 时,可能会有 更多 次提交。 Git 将“收集”最后 n 次提交中的所有提交,如果在该范围之间的某处有合并,您也会看到所有提交,因此结果将为 n + 。

好提示:

如果您必须为多个分支执行此操作,并且在修改内容时可能会遇到冲突,请设置 git rerere 并让 Git 自动为您解决这些冲突。

文档

git-commit(1) 手册页

git-rebase(1) 手册页

git-push(1) 手册页

但是 git commit --amend 不如 git rebase -i 强大。

@jeffjose,绝对不需要。此外,git commit --amend 可以修复(a?)主提交。

如果您已经推送,只需再次强制推送:git push -f origin branchname

如果其他人使用同一个存储库,@hughes git push -f 会不会有点危险?

如果您不想重写整个提交消息,请选择 git commit --amend -c HEAD。这将打开预先填充了您的旧提交消息的编辑器,因此您可以更改它。

解决方案2:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

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

我做了 git commit --amend -m "New message",但是推送到 Github 生成了“在再次推送之前合并远程更改”。 pull 之后,commit --amend,再push,新消息就没有出现了。相反,我有“合并 github.com 的分支'master':[myrepo]”

@DaveEveritt 您很可能在尝试修复之前将您的提交推送到上游。

@Kyralessa 不正确。在 bash 中,您可以通过在完成之前不关闭引号来轻松编写多行提交消息(在引号内的每行末尾点击 return)。

我不明白一个看起来很像两年前写的答案的主要思想的答案,而且接受的答案也获得了如此多的选票。奇怪的。 (虽然答案没有错)

@AmalMurali,好吧。我的观点与问题的受欢迎程度无关,也与答案的实用性无关。但是这个特定的答案不是最古老的答案,也没有提供任何对已接受答案的进一步洞察。它似乎是已接受答案的一部分的副本。那是我的观点。干杯!

解决方案3:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

如果您要修复的提交不是最新的:

git rebase --interactive $parent_of_flawed_commit 如果你想修复几个有缺陷的提交,请传递其中最旧的提交的父级。一个编辑器会出现,列出自你提交以来的所有提交。在您要修复的任何提交之前更改选择以重新编写(或在旧版本的 Git 上进行编辑)。保存后,Git 将重播列出的提交。对于您想要改写的每个提交,Git 都会将您拉回到您的编辑器中。对于您要编辑的每个提交,Git 会将您放入 shell。如果您在 shell 中:以您喜欢的任何方式更改提交。 git commit --amend git rebase --continue

这个序列的大部分内容将通过各种命令的输出向您解释。这很容易;您无需记住它 - 只需记住 git rebase --interactive 可让您更正提交,无论它们是多久以前的。

请注意,您不会想要更改已推送的提交。或者你可能会这样做,但在这种情况下,你将不得不非常小心地与每个可能已经取消你的提交并在他们之上完成工作的人进行沟通。 How do I recover/resynchronise after someone pushes a rebase or a reset to a published branch?

可以更改第一次提交的消息(没有父项)吗?

这在其他答案之一中有所提及,但我会在此处记下。从 git 1.6.6 开始,您可以使用 reword 代替 pick 来编辑日志消息。

顺便提一下,$parent_of_flawed_commit 等价于 $flawed_commit^。

如果您已经向上游推送,永远不要这样做(或一般地变基)!

如果在有缺陷的提交后有合并,请使用 -p (--preserve-merges)。

解决方案4:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

要修改先前的提交,请进行所需的更改并暂存这些更改,然后运行

git commit --amend

这将在您的文本编辑器中打开一个文件,代表您的新提交消息。它开始填充旧提交消息中的文本。根据需要更改提交消息,然后保存文件并退出编辑器以完成。

要修改先前的提交并保持相同的日志消息,请运行

git commit --amend -C HEAD

要通过完全删除之前的提交来修复它,请运行

git reset --hard HEAD^

如果要编辑多个提交消息,请运行

git rebase -i HEAD~commit_count

(将 commit_count 替换为您要编辑的提交数。)此命令将启动您的编辑器。将第一个提交(您要更改的那个)标记为“编辑”而不是“选择”,然后保存并退出您的编辑器。进行您要提交的更改,然后运行

git commit --amend
git rebase --continue

注意:您还可以从 git commit --amend 打开的编辑器中“进行所需的更改”

git rebase -i HEAD~commit_count 还允许您更改您选择的提交的提交消息。只需将所选提交标记为“reword”而不是“pick”。

如果你不想变基怎么办?您只想更改旧消息?

git reset --hard 消除未提交的更改。请将 --hard 替换为 --soft。

同意,git reset --hard 是一个完全合法的命令,但考虑到这个问题,它会产生误导。如果您提交了想要丢弃的更改,则使用 --hard,而不是在提交消息中输入错误!

git commit --amend -C HEAD 是金色的!谢谢

解决方案5:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

如前所述,git commit --amend 是覆盖最后一次提交的方式。注意事项:如果您还想覆盖文件,则命令为

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

如果您不想添加所有内容,您可以先执行 git add file.ext,然后再执行 git commit --amend

解决方案6:

huntsbot.com – 高效赚钱,自由工作

您也可以为此使用 git filter-branch。

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

它不像微不足道的 git commit --amend 那样简单,但它特别有用,如果您在错误的提交消息之后已经进行了一些合并。

请注意,这将尝试重写 HEAD 和有缺陷的提交之间的 每个 提交,因此您应该非常明智地选择 msg-filter 命令 😉

如果正则表达式没有找到任何东西,是否有一个版本不会更改提交?

AFAIK filter-branch --msg-filter 无论如何都会生成新的提交。但是,您可以在 msg-filter 中检查 sed 是否成功,并在 filter-branch 操作结束时使用此信息将树重置为 refs/original。

@DavidHogue 仅在使用 filter-branch 方法时才适用。如果您使用交互式变基,则修改提交后的提交 ID 不会更改。

@Mark 是的,他们这样做,他们必须这样做。提交 ID 取决于之前的提交。如果它们不改变,git 将毫无用处。

您需要 $flawed_commit^..HEAD,而不是 $flawed_commit..HEAD。如手册页所述:«该命令只会重写命令行中提到的正引用(例如,如果您传递 a..b,则只会重写 b)。»

解决方案7:

huntsbot.com – 高效赚钱,自由工作

我更喜欢这种方式:

git commit --amend -c 

否则,将会有一个带有新提交 ID 的新提交。

对我来说,使用上面的命令实际上会创建一个带有新提交 ID 的新提交以及一个额外的提交,将“合并分支”作为默认提交消息。

修改总是使用新的提交 ID 创建一个新的提交。提交 ID 是提交内容的 SHA 哈希,包括提交消息和创作/提交的时间戳。这是 Git 的一个特性,除非哈希冲突,否则可以确保具有相同 ID 的两个提交是完全相同的提交,具有完全相同的内容、历史记录等。

同意埃米尔的观点。此外,阅读文档-似乎所有“-c”所做的都是告诉git将哪个提交的消息用作新提交的默认/模板。实际上它已经默认执行“-c ” ,所以不需要指定。

-c 做了一些事情。它默认使用旧消息,但它也复制作者信息(人和时间)。 -C 做同样的事情,只是它不要求您编辑消息。

就像@SantanuDey 一样,它对我不起作用。我得到了fatal: Option -m cannot be combined with -c/-C/-F/--fixup.

解决方案8:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

如果您使用的是 Git GUI 工具,则有一个名为 Amend last commit 的按钮。单击该按钮,然后它将显示您的最后提交文件和消息。只需编辑该消息,您就可以使用新的提交消息来提交它。

或者从控制台/终端使用这个命令:

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

此答案字面上与此 older one 相同。在提供另一个答案之前,您是否检查过现有答案?

解决方案9:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

您可以使用 Git rebasing。例如,如果你想修改回提交 bbc643cd,运行

$ git rebase bbc643cd^ --interactive

在默认编辑器中,将要修改其提交的行中的“pick”修改为“edit”。进行更改,然后使用

$ git add 

现在你可以使用

$ git commit --amend

修改提交,然后

$ git rebase --continue

返回到上一个头部提交。

如果您想确保对 git commit --amend 的更改生效,您可以使用 git show,它会显示新消息。

解决方案10:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

如果您只想修改上一条提交消息,请执行以下操作: git commit --amend

这将使您进入您的文本编辑器并让您更改最后的提交消息。

如果您想更改最后三个提交消息,或者到该点的任何提交消息,请将 HEAD~3 提供给 git rebase -i 命令: git rebase -i HEAD~3

This earlier answer 已经说你可以使用 git commit --amend,它还说你可以使用 git rebase -i HEAD~commit_count,你所做的只是为 commit_count 插入 3。

也被否决了。人们只是懒得去read existing answers。

这不是完整的答案,缺少“找到您想要的提交,将选择更改为 r(改写)...”,如此处所述 stackoverflow.com/a/28421811/1818723

解决方案11:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

如果您必须在多个分支上更改旧的提交消息(即,带有错误消息的提交存在于多个分支中),您可能需要使用:

git filter-branch -f --msg-filter \
'sed "s///g"' -- --all

Git 将创建一个临时目录用于重写并另外备份 refs/original/ 中的旧引用。

-f 将强制执行操作。如果临时目录已经存在或者已经有引用存储在 refs/original 下,则这是必要的。如果不是这种情况,您可以删除此标志。

– 将过滤器分支选项与修订选项分开。

–all 将确保重写所有分支和标签。

由于旧引用的备份,您可以轻松地回到执行命令之前的状态。

假设您想恢复您的 master 并在分支 old_master 中访问它:

git checkout -b old_master refs/original/refs/heads/master

这个答案没有解决 OP 的问题,因为他们纯粹对修复他们刚刚完成的提交感兴趣。我经常使用 git commit --amend 来修正评论或将我忘记的文件添加到 git add,但只是在我git push编辑之前曾经。当我想完全弄乱版本历史时,我也使用 git filter-branch,但 OP 不想要这个,所以这个答案需要一个很大的健康警告 - 不要在家里尝试这个,偷看!!

原文链接:https://www.huntsbot.com/qa/rD2b/how-to-modify-existing-unpushed-commit-messages?lang=zh_CN

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值