这个命令大体作用就是对本地的commit进行修改,适用于以下情况:

  1. 本地历史排查修改
  2. code review后,打回修改

详解

  • pick,只是意味着包括提交。重新进行命令时,重新安排pick命令的顺序会更改提交的顺序。如果选择不包括提交,则应删除整行。
  • reword,该命令与相似pick,但是使用后,重新设置过程将暂停并为您提供更改提交消息的机会。提交所做的任何更改均不受影响。
  • edit,如果您选择edit提交,则将有机会修改提交,这意味着您可以完全添加或更改提交。您还可以进行更多提交,然后再继续进行变基。这使您可以将大型提交拆分为较小的提交,或者删除在提交中所做的错误更改。
  • squash,该命令使您可以将两个或多个提交合并为一个提交。提交被压缩到其上方的提交中。Git使您有机会编写描述这两个更改的新提交消息。
  • fixup,这类似于squash,但是要合并的提交已丢弃其消息。提交仅合并到其上方的提交中,并且较早提交的消息用于描述这两个更改。
  • exec,这使您可以对提交运行任意的Shell命令。

测试

git init

touch base.txt
git add .
git commit -m "add base" touch 1.txt
git add .
git commit -m "add 1" touch 2.txt
git add .
git commit -m "add 2" touch 3.txt
git add .
git commit -m "add 3" touch 4.txt
git add .
git commit -m "add 4" touch 5.txt
git add .
git commit -m "add 5"

git log

commit a75ed742838ebc1ef1073502623478f73e1ec21f
Author:
Date: Wed Mar 4 10:02:51 2020 +0800 add 5 commit 8b485bb4768b2abf8f6400dcba069f1a650ed5ec
Author:
Date: Wed Mar 4 09:59:27 2020 +0800 add 4 commit 63ce9fb010da550c668aca66758c45fbfad46e2b
Author:
Date: Wed Mar 4 09:59:04 2020 +0800 add 3 commit 9cd34c4d42f52cfb40026dae613c8ad29d7cbc66
Author:
Date: Wed Mar 4 09:58:45 2020 +0800 add 2 commit 77bd0eb1a97e1676367ea236c1c47c155eaa8430
Author:
Date: Wed Mar 4 09:58:23 2020 +0800 add 1 commit 443sdafdsafgdf123123dfh234546gjnhbjh344
Author:
Date: Wed Mar 4 09:58:23 2020 +0800 add base

上手

先手内容

git rebase -i HEAD~2 这里的git rebase-i HEAD~为常用命令,后面的2为倒叙git log的几个提交

比如git rebase -i HEAD~2,命令行当进入vim模式,并显示:

pick a75ed74 add 5
pick 8b485bb add 4

修改为

pick a75ed74 add 5

保存则删除add 4的commit

pick,对commit进行排序或删除

通过git rebase -i HEAD~n后,对每行进行删除或上下替换位置即可充值commit顺序或删除。

record,对提交commit的message进行修改

输入git rebase -i HEAD~3,进入vim如下:

pick 9cd34c4 add 2
pick 63ce9fb add 3
pick 575fd8b add 5

将第一行pick换成recordr,这里rrecord简写,二者没有差异

r 9cd34c4 add 2
pick 63ce9fb add 3
pick 575fd8b add 5

保存后会进入vim如下:

add 2

对这个修改为

add 2 ~ new commit

保存退出,使用git log

add 2 ~ new commit

edit,修改提交的代码

  • 场景一,需要在某两个提交间,穿插一个提交做个事情

git rebase -i HEAD~2

pick 6934312 add 3
pick 5ce6dde add 5

改为

e 6934312 add 3
pick 5ce6dde add 5

保存后终端显示以下两个关键句

git commit --amend
git rebase --continue

--amend为把修改add后添加到当前的提交上

--contine表示不做处理,继续下一个提交

比如此时我们vim 3.txt并追加内容edit test到3.txt文件中,并保存。

git add 3.txt
git commit -m 'new edit 3.txt'
git rebase --continue

此时的git log

add 5.txt
new edit 3.txt
add 3.txt
  • 场景二,需要在某两个提交间,穿插一个提交做个事情,但是不新增提交

git rebase -i HEAD~2

pick 6934312 add 3
pick 5ce6dde add 5

改为

e 6934312 add 3
pick 5ce6dde add 5
git add 3.txt
git commit --amend

此时的git log

add 5.txt
add 3.txt

此时修改归到了add 3.txt这个提交中

squash,合并变更到一个commit中

git rebase - i HEAD~2

输出

pick 6934312 add 3
pick 6fa47e4 add 5
pick 6934312 add 3
s 6fa47e4 add 5

进入vim

add 3

add 5

内容修改为

add 3 & add 5

git log

add 3 & add 5
add 2
add 1
add base

fixup,类似squash,不过是直接弃用对应的提交,将变更直接合并到更早的提交,不建议用,除非很熟练

git rebase -i HEAD~2

pick 311adc9 add 1
pick 7f9d45d add 2 ~ new comment

改为

pick 311adc9 add 1
s 7f9d45d add 2 ~ new comment

git log

add 1
add bash

exec,执行shell命令,没发现有什么实际用途目前(针对开发)

git rebase -i HEAD~2

add 1.txt

改为

exec echo "Hello World"
add 1.txt

保存

Executing: echo "Hello World"
Hello World

drop,直接删除某个提交

pick删除一样,pick是删除这一行,drop是使用命令描述删除这一行的提交

修改历史提交用户

git commit --amend --author "Iron <iron.yehong@outlook.com>" --no-edit

git rebae -i的更多相关文章

  1. Git 命令收集

    目录 1.清理恢复 2.回滚,reset与revert的区别 3.merge,rebase,cherry-pick区别 4.删除不存在对应远程分支的本地分支 5.git pull,git push 报 ...

  2. Git工作流:中心工作流(翻译)

    使用Git作为版本控制器,有众多可能的工作流(Workflow),这使得我们这些新鸟不知道在实际工作中不知道该选择哪种工作流.这里我们对最常见的Git工作流做一个对比,为企业团队提供一个参考. 正如你 ...

  3. Git 子模块 - submodule

    有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...

  4. Git 在团队中的最佳实践--如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  5. Git与Repo入门

    版本控制 版本控制是什么已不用在说了,就是记录我们对文件.目录或工程等的修改历史,方便查看更改历史,备份以便恢复以前的版本,多人协作... 一.原始版本控制 最原始的版本控制是纯手工的版本控制:修改文 ...

  6. Git Bash的一些命令和配置

    查看git版本号: git --version 如果是第一次使用Git,你需要设置署名和邮箱: $ git config --global user.name "用户名" $ gi ...

  7. 在Ubuntu 16.10 安装 git 并上传代码至 git.oschina.net

    1. 注册一个账号和创建项目 先在git.oschina.net上注册一个账号和新建一个project ,如project name 是"myTest". 2.安装git sudo ...

  8. 史上最详细git教程

    题外话 虽然这个标题很惊悚,不过还是把你骗进来了,哈哈-各位看官不要着急,耐心往下看 Git是什么 Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别 SVN是集中式版本控制 ...

  9. [版本控制之道] Git 常用的命令总结(欢迎收藏备用)

    坚持每天学习,坚持每天复习,技术永远学不完,自己永远要前进 总结日常开发生产中常用的Git版本控制命令 ------------------------------main-------------- ...

  10. 【解决方案】Myeclipse 10 安装 GIT 插件 集成 步骤 图解

    工程开发中,往往要使用到集成GIT ,那么下面说说插件安装步骤 PS:以Myeclipse 10 为例,讲解集成安装步骤. ----------------------main------------ ...

随机推荐

  1. Windows下安装和配置Java JDK

    1.下载地址 JDK21 Windows安装版下载地址:https://www.oracle.com/java/technologies/downloads/#jdk21-windows JDK21 ...

  2. TortoiseGit拉取出现“Could not open repository. libgit2 returned: repository path……”错误的解决办法

    TortoiseGit拉取出现"Could not open repository. libgit2 returned: repository path--"错误的解决办法 1.问 ...

  3. Q:oracle通过正则表达式替换对应值

    示例 把http://192.168.1.1:8888/a.html中的192.168.1.1:8888/替换成172.32.32.1:9999/ SELECT replace('http://192 ...

  4. FLink自定义Source,不停生产数据

    一.代码模板 VideoOrder.java package net.xdclass.model; import java.util.Date; import lombok.AllArgsConstr ...

  5. dp 常见套路总结

    dp 里存的东西值域不大的时候,考虑把状态中某一维和 dp 里存的东西交换,进行 dp. 连续段 dp 时,考虑把连续段化为对每个元素考虑接上一个元素. dp 里的值可能存在某个上界,超过这个值一定不 ...

  6. kubernetes 集群中部署 nginx 服务

    kubernetes 部署nginx服务 本章节将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其进行访问. Namespace Namespace是kubernetes系统中 ...

  7. 库卡KUKA机器人KRC2示教器维修常见方法

    库卡KUKA机器人以稳定性而备受赞誉.作为其重要组成部分,KRC2示教器在机器人的编程.监控和调试过程中发挥着至关重要的作用.然而,就像其他任何电子设备一样,KRC2示教器在长期使用过程中也可能会遇到 ...

  8. Mybatis中的 switch

    我这遇到个问题,如果 type字段为null则查询type is null,否则查对应的值 询问 AI 得知,可以用choose-when-otherwise <select> selec ...

  9. 机器学习 | 强化学习(3) | 无模型预测(Model-Free Prediction)

    无模型预测(Model-Free Prediction) 无模型预测概论 上一节课<通过DP求解>可以解决一个已知的马尔科夫决策过程 本节课 实践无模型预测 解决或者估计一个未知马尔科夫决 ...

  10. Windows 提权-UAC 绕过

    本文通过 Google 翻译 UAC-Bypass – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 ...