我已经进行了 git commit 和后续推送。我想更改提交消息。如果我理解正确,这是不可取的,因为在我进行此类更改之前,有人可能已经从远程存储库中提取了数据。如果我知道没有人拉过怎么办?
有没有办法做到这一点?
改变历史
如果它是最近的提交,你可以简单地这样做:
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
更安全的原因。
说啊:
git commit --amend -m "New commit message"
接着
git push --force
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 ->主人(预接收挂钩被拒绝)`
要编辑不是最近的提交:
第 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
来更新遥控器。
git rebase -i HEAD~3
git rebase --continue
。如果您想更改用于交互式会话的文本编辑器(例如,从默认的 vi
更改为 nano
),请运行 GIT_EDITOR=nano git rebase -i HEAD~n
。
在控制台中使用这两个步骤:
git commit --amend -m "new commit message"
接着
git push -f
完毕 :)
需要注意的是,如果您将 push --force
与多个 ref 一起使用,它们都会因此而被修改。请务必注意您的 git repo 配置为推送到的位置。幸运的是,有一种方法可以稍微保护该过程,方法是指定一个要更新的分支。从 git 手册页中阅读:
请注意, --force 适用于所有被推送的引用,因此将它与 push.default 设置为匹配或配置为 remote.*.push 的多个推送目标一起使用可能会覆盖当前分支以外的引用(包括本地引用严格落后于他们的远程对手)。要强制只推送到一个分支,请在 refspec 前使用 + 来推送(例如 git push origin +master 强制推送到主分支)。
命令 1。
git commit --amend -m "New and correct message"
然后,
命令 2。
git push origin --force
git commit --amend
然后编辑和更改当前窗口中的消息。之后做
git push --force-with-lease
确保您在正确的分支上进行更改
git checkout
#确保您在正确的分支上进行更改,以确保:
git checkout branchname
然后
git commit --amend -m "new message"
然后推
git push --force
另一种选择是创建一个附加的“勘误提交”(和推送),它引用包含错误的提交对象——新的勘误提交也提供了更正。勘误提交是没有实质性代码更改但有重要提交消息的提交 - 例如,在自述文件中添加一个空格字符并使用重要提交消息提交更改,或使用 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 notes
这与“勘误提交”的目的相同。只需在之前的提交中添加注释即可注释或更正提交消息中的任何错误:https://git-scm.com/docs/git-notes
只需使用这 2 个命令来更改您上次推送的提交消息
-$ git commit --amend -m "新的提交信息。" -$ git push --force-with-lease
命令 1 您需要使用以下命令更改您的提交消息 git commit --amend -m "New and correct message"
命令 2 添加新消息后,然后执行以下命令 git push -f origin
我对 Git 有点陌生,但我只是想补充一下我的经验。
git commit --amend -m "新的和正确的消息"
这很好用,但接下来是我的问题。在更改提交消息之前,我已经推送了提交。最后,当我尝试推送到远程时,git 抛出了异常。所以我应该在更新远程分支之前再次下拉。
git pull origin 分支名称
git push origin 分支名称
希望我的小经验能帮到你。谢谢。
git commit --amend
使用类型键盘编辑提交消息
git push --force
这对我来说很好,
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
你完成了
如果您使用的是 bitbucket 管道,则针对相同问题的其他信息
编辑您的消息
git commit --amend
推送到服务器
git push --force <repository> <branch>
然后将 --force 添加到管道上的推送命令
git ftp push --force
这将删除您之前的提交并推送您当前的提交。
第一次推送后删除 --force
我在 bitbucket 管道上试过了,它工作正常
git push --force
,无需 <repository>和<分支>如果您设置了上游,选项也可以使用。<repository>
的例子吗?是origin
吗?org/repo
?还是只是repo
?