命令说明

amend命令是修改最后一次提交。也就是在不增加新的commit情况下,将修改的代码添加到上一次commit中。
git commit —amend

  • 快照保持不变,只是修改了提交修改.
  • 提交后发现一些内容还需要修改,可以将文件添加到暂存区,然后使用git commit —amend命令进行追加提交。

    常用参数

  • —no-edit:使用选定的提交信息,不进行编辑。(追加提交,且不修改message信息)

  • —reset-author:加载提交用户信息
  • —author=:可修改git的author和email信息:git commit —amend —author=’shenshuai89@qq.com’

    使用场景

    开发过程中,代码已经提交到了本地仓库【还没push到远程】。发现提交的代码有问题,需要修改后再次提交,此时希望达到的目的:

  • 修改有问题的代码

  • 补足漏提交的文件
  • 把修改内容和前一次提交的代码合并成一个提交
  • 结合后的提交添加新的注释

这时就可以使用git commit —amend命令
操作步骤:

  • 修改问题代码
  • 执行git add . 命令将漏提交的文件加入暂存区
  • 执行git commit —amend -m “new commit message”命令进行提交

本地创建测试文件,新建readme.txt文件

  1. # 执行如下操作提交
  2. shuais-MacBook-Pro:amend shuai$ git log --oneline
  3. 65a7463 (HEAD -> master) 第三次提交内容
  4. a7a2ad0 第二次提交内容
  5. 6257f8a 第一次提交的内容
  6. # 使用reflog查看 提交历史记录
  7. shuais-MacBook-Pro:amend shuai$ git reflog
  8. 65a7463 (HEAD -> master) HEAD@{0}: commit: 第三次提交内容
  9. a7a2ad0 HEAD@{1}: commit: 第二次提交内容
  10. 6257f8a HEAD@{2}: commit (initial): 第一次提交的内容
  11. # 编辑修改内容后,将内容添加到暂存区
  12. shuais-MacBook-Pro:amend shuai$ git add .
  13. # 使用amend作为参数进行提交
  14. shuais-MacBook-Pro:amend shuai$ git commit --amend -m "第三次提交内容,添加three"
  15. [master 7b5ebb5] 第三次提交内容,添加three
  16. Date: Thu Jun 23 23:57:11 2022 +0800
  17. 1 file changed, 2 insertions(+), 1 deletion(-)
  18. # 查看提交后的历史记录
  19. shuais-MacBook-Pro:amend shuai$ git log --oneline
  20. 7b5ebb5 (HEAD -> master) 第三次提交内容,添加three
  21. a7a2ad0 第二次提交内容
  22. 6257f8a 第一次提交的内容
  23. # 使用reflog查看 提交历史记录,65a7463这次提交的记录,在log中是看不到的
  24. shuais-MacBook-Pro:amend shuai$ git reflog
  25. 7b5ebb5 (HEAD -> master) HEAD@{0}: commit (amend): 第三次提交内容,添加three
  26. 65a7463 HEAD@{1}: commit: 第三次提交内容
  27. a7a2ad0 HEAD@{2}: commit: 第二次提交内容
  28. 6257f8a HEAD@{3}: commit (initial): 第一次提交的内容

将最后一次的提交记录,有65a7463变为了7b5ebb5。通过log查看时,只有3次提交记录;使用reflog可以查看到被隐藏掉的 65a7463 记录。

amend命令原理

git commit --amend用新的提交数据,追加到前一个commit上。
底层原理如下:

  • git reset —soft HEAD^ :回退一个版本,并且工作区和暂存区的内容不回退
  • git commit -c ORIG_HEAD: 提交操作,根据此时暂存区内容生成一个新的提交对象,替换掉原来的提交位置
    • -C : 获取现有的提交对象,并在创建提交时重用现有提交对象的日志消息和作者信息等
    • -c : 与-C类型,但是-c会调用编辑器,重新编辑提交信息

amend命令,修改提交内容 - 图1
相当于:先执行了git reset —soft HEAD^命令退回到commit2,然后依据此时的暂存区内容生成新的commit-4提交,替换原来的commit-3的位置。

原来的commit3,使用reflog还可以被查看到