在很多影视作品里,就算主人公乘上了时光鸡,还是无法修改历史(或者说修改后造成十分严重的后果);而现在,在 Git 的强力驱动下,修改历史变得简单又相对安全。
本文叨叨修改 commit 历史的问题

应用场景

① 刚刚的提交不小心打错了 能更改吗?

比如Sun of a Beach with canvas 写成了 son of a b**ch with canvas

② 刚刚的提交漏掉了文件 能追加吗?

③ 以前写的 commit 很菜 能更改吗?

可能你的 commit是这样的 :

fix bug

fix another bug

fix final bug

oh anotherOne wtf?

魔法一:git coomit --amend -m ''

对于场景 ①,可以这样急救

git coomit --amend -m 'Sun of a Beach with canvas'

实际效果图

如果没有加 -m参数的话,会弹出 vim 让你编辑最近一次的commit

注意

  • --amend 只能修改最近的一次 commit
  • 最近的那一次 commit物件的 SHA1 被新的 SHA1 值替代,因为对于 commit 物件 来说它的内容发生了改变
  • commit 的时间并未被修改,因为时间作者信息是由 tree物件 储存,文件、文件目录结构啥都没变,tree物件不可能变化

同时,对于场景二 ,--amend 也能处理

#先把漏掉的文件加入缓存区
git add careless.less
#再使用--amend参数进行commit,下面--no-edit 表示保留原有message信息
git commit --amend --no-edit

注意:

  • commit 的时间并会发生变化

魔法二:git reset

对于场景 ②,另一种处理方式是git reset指令

git reset指令是跳回之前的某次 commit (而非字面重置的意思)

附加知识:定位到那一次commit的多种方式

  • 通过HEAD或当前分支(比如 master) => 像贴纸一样指向当前的 commit,

再加上 ^ 表示当前commit的前一次 ,或者~n 表示当前commit的前n次

  • 通过 SHA1 值的简写 => 比如 e2d2873

所以可以退回到之前的 commit => 重新添加文件 => 再次 commit

退回上一次的commit的三种写法:

git reset e2d273 #opt1:利用上一次的SHA1简写值
git reset HEAD^ #opt2: 利用HEAD
git reset master^ #opt3: 利用当前所在分支

实际效果图

魔法三:git rebase

对于情景 ③,当你写了‘折磨多’无用commit,别急着删掉 .git 目录 ;先试试 git rebase(只涉及到 rebase 附加的一个小小的应用,在接下来的应用中可以想象成HEAD一直顺着commit往下走,遇到非pick 的commit就会停下来,等待你操作这个commit)

1.git log 看看现有的commit

git log --oneline

2.确定操作的范围

git rebase -i 4d11e38
#此处-i表示interactive 交互式的rebase过程

3.把需要修改的commit前面 pick 改为 r

保存并退出 vim 编辑器

4.正式修改 commit

go to jail 改成 go to party 是不是潇洒的多呢

退出保存后,再次查看commit

我们再重新看看这张图,

细心的你有没有发现 除了可以 r(也就是reword commit) 还有很多强大的操作,这里举两个栗子:

  • e :edit commit ,可以实现对commit的高级修改:比如干掉这个commit,重新提交
  • s :squash commit,可以实现合并多个commit:会向更早的邻居commit物件去合并,同时会给你修改message的机会
  • d:drop commit ,把它丢掉=> 把这个commit删除
  • 另外一个骚操作:只要在rebase弹出的编辑器里面手动修改commit行的位置,就可以实现修改commit的顺序的效果。同理啦,删掉某一行也就实现了删掉了这个commit的效果

你可能会想:reset回去改 commit 信息

既然 git reset 可以跳回之前的 commit ,两次相反的 reset 不就回到了当前提交吗?
对于情景 ③,利用这一点,我们可以依次跳到各个 commit ,搬砖 ... 最后利用 git reflog 查找commit 信息跳回来

但是,新的 commit 物件并没有被之后的 commit 所指到 ,当你再次reset回去的时候,一切还是原来的样子。不信你看

除非你愿意去手动修改 commit 的指向,可能会生效吧

但是

如果是真实开发的话,已经 push 出去的 commit 不要修改了(会引发许多麻烦),就让往事都随风吧

如有错误,恳请指正

git commit —amend_Git之修改commit记录相关推荐

  1. git修改commit的用户名与邮箱

    对于 git 的用户名与邮箱,我们大多数人都有两套,一套公司账户平时工作用和一套个人账户用于业余项目.而我又常常在 commit 以后才发现用户名与邮箱设置错了.本文总结了如何修改 Commit 的用 ...

  2. Git pull时报错:commit your changes or stash them before you can merge. 的解决办法

    Git pull时报错:commit your changes or stash them before you can merge. 的解决办法 今天在pull的时候,报错,信息如下: error: ...

  3. Git 修改commit 相关操作

    修改最新提交的commit的message git commit --amend 执行 git commit --amend 然后修改注释即可 (需要通过vi 或vim编辑并保存) 修改旧的commi ...

  4. git修改commit信息

    git修改commit信息 主要有以下3种场景 1.刚刚commit,还没有push,使用git commit --amend. 2.刚刚push,要修改最后一次push的commit信息,使用git ...

  5. GIT 修改commit message

    背景:很多时候,我们项目对提交的message有格式要求,如果我们git commit提交之后,格式不正确,那就无法push,这时候需要修改提交的message 1.修改本次提交message git ...

  6. git基本使用(配置文件、日志/参考日志、版本回退、撤销更改、修改commit提交)

    文章目录 0 背景 1 历史 2 git配置文件的使用 2.1 设置用户名和邮件地址 2.2 查看配置 2.3 修改配置来达到忽略文件(即不上传文件)以及强制上传被忽略的文件 2.4 配置别名 3 使 ...

  7. shell获取git最近一次提交信息_Git修改commit提交信息

    当进行一次commit提交的时候,可以附带简短的信息说明,代码如下:[Shell] 纯文本查看 复制代码$ commit -m "蚂蚁部落提交" 在-m命令后面跟着的"蚂 ...

  8. Git 修改 commit author

    git rebase -i HEAD~9 ~9 表示修改多少筆提交,從當前開始往前數. 執行完後 把pick改成edit,保存退出. 然後執行 git commit --amend --reset-a ...

  9. 【Git】Git修改 commit 的信息

    Git 修改 commit 的信息 ①:git log 查看提交日志,找到要修改的commit ②:git rebase -i HEAD~n 1.切换到需要修改的 commit 中,n为commit的 ...

最新文章

  1. 解决:No configuration found. Configuring ehcache from ehcache-failsafe.xml 问题
  2. 前端获取浏览器标识_浏览器缓存机制
  3. PB中获得dropdownlistbox下拉选框中选择项的序列号
  4. springboot整合H2内存数据库,实现单元测试与数据库无关性
  5. Atitit 提升开发效率使用内嵌Tomcat 内嵌webserver 于单元测试
  6. HTML+CSS实现个人简历
  7. Web 方向学习路线
  8. linux配置网桥,Linux下通过brctl配置网桥
  9. 流程图常用符号及其代表含义
  10. 多个模型融合训练神经网络-devise模型的实现
  11. P3403 跳楼机 同余最短路
  12. 【文件处理】python 在线预览文件_OFFICE 文档转换为html在线预览
  13. table组件抽离封装
  14. [NGUI]NGUI中的九宫格切图模式
  15. Sass、Scss、Less和Stylus区别总结
  16. Android Studio 生成APK签名证书
  17. 刚刚装好的ppt插件islide消失了,如何解决呢?
  18. ospf状态机-通俗易懂的小故事
  19. 万得数据写入Excel
  20. 黑马在线教育数仓实战7

热门文章

  1. 传感器实训心得体会_传感器实训心得
  2. python包pip安装_python包管理之Pip安装及使用
  3. mysql栏目表设计_MySQL表设计
  4. xfs_repair 实际工作中的问题
  5. mysql 自动化运维工具_部署MySQL自动化运维工具inception+archer
  6. php 制表符分隔csv,CSV(逗号分隔)、文本文件(制表符分隔) 等文件的读取
  7. 大连理工版小学计算机教案,小学信息技术教案六年上LOGO 大连理工大学版.docx...
  8. 皮一皮:只恨不为女儿身...
  9. 皮一皮:南北差异之相亲相爱的一家人系列...
  10. Docker 入门终极指南:边学边用