我做了一个git commit和随后的推送。我想更改提交消息。如果我理解正确,那么这是不可取的,因为有人在进行此类更改之前可能已经从远程存储库中拉出了。如果我知道没人拉怎么办?
有没有办法做到这一点?
我做了一个git commit和随后的推送。我想更改提交消息。如果我理解正确,那么这是不可取的,因为有人在进行此类更改之前可能已经从远程存储库中拉出了。如果我知道没人拉怎么办?
有没有办法做到这一点?
Answers:
如果这是最新的提交,则可以执行以下操作:
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
…… 可能会发生坏事。
这就是为什么--force-with-lease
更安全的原因。
git push --force
没有<库>和<枝>选项工作也一样,如果你有你的上游设置了。
<repository>
吗?是origin
吗 org/repo
?还是只是repo
?
说啊 :
git commit --amend -m "New commit message"
然后
git push --force
git push origin <BRANCH-NAME>
不起作用,我不得不git push --force
按照接受的答案中的说明使用。
git push --force
,否则推不成功。
步骤1:git rebase -i HEAD~n
对n
受影响的最后一次提交进行交互式变基。(即,如果您想更改3次提交的提交消息,请执行git rebase -i HEAD~3
)
git将弹出一个编辑器来处理这些提交,请注意以下命令:
# r, reword = use commit, but edit the commit message
那正是我们所需要的!
第二步:更改pick
到r
为您要更新的消息,这些提交。请勿在此处更改提交消息,它将被忽略。您将在下一步中进行操作。保存并关闭编辑器。
请注意,如果您编辑了重新设定的“计划”,但它没有开始让您重命名文件的过程,请运行:
git rebase --continue
如果要更改用于交互式会话的文本编辑器(例如,从默认的vi更改为nano),请运行:
GIT_EDITOR=nano git rebase -i HEAD~n
第三步:Git将为您r
之前输入的每个修订版本弹出另一个编辑器。根据需要更新提交消息,然后保存并关闭编辑器。
步骤4:更新所有提交消息之后。您可能要git push -f
更新遥控器。
git rebase -i HEAD~3
git rebase --continue
。并且,如果您想更改用于交互式会话的文本编辑器(例如,从默认更改vi
为nano
),请运行GIT_EDITOR=nano git rebase -i HEAD~n
。
应该注意的是,如果您使用多个push --force
引用,那么它们将全部被修改。确保注意您的git repo配置为推送到的位置。幸运的是,有一种方法可以通过指定要更新的单个分支来稍微保护该过程。从git手册页中读取:
请注意--force适用于所有推送的ref,因此将push.default设置为match或与配置了remote的多个推送目标一起使用它。*。push可能会覆盖当前分支以外的其他ref(包括本地ref严格落后于他们的远程对象)。要强制只推送到一个分支,请在refspec前面使用+进行推送(例如git push origin + master强制推送到master分支)。
如果要修改旧的提交,而不是最后一个,则需要使用rebase
命令,在这里解释,Github上帮助页面,在修改的旧或多个消息提交信息部分
另一个选择是创建一个附加的“勘误提交”(并推送),该引用引用包含错误的提交对象-新的勘误提交也提供了更正。勘误提交是指没有实质性代码更改而是重要的提交消息的提交-例如,在您的自述文件中添加一个空格字符,然后使用重要的提交消息来提交更改,或者使用git选项--allow-empty
。它肯定比重定基础更容易,更安全,它不会修改真实的历史记录,并且可以使分支树保持干净(使用amend
如果您要更正最新的提交,它也是一个不错的选择,但是对于较早的提交,勘误提交可能是一个不错的选择)。这种事情很少发生,仅记录错误就足够了。将来,如果您需要在git日志中搜索功能关键字,则可能不会出现原始(错误)提交,因为该原始提交(原始错字)使用了错误的关键字-但是,该关键字会出现在勘误提交中,然后将您指向具有错字的原始提交。这是一个例子:
$ git日志 提交0c28141c68adae276840f17ccd4766542c33cf1d 作者:先到后 日期:2018年8月8日星期三15:55:52 2018-06-06 勘误提交: 该提交没有实质性的代码更改。 提供此提交仅是为了记录对先前提交消息的更正。 这涉及提交对象e083a7abd8deb5776cb304fa13731a4182a24be1 原始不正确的提交消息: 将背景色更改为红色 校正(*更改突出显示*): 将背景色更改为*蓝色* 提交032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4 作者:先到后 日期:2018年8月8日星期三15:43:16 -0600 一些临时提交消息 提交e083a7abd8deb5776cb304fa13731a4182a24be1 作者:先到后 日期:2018年8月8日星期三13:31:32 2018-0600 将背景色更改为红色
git commit -m “fixed feature A”
(让我们假设git为它提供了一个提交ID e3ab7312 ......(后来您意识到您的消息是不正确的,所以现在对文件进行无关紧要的更改,例如在自述文件中添加一个空格,或者使用—allow-empty
git选项)。 .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’
''”
git notes
这将与“勘误提交”具有相同的目的。只需在以前的提交中添加注释以注释或更正提交消息中的任何错误: https://git-scm.com/docs/git-notes
这对我来说很好
git checkout来源/分支名称
如果您已经在分支中,那么最好进行拉动或变基
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
推到服务器
git push --force <repository> <branch>
然后将--force添加到管道上的push命令中
git ftp push --force
这将删除您之前的提交并推送您当前的提交。
第一次推动后移除--force
我在bitbucket管道上尝试过它并且工作正常