这是我们Git中的第三种后悔药。

1、git commit --amend 命令说明

git commit --amend 命令:也叫追加提交,它可以在不增加一个新的commit的情况下,将新修改的代码追加到前一次的commit中。

使用该命令的好处,是避免许多无用的提交。

说明:

  • 如果自上次提交以来,你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变(不产生新的commit),而修改的只是提交信息。
  • 或者你提交后发现忘记了暂存某些需要的修改,可以将该文件添加到暂存区,然后在使用git commit --amend 命令进行追加提交。

常用参数

  • --no-edit:使用选定的提交消息而无需启动编辑器。(追加提交,且不修改message信息。)
  • --reset-author:加载提交用户的信息。

    比如你从新配置本地用户的信息,然后使用该参数可以重新加载新用户的信息,并且更新在追加提交中。
  • --author=:可修改Git 的 authoremail 信息。

    示例:git commit --amend --author='xxx <xxxx@xxx.xxx>'

2、使用场景

(1)场景一

场景描述:

开发代码已提交到本地版本库中,提交后发现这次提交的代码有问题,或者漏提交了一些文件,此时希望达到以下目的:

  1. 修改有问题的代码。
  2. 补足漏提交的文件。(一般是新增的文件没有git add
  3. 把以上两点相关的代码,和前一次提交的代码合并成一个提交。
  4. 给合并后的提交添加新的注释。

即:有时你提交过代码之后,发现一个地方改错了,你下次提交时不想保留上一次的记录,或者你上一次的commit message的描述有误,这时候你可以使用 git commit --amend 命令来解决。

解决步骤:

  1. 修改问题代码。
  2. 执行git add . 命令,把漏提交的文件加入暂存区。
  3. 执行git commit --amend -m "这里填写提交的注释"命令进行提交。

示例:修改最新一次提交的message

有的时候,我们刚刚进行一次提交,突然发现该提交的描述(message)不是很准确。所以需要对该提交的message进行修改(最近一次的commit)。

1)首先查看当前分支的历史提交情况。

# 1.查看版本库历史提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git log --oneline
bd4fd48 (HEAD -> master) 第3次提交,新增内容:git commit --amend v3
8b3a071 第2次提交,新增内容:git commit --amend v2
d3e2d8c 第1次提交,新增readme.txt文件 # 2.查看可回退历史提交信息。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git reflog
bd4fd48 (HEAD -> master) HEAD@{0}: commit: 第3次提交,新增内容:git commit --amend v3
8b3a071 HEAD@{1}: commit: 第2次提交,新增内容:git commit --amend v2
d3e2d8c HEAD@{2}: commit (initial): 第1次提交,新增readme.txt文件

2)修改最新一次历史提交记录。

最新一次历史提交记录,也就是第3次提交。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git commit --amend -m "我是第3次提交,重新修改的message"
[master 69a9841] 我是第3次提交,重新修改的message
Date: Tue Apr 20 17:41:44 2021 +0800
1 file changed, 1 insertion(+)

提示:如果此时有需要新增或改动的文件,可以先把文件添加都暂存区,然后随着git commit --amend命令,一起追加提交。

3)再次查看当前分支的历史提交情况。

# 1.查看版本库历史提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git log --oneline
69a9841 (HEAD -> master) 我是第3次提交,重新修改的message
8b3a071 第2次提交,新增内容:git commit --amend v2
d3e2d8c 第1次提交,新增readme.txt文件 # 2.查看可回退历史提交信息。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git reflog
69a9841 (HEAD -> master) HEAD@{0}: commit (amend): 我是第3次提交,重新修改的message
bd4fd48 HEAD@{1}: commit: 第3次提交,新增内容:git commit --amend v3
8b3a071 HEAD@{2}: commit: 第2次提交,新增内容:git commit --amend v2
d3e2d8c HEAD@{3}: commit (initial): 第1次提交,新增readme.txt文件

我们可以看到:

  1. 第三次提交的massage改变了。
  2. 看到第三次提交的commit-idbd4fd48变成了69a9841
  3. 我们可以看到使用git commit --amend命令,表面上没有生成新的提交,只是进行了内容的追加。但实际上通过git reflog命令查看历史提交记录,我们还是看到了,其实是新生成了一个commit

说明:

  1. 关于git commit --amend命令原理,往下看。
  2. 关于如何修改更早提价的message,看后面的git rebase文章。

(2)场景二

场景描述:

假设新接到需求,需要基于master分支拉取一个feature分支,且这个feature分支只有你自己使用(这一点极其重要),由于开发周期较长,你不想每一次提交都产生一个新的commit,而是想每一次commit都修改前一次提交(一直追加提交)。

这样做的好处是,等到你的feature分支提测时,就只有一个干净的commit,没有乱七八糟的提交历史,你只要把这一个commit合并到master里就好了 。

操作步骤:

feature分支上:

  • 第1次提交代码时,使用命令git commit -a -m "第1次提交的注释"进行提交。
  • 第2次以及只后的提交,使用命令git commit --amend -m "这里填写提交的注释"进行提交。

    这样整个分支可以只有一个commit

示例:

不推荐这样操作,多次提交可以使你选择撤销的余地比较多,简化提交次数是比较好的想法,但更推荐使用git rebase命令进行操作。

这里就不演示了。

3、git commit --amend 命令原理

git commit --amend这个命令给人的感觉,是用新提交的数据,追加到了前一个commit上。

其实git commit --amend命令底层原理如下:

前提:你把遗漏提交的文件,或者修改的文件先提交到暂存区。

  1. git reset --soft HEAD^:回退一个版本,且工作区和暂存区中的内容不会退。
  2. git commit -c ORIG_HEAD:提交操作。在根据此时的暂存区生成一个新的提交对象,代替原来提交的位置。

    说明:

    -C <commit>,全称--reuse-message=<commit>:获取现有的提交对象,并在创建提交时重用现有提交对象的日志消息和作者信息(包括时间戳)。

    -c <commit>,全称--reedit-message=<commit>:与-C类似,但是-c会调用编辑器,以便用户可以进一步编辑提交消息。

看如下图示:

假设master分支上的提交历史如下图:

运行git commit --amend命令,过程如下:

参考:

『现学现忘』Git后悔药 — 34、git commit --amend 命令的更多相关文章

  1. 『现学现忘』Git后悔药 — 32、revert撤销(一)

    目录 1.Git的三种后悔药 2.revert命令原理 3.revert命令的使用 (1)移除某次提交的修改 (2)revert命令说明 1.Git的三种后悔药 在Git中后悔药有三种:amend.r ...

  2. 『现学现忘』Git后悔药 — 27、版本回退介绍

    目录 1.什么版本回退 2.需要了解两个知识点 (1)HEAD是什么 (2)HEAD指针用法 3.git reflog命令介绍 1.什么版本回退 版本回退也可以叫回滚. 若修改过的文件,不仅添加到了暂 ...

  3. 『现学现忘』Git后悔药 — 33、revert撤销(二)

    目录 4.一次移除某几次提交 (1)git revert移除某几次提交的修改 (2)git revert 移除某几次连续的提交的修改 5.revert命令常用参数 6.git revert和git r ...

  4. 『现学现忘』Git基础 — 21、git diff命令

    目录 1.git diff 命令说明 2.比较工作区与暂存区中文件的差别 3.比较暂存区与本地库中文件的差别 4.总结git diff命令常见用法 5.总结 1.git diff 命令说明 在comm ...

  5. 『现学现忘』Git基础 — 22、Git中文件重命名

    目录 1.用学过的命令进行文件重命名 2.使用git mv命令进行文件重命名 我们这篇文章来说说在Git中如何进行文件重命名. 提示一下,下面所说明的是对已经被Git管理的文件进行重命名,未被Git追 ...

  6. 『现学现忘』Git基础 — 3、Git介绍

    目录 1.Git的历史 2.Git的特点 3.Git在项目协作开发中所解决的问题 1.Git的历史 Git是目前世界上最先进的分布式版本控制系统,开源.免费. Git 是 Linus (林纳斯)为了帮 ...

  7. 『现学现忘』Git基础 — 4、Git下载与安装

    目录 1.Git下载 2.Git在Windows下的详细安装 3.验证Git是否安装成功 1.Git下载 进入官方地址下载Git客户端:https://git-scm.com/download/win ...

  8. 『现学现忘』Git基础 — 13、Git的基础操作

    目录 1.Git最基础的使用方式 (1)初始化本地版本库 (2)查看文件的状态 (3)把文件添加到暂存区 (4)把暂存区的内容提交到本地版本库 2.总结本文用到的Git命令 1.Git最基础的使用方式 ...

  9. 『现学现忘』Git基础 — 14、Git基础操作的总结与补充

    目录 1.Git本地版本库结构 2.Git常用操作方法 3.补充:添加多个文件到暂存区 4.补充:提交操作未写备注 5.补充:从工作区直接提交到版本库 1.Git本地版本库结构 如下图所示: 工作区( ...

随机推荐

  1. CentOS Docker安装 && docker 基础指令

    1 # 直接从官网下载docker的安装命令包(docker已经很贴心将安装shell脚本帮我们准备好了) 2 curl -fsSL get.docker.com -o get-docker.sh 3 ...

  2. 在oracle中创建管理员密码

    1.因为在安装Oracle11g时没有设置sys和system用户的密码,导致登陆不上SQLplus,后面用sqlplus / as sysdba ,密码为:root登陆上去创建了密码. 2.如下图

  3. Pulsar Summit Asia 2020 中文专场议题出炉!

    关于 Apache Pulsar Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息.存储.轻量化函数式计算为一体,采用计算与存储分离架构设计,支 ...

  4. LuoguP1858 多人背包(DP)

    第\(K\)优解这类问题可在\(DP\)过程中通过添维解决.归并出当前前\(K\)大的解. #include <iostream> #include <cstdio> #inc ...

  5. BZOJ1787/Luogu4281: [Ahoi2008]Meet 紧急集合

    画画图可知,三点\(lca\)必有两相同,\(a,b,c\)距离为\(dis_a + dis_b + dis_c - dis_{lca(a,b)} - dis_{lca(b,c)} - dis_{lc ...

  6. 【java】学习路径37-练习:任意文件的复制

    使用字节完成复制 import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException ...

  7. Markdown Support

    Markdown 支持一览 Markdown 支持一览 身正不怕影子斜 我实在没有说过这样一句话 -- 鲁迅 古代文学史发展脉络 唐诗 宋词 元曲 冯·诺依曼结构 运算器 控制器 存储器 输入输出设备 ...

  8. C++ | unordered_map 自定义键类型

    C++ unordered_map 使用自定义类作为键类型 C++ unordered_map using a custom class type as the key

  9. docker学习笔记一-docker安装与卸载

    环境查看 # 1 查询当前centOS的版本,官方要求版本为7以上 uname -r 查询系统内核 cat /etc/os-release 系统版本 安装 # 1.卸载旧版本 yum remove d ...

  10. 海康摄像机使用GB28181接入SRS服务器的搭建步骤---源码安装的方式

    下载代码 地址:https://github.com/ossrs/srs-gb28181 https://github.com/ossrs/srs-gb28181.git 注意:使用的是含有gb281 ...