【发布时间】:2017-11-01 18:17:59
【问题描述】:
我想更改之前推送的提交消息。另外,在那之后我已经推送了其他提交。如果我更改提交消息,Git 提交历史中会显示较旧的消息。
【问题讨论】:
标签: git
我想更改之前推送的提交消息。另外,在那之后我已经推送了其他提交。如果我更改提交消息,Git 提交历史中会显示较旧的消息。
【问题讨论】:
标签: git
git checkout revision-to-correct
git commit --amend -m "corrected message"
如果是“曾经”在顶部的修订,您可以挑选它们,然后将原始分支移动到新位置...然后您可以推动 --force:
git cherry-pick revision-to-correct..some-branch
git branch -f some-branch
git push origin --force some-branch
更新:在学习了一些技巧之后,还有一个非常简单的方法:
git rebase -i HEAD~2
# rebase will open a list of revisions, on the first line, change pick for reword (or r, for short)
# save and exit.... git rebase will start running
# and it will stop right after the second to last revision is applied
# and you will be on the editor so that you can modify the message for the revision
# set the message, save and exit
# git rebase will finish running and you are done
【讨论】:
所以你有一个答案告诉你如果提交没有被推送(忽略你明确说它已经被推送),你将如何执行此操作。并且您有几个答案可以为您提供您认为效果很好的程序,直到您的同事开始抱怨。但似乎没有人愿意告诉你真正的分数。
提交消息是提交身份的基本组成部分。这就是为什么在 Edmundo 的程序中,您最终不得不进行一堆无意义的挑选和强制操作。 (如果你使用 -f 或 --force 选项,那么 git 会试图警告你一些事情。)
所以澄清一下:
没有没有机制来编辑提交的消息。您可以将提交替换为相同的新提交,除了有一条新消息,但如果这样做您删除已推送的提交,则回购的每个其他用户都必须恢复,因为您刚刚执行了有效的上游变基。 (请参阅git rebase 文档中的“从上游 rebase 恢复”。)
这并不意味着你永远做不到;这意味着您应该在使用相关分支之前获得所有使用该分支的人的同意。
并且在您指定的情况下 - 不仅要修改的提交而且还推送了一些后续提交 - 这些提交也需要被替换。并且每个指向其中任何一个的 ref 都必须被重写。例如,如果您有
x --- x --- A --- B --- C --- D <--(master)
\
E --- F <--(branch1)
并且您想重写A 的提交消息。所以你听从 Edmundo 的建议(毕竟,这比其他人的建议更接近正确)。你检查A 并运行commit --amend,现在你有
x --- x --- A --- B --- C --- D <--(master)
\ \
\ E --- F <--(branch1)
A'
请注意,您的分支仍然在其历史记录中“看到”原始提交(带有原始消息),这就是 Edmundo 说您随后会进行一些挑选的原因。现在,如果您真的想要这样做,那么挑选樱桃实际上是一种艰难的方式;此时最好使用filter-branch 将B 从A 重新设置为A'。
当然,重新育儿是仍然历史重写,所以现在你得到的是
x --- x --- A --- B --- C --- D <--(origin/master)
\ \
\ E --- F <--(origin/branch1)
\
A' --- B' --- C' --- D' <--(master)
\
E' --- F' <--(branch1)
要修复那个,您必须同时强制推送master 和branch1。一旦你这样做了,任何其他人在 D 或 F 之后添加的任何工作(在各自的分支上,或在新的分支上)都必须重新基于你的工作。
如果您没有与您的同事仔细协调,他们会发现需要通过一个有点神秘的错误消息重新调整他们的工作,并且如果他们以“错误”的方式做出反应 - 即导致的方式他们是最后一个令人头疼的问题——即强制推送,因为它可以清除错误,就像你所做的那样——然后历史记录将再次拥有原始的 A 以及你想要删除的原始提交消息。
所以,如果这听起来仍然值得麻烦,那么正确的程序是
1) 与 repo 的所有其他用户协调转换 2) 遵循类似于 Edmundo 的程序,但可能需要进行我上面建议的修改
您可能想看看其他解决方案(例如注释或带注释的标签)是否能满足您的需求。
【讨论】:
要更改最近(未推送)提交的提交消息,您可以简单地使用
git commit –amend -m 'new message'
在过去进一步更改(未推送的)提交的消息:
git rebase -i [COMMIT BEFORE THE FIRST YOU WANT TO EDIT]
用“编辑”标记所有要更改的消息。
Git 将启动变基并在每个标记的提交处停止。对于每一个,做一个
git commit –amend -m 'new message'
git rebase –continue
【讨论】: