Replace the tip of the current branch by creating a new commit. The recorded tree is prepared as usual (including the effect of the -i and -o options and explicit pathspec), and the message from the original commit is used as the starting point, instead of an empty message, when no other message is specified from the command line via options such as -m, -F, -c, etc. The new commit has the same parents and author as the current one (the --reset-author option can countermand this).
It is a rough equivalent for:
powershell
$ git reset --soft HEAD^$ ... do something else to come up with the right tree ...$ git commit -c ORIG_HEAD
1 2 3
but can be used to amend a merge commit.
You should understand the implications of rewriting history if you amend a commit that has already been published. You should understand the implications of rewriting history if you amend a commit that has already been published. (See the "RECOVERING FROM UPSTREAM REBASE" section in git-rebase(1).)
Git 中如何修改已经推送上去的提交的备注
🏷️ Git
今天手快把代码推送上去后才发现备注写错了。所幸
git commit
命令提供了一个--amend
参数,可以用于修改最后一次提交的备注信息。命令行操作步骤
确保你已经在本地仓库中,并且处于要修改备注的分支上。
运行
git commit --amend
命令来进入编辑模式,修改备注信息。这里会打开默认的文本编辑器,我这边是 VS Code。
修改备注信息后,保存并关闭编辑器。
关闭编辑器后会自动创建一个新的提交,并且这个提交拥有相同的父提交和作者。
强制推送修改后的备注信息到远程仓库。请注意,这将覆盖远程仓库中的相应提交,因此请确保与团队成员进行沟通并谨慎操作。
替换
<分支名>
为你要推送修改的分支名称。这样,你就可以修改已经推送上去的提交的备注信息了。请谨慎使用
--force
参数,以免对团队协作造成不必要的影响。这样操作后,前一次的提交相当于是消失了(虽然在 Git 仓库中仍然存在,但是在分支树上已经看不到了),取而代之的是编辑后的新提交(有新的提交 ID)。
在 SourceTree 中的操作步骤
有些同学喜欢用命令行,个人更偏向于使用 IDE 来操作。而且如果有多个提交需要修改,用命令行操作起来比较繁琐。
个人常用的是 SourceTree,这里记录下在其上的操作步骤。
选中所需修改的提交的前一次提交,右键选择【交互式变基 xxxxxxxx 的子提交】;
这里不仅支持修改最后一次提交,再之前的也同样可以修改。
本质上这里执行的是如下命令:
在弹出的窗口中选择需要修改备注信息的提交,然后点击左下角的【编辑信息】按钮,在弹出的窗口中修改消息内容并点击【确定】保存。
这里相当于执行了一次上面的
git commit --amend
命令。如果有多个提交的消息需要修改,可以多次执行这个操作。
另外这里还有一个【用此前的 squash】按钮,这个是用来合并多个提交的,可以将此前的多个提交合并成一个提交,在清理提交记录时非常有用。
说到这个顺便提一下 马丁·福勒 的《重构:改善既有代码的设计》这本书,书中提到了一种比较极端的编程方式:每做一次代码改动(比如改动一个变量名)就做一次提交,同时执行一次自动化测试。我没有这么极端的实践过,但是开发一个功能中多次临时的提交还是比较常见的,这时就可以用这个功能来优化提交记录。
点击【确定】后可以在分支树上看到基于选中的提交创建了一个新的本地分支(旧的分支是 origin 的分支)。
点击推送并勾选强制推送。
最终的效果和命令行的方式类似。同样需要特别注意的是,强制推送有可能覆盖同事的提交,一定要提前沟通好,避免把别人的提交弄没了。
--amend
参数 Replace the tip of the current branch by creating a new commit. The recorded tree is prepared as usual (including the effect of the
-i
and-o
options and explicit pathspec), and the message from the original commit is used as the starting point, instead of an empty message, when no other message is specified from the command line via options such as-m
,-F
,-c
, etc. The new commit has the same parents and author as the current one (the--reset-author
option can countermand this).It is a rough equivalent for:
2
3
but can be used to amend a merge commit.
You should understand the implications of rewriting history if you amend a commit that has already been published. You should understand the implications of rewriting history if you amend a commit that has already been published. (See the "RECOVERING FROM UPSTREAM REBASE" section in git-rebase(1).)
下面是机翻的内容:
通过创建一个新的提交来替换当前分支的指针。记录的树按照通常的方式准备(包括
-i
和-o
选项以及显式的路径规范),而原始提交的消息被用作起点,而不是空消息,如果没有通过命令行选项如-m
、-F
、-c
等指定其他消息的话。新的提交具有与当前提交相同的父级和作者(--reset-author
选项可以撤销此操作)。这相当于以下命令的粗略等价物:
2
3
但是它可以用来修改合并提交。
如果你修改已经发布的提交,你应该理解重写历史的影响。(参见 git-rebase(1) 中的 "RECOVERING FROM UPSTREAM REBASE" 部分。)