有时候,在分支提交更改的时候,会忘记rebase,就直接提交上去,或者忘记和本地远程分支做merge,就直接rebase了别的分支。有时候真希望有一种切片的方式,让自己的分支只需要接上某一段。这个时候你可以使用git中的rebase --onto了。

假设场景    B----C           A,现在想将B-C之间的切片(注意边界的B和C,后文会讲到)放到A之上。

假设git rebase --onto A B C,这个demo.A代表的是你实际想要将切片放到哪的分支,B代表切片开始分支(一定要特别注意B的开闭问题,这里rebase --onto的机制是左开右闭)也就是说,如果你真的想要B的这一个节点切片,你应该从B之前的一个分支开始,这个时候git又为我们准备好了,即B~1或者B^,两者都代表回到B之前的一个节点。C代表的是切片的末尾,此时是闭,也就是说C的当前节点也会被带到A之上。

很多同学看到这里会说,原来这么简单,我会了! 其实,你们还忽略了一个很严重的问题,即A,B,C哪个分支才是我之后真正的活动分支。即我完成切片操作之后,A的历史是在切片之上了吗?

我要告诉你的是,A的历史压根就没有改变。 同学会问:什么!?那我做切片干吗,我就想在A之上放上我的切片历史啊! 其实这个时候有一个细节就特别要注意,那就是真正的活动分支是C,也就是说如果你想保留A和C的历史,你就需要在切片的末尾先建立一个分支temp,这样我调用命令 git rebase --onto A B~1 temp,也就是说我把B到C之间的历史加到了A之上,并且当前temp分支的历史状态就是我想要的。这样,你才真正完成了git rebase --onto这个命令。

除了以上的使用场景之外,还有一个用法比较经典。假设你有一段很长的历史比如A-1-2-3-4-5-6-7-8-B.

这个时候你忽然发现在1的地方,有一处改错了,但你又不想git reset B~8,进行修改之后再一个一个重写提交信息。这个时候你就可以用git rebase --onto了。 其实很简单,假设我们在1这个节点有个错误,首先,我在1切一个分支temp,切过去之后做更改,更改完之后我用git commit --amend,即重写本次提交历史的。提交之后,我1的提交信息没有改变,但文件已经被我改变了,好,接下来要做的就是把原来1之后的到B的历史,加到新的1之上。因为我们通过tig或者gitk可以看到,此时的1和新1完全走的是两条分支状态,所以自然而然的我们会想到去这么做。

这个时候就可以用我们的git rebase --onto了, 首先在切片末尾,即B上建立一个活动分支result,然后调用命令git rebase --onto 新1 1 result,注意里面开闭区间的问题,因为我此时已经有1的历史,所以我应该从1的下一个开始,但又因为是左开又闭,所以我这里就直接写1就没问题。这样就完成了回退历史做修改,并且可以不用重新写提交信息的操作,很酷炫吧!

希望这篇文章可以给你在使用git的时候给你帮助,同时留下你的脚印,这也是对我最大的支持,谢谢。

转载于:https://www.cnblogs.com/rickyk/p/3848768.html

妙用git rebase --onto指令相关推荐

  1. git 强制更新远程_版本控制管理工具git的常见指令合集

    今天小千就来给大家介绍一下git中比较常见的指令合集,方便大家使用git,建议收藏起来方便日后查阅. 一.常见的命令 git help <command> # 显示command的help ...

  2. git rebase和git merge的用法

    http://softlab.sdut.edu.cn/blog/subaochen/2016/01/git-rebase%E5%92%8Cgit-merge%E7%9A%84%E7%94%A8%E6% ...

  3. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

    前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...

  4. git rebase 变基

    概念 变基(Rebase)也是合代码的一种手段. 变基与合并(Merge)不同的是,他可以修改历史,使用rebase来代替merge合代码的话,得到的历史记录是一条直线提交历史,无分叉,很漂亮. 然而 ...

  5. git 相关文件指令随笔

    1.若commit 且push后,发现文件存在问题,可如下操作: (1)本地修改对应文件至OK,然后, git add filename git commit --amend git push ... ...

  6. git 代码没了,git rebase 合并提交记录,git stash

    xx 问题 git合并提交记录 创建提交记录 合并提交记录 rebase有冲突 合并后的本地路径提交到远程 其中的参数 pick 改变提交 5.txt 和 4.txt 的顺序 删除某一个提交 rewo ...

  7. git rebase 的几种用法

    演示过程中,为便于区分修改结果,未使用commit 版本号,建议各位使用尽量以版本号为准 1.修改历史提交信息 例如:将提交历史 修改提交1改为 develop 修改提交1 修改步骤: 查看 git的 ...

  8. [Git] Git整理(四) git rebase 的使用

    概述 在之前总结分支相关内容时说道,合并两个分支的提交可以使用git merge,然而除了这种方式之外,还有一种方式就是使用git rebase,这两种方式的最终结果都相同,但是合并历史却不同:git ...

  9. 常用的Git命令行指令以及图形化界面的简单操作

    命令行操作 常用指令 指令 作用 指令 作用 cd 打开目录 pwd 绝对路径 ls 列出清单 mkdir 新建目录 cp 拷贝 mv 移动 rm 移除 touch 创建文档 一.git版本管理的指令 ...

  10. 你在开发过程中使用Git Rebase还是Git Merge?

    1. 痛苦吗?代码历史中的迷失羔羊 我们先来看一个真实的代码提交历史图形化截图: 图片源自 https://storage.kraken.io/kk8yWPxzXVfBD3654oMN/c8b97f4 ...

最新文章

  1. php 去掉img,php如何删除img标签
  2. 施一公:世界如此未知,还有什么物事必须难以释怀?
  3. 信号系统的一些基本概念
  4. Guava 2.2-新集合类型
  5. PHP中使用CURL实现Get和Post请求方法
  6. 力扣459. 重复的子字符串(KMP,JavaScript)
  7. **【校招速递】入职鹅厂,算法大赛优秀选手开启职场新生活**
  8. 深度学习基础系列(十)| Global Average Pooling是否可以替代全连接层?
  9. 一键关闭 openwrt路由器的led灯
  10. navicat 绿化版
  11. html video添加字幕,HTML5标签:video元素的使用方法及作用
  12. 2012年信息系统项目管理师下半年上午考试习题与答案解析
  13. 电脑开机黑屏---只有一个鼠标箭头处理办法
  14. 全球值得关注的11家人脸识别公司与机构
  15. Android音视频全面介绍与代码实践之音效(四)
  16. 迈入发展期的信创,更需夯实基础
  17. 台式计算机的安装顺序,台式电脑安装系统步骤图 装系统步骤详解
  18. html中的colspan是什么意思
  19. android 双屏壁纸,高清全面屏双屏壁纸
  20. 季节性ARIMA:时间序列预测

热门文章

  1. [Struts]让Dreamweaver显示Struts标签的插件
  2. graphx 基础算法
  3. StringBuilder 使用方法
  4. 硬盘(U盘)被误格式化(删除),重要的文件如何恢复?
  5. iOS UIButton没了交互事件
  6. Spring Boot 如何获取 Controller 方法名和注解信息?
  7. 三包围结构的字是什么样的_清桦学书之结构篇——包围结构。
  8. Zeppelie连接jdbc的使用
  9. 网络编程之OSI七层协议
  10. hadoop中MapReduce多种join实现实例分析