修改commit历史的前提

修改历史的提交是可能有风险的,是否有风险取决于commit是否已经推送远程分支,未推送,无风险,如果已推送,就千万不要修改commit了。

修改commit历史,不是在原有commit结点上修改,而是用一个新的结点替换原来结点,所以,修改后commit id是不样的。

所以修改commit历史的前提是,提交未推送远程仓库!提交未推送远程仓库!提交未推送远程仓库!,重要的事情说三遍。

修改最近的一次提交

修改最近的一次提交非常简单,通过git commit --amend,该命令可以让我们修改提交的commit信息,也修改提交的内容。

修改提交的commit信息,可以直接运行该命令,然后在弹出的编辑框中修改提交信息保存即可。

修改提交的内容,可以先修改好内容,然后git add暂存区,再使用git commit --amend,填写commit信息保存即可。

修改更早的提交或修改多个提交

修改更早的提交或修改多个提交就需要用到git rebase -i parentCommitID,其机理是通过重新衍合parentCommitID之后的全部提交,所以该操作会改变parentCommitID结点之后所有提交的commit id。

通过rebase -i我们可以交互式的运行rebase,以达到修改更早的提交或修改多个提交。

运行这个命令会弹出一个文本编辑器,其中包含了提交列表和一些简单说明,形如:

pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file # Rebase 710f0f8..a5f4a0d onto 710f0f8
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

你会发现提交列表的顺序与通过git log查看的命令是相反的,而且在每条提交前面都有一个pick,在说明中有提到,是选择该次提交,即不做修改,如果需要修改某个提交,就将对应记录(可是多个记录)的pick改为edit。保存,关闭文本编辑器后,回到命令行,会停在第一个标记为edit的提交前,eg:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with git commit --amend Once you’re satisfied with your changes, run git rebase --continue

根据提示,修改完成之后执行git commit --amend修改提交,然后执行git rebase --continue继续rebase。

所以rebase -i的流程如下:

  • git rebase -i parentCommitID
  • 在弹出的文本编辑器中,将要修改的commit的前方的pick改为edit,保存,关闭文本编辑器
  • 在命令行处于等待状态后,修改内容
  • 执行git commit --amend修改提交
  • 执行git rebase --continue继续rebase
  • 完成

git rebase -i命令修改commit历史的更多相关文章

  1. Git 实用操作:重写 Commit 历史

    当我们修改完代码,提交了一个 commit,然后发现改错了,怎么修正?下面分两种情况来讨论:修正最近一次提交,和修正历史多个提交. 修正最近一次提交 如果发现刚刚提交的内容有错误,当场再修改一下再提交 ...

  2. 修改 commit 历史

    修改 commit 历史 参考:修改 git 历史提交 commit 信息(重写历史)git 修改已提交的内容 git init echo t.md>.gitignore git add .gi ...

  3. git rebase合并多个commit总结

    git rebase 合并多个commit 方法 在开发过程中,有时一个任务会分几次commit提交,这样可能对于有些分支要cherry pick时会比较麻烦,这是我们可以通过git rebase 将 ...

  4. 使用git命令修改commit提交信息

    很多时候我们在提交代码时可能会把commit提交信息写错了,这个时候我们就可以用到下面的git命令来修改commit提交信息 git commit --amend 输入"i"之后进 ...

  5. 巧用 git rebase 合并多个 commit。

    一.为什么需要合并多个 commit 呢?   有时候,我们开发一个功能. 修修补补 commit 了很多次,过多的 commit 会显得很复杂. 不够直观,不能比较清晰查看那些 commit 是对应 ...

  6. 巧用 git rebase 将某一部分 commit 复制到另一个分支

    一.为什么需要将一个 commit 复制到其他分支上去呢? 在我们的实际开发的过程中,我们的项目中会存在多个分支. 在某些情况下,可能需要将某一个分支上的 commit 复制到另一个分支上去.   二 ...

  7. git 命令修改commit时的用户名和邮箱地址

    1.介绍 在git的用户名和邮箱是有一个仓库和全局之分的,在利用vs插件是也有显示:

  8. 通过git rebase修改commit message

    今天发现一个项目的git commit message中的单词拼错了,需要修改一下.但这样简单的修改,需要通过git rebase才能完成. 首先要git rebase到需要修改message的那个c ...

  9. Git rebase命令实战

    一.前言 一句话,git rebase 可以帮助项目中的提交历史干净整洁!!! 二.避免合并出现分叉现象 git merge操作 1.新建一个 develop 分支   2.在develop分支上新建 ...

随机推荐

  1. 【外文翻译】 为什么我要写 getters 和setters

    原文作者: Shamik Mitra 原文链接:https://dzone.com/articles/why-should-i-write-getters-and-setters 当我开始我的java ...

  2. Android事件分发机制详解

    事件分发机制详解 一.基础知识介绍 1.经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP等 2 ...

  3. css3 felx布局

    一.Flex布局是什么? Flex是Flexible Box的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为Flex布局. [css] .box ...

  4. 【渗透测试】PHPCMS9.6.0 任意文件上传漏洞+修复方案

    这个漏洞是某司的一位前辈发出来的,这里只是复现一下而已. 原文地址:https://www.t00ls.net/thread-39226-1-1.html 首先我们本地搭建一个phpcms9.6.0的 ...

  5. webapp万能选择器:iosselect

    iosselect是个什么东西? 移动端浏览器对于select的展示样式是不一致的,ios下是类似原生的picker,安卓下各浏览器展示各异,我们需要一个选择器组件来统一各端下各种浏览器的展示.下面是 ...

  6. Elasticsearch 默认配置 IK 及 Java AnalyzeRequestBuilder 使用

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢!   『 春夏秋冬失去了你,我怎么过一年四季- 民谣歌词 』   本文提纲 一.什么是 Ela ...

  7. Dalsa Sherlock 直连千兆网相机(通用驱动)

    支持 Sherlock 7.1.7.2,用于千兆网相机与 Sherlock 的连接. 可适用于很多厂商的相机,如:巴斯勒(Basler),JAI,堡盟相机(Baumer),灰点相机(Point Gre ...

  8. hive集成sentry

    1.安装配置sentry 详细步骤见上一篇安装配置sentry 2.配置hive 2.1 Hive-server2集成Sentry 在 /etc/hive/conf/hive-site.xml中添加: ...

  9. Firefox实用插件记录

    之前总结过一个软件推荐的小文,用来记录一直以来在软件开发过程中遇到的各种实用的软件.后来发现里面越来越多的记录了Firefox的插件,所以今天决定单独抽出一个页面来记录Firefox的插件.因为平时大 ...

  10. N维法向量与N维超平面的关系的简单证明(日志二)

    虽然按照上面的方式证明出来,但感觉之中,似乎依旧是不严密的, 如下: 如果直线是2x+2y+1=0 那么(-1,1)也是其平行向量 ,.那么(1,1)依旧是法向量 此时,直线经过(0,-1/2)这个点 ...