我已经进行了 git commit 和后续推送。我想更改提交消息。如果我理解正确,这是不可取的,因为在我进行此类更改之前,有人可能已经从远程存储库中提取了。如果我知道没有人拉过怎么办?
有没有办法做到这一点?
如果它是最近的提交,你可以简单地这样做:
git commit --amend
这会打开带有最后一条提交消息的编辑器,并允许您编辑该消息。(-m如果您想清除旧消息并使用新消息,则可以使用。)
-m
然后当你推动时,这样做:
git push --force-with-lease <repository> <branch>
或者你可以使用“+”:
git push <repository> +<branch>
或者您可以使用--force:
--force
git push --force <repository> <branch>
使用这些命令时要小心。
如果其他人将更改推送到同一分支,您可能希望避免破坏这些更改。该--force-with-lease选项是最安全的,因为如果有任何上游更改,它将中止(
--force-with-lease
如果您没有明确指定分支,Git 将使用默认推送设置。如果您的默认推送设置是“匹配”,那么您可能会同时销毁多个分支上的更改。
任何已经拉取的人现在都会收到一条错误消息,他们需要通过执行以下操作进行更新(假设他们自己没有进行任何更改):
git fetch origin git reset --hard origin/master # Loses local commits
使用时要小心reset --hard。如果您对分支进行了更改,这些更改将被销毁。
reset --hard
被破坏的数据实际上只是旧的提交消息,但--force不知道这一点,并且也会很高兴地删除其他数据。因此,可以将其想象--force为“我想销毁数据,并且我确定要销毁哪些数据”。但是当被破坏的数据被提交时,你通常可以从 reflog 中恢复旧的提交——数据实际上是 孤立 的而不是被破坏的(尽管孤立的提交会定期删除)。
如果您不认为自己在破坏数据,那么请远离--force……可能会发生坏事。
这就是为什么--force-with-lease更安全一些。