协慌网

登录 贡献 社区

如何修改现有的,未删除的提交?

我在提交消息中写了错误的东西。或者,我忘了包含一些文件。

如何更改提交消息 / 文件?提交尚未被推送。

答案

修改最新的提交消息

git commit --amend

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

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

... 但是,这可能使多行提交消息或小修正更加麻烦。

确保你没有这样做,否则它们可能会犯下过之前任何阶段性的工作副本的变化。 ( 未分级变化将不会提交。)

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

如果您已经将提交推送到远程分支,那么您需要强制推送提交

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

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

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


使用交互式 rebase

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

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

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

一旦你压缩你的提交 - 选择e/r来编辑消息

在此处输入图像描述

关于 Interactive rebase 的重要说明

当您使用git rebase -i HEAD~X可以有超过 X提交。 Git 将 “收集” 最后X提交中的所有提交,如果在该范围之间的某处有合并,您将看到所有提交,因此结果将是 X +。

好提示:

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


? 热尖

git提交一次修改

您还可以编写一个小的 bash 函数来修改最后一个 git commit 消息并将其推送到远程。一直帮助我。这是函数,将它放在.bashrc或类似的.zshrc文件中并重新加载终端。

# USAGE: gamend "Your New Commit Msg"
function gamend() {
    git commit --amend -m "$@"
    git push --force
}

文档

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

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

  1. git rebase --interactive $parent_of_flawed_commit

    如果要修复多个有缺陷的提交,请传递最旧的提交的父级。

  2. 将出现一个编辑器,其中列出了自您提交的所有提交以来的所有提交。

    1. 在您要修复的任何提交之前,将pick更改为reword (或在旧版本的 Git 上进行edit )。
    2. 保存后,Git 将重播列出的提交。

  3. 对于你想要改写的每个提交,Git 会让你回到编辑器中。对于您要编辑的每个提交,Git 会将您放入 shell 中。如果你在 shell 中:

    1. 以您喜欢的任何方式更改提交。
    2. git commit --amend
    3. git rebase --continue

大多数此序列将通过各种命令的输出向您解释。这很容易,你不需要记住它 - 只要记住git rebase --interactive让你无论多久以前都能正确提交。


请注意,您不希望更改已推送的提交。或者也许你这样做,但在这种情况下,你必须非常谨慎地与每个可能已经完成提交并完成工作的人沟通。 在有人推送 rebase 或重置到已发布的分支后,如何恢复 / 重新同步?