妙用git rebase --onto指令
有时候,在分支提交更改的时候,会忘记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的时候给你帮助,同时留下你的脚印,这也是对我最大的支持,谢谢。
妙用git rebase --onto指令的更多相关文章
- Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...
- 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% ...
- Git Bash 常用指令
1. 关于git bash常用指令 推荐博客: 史上最简单的 GitHub 教程 猴子都能懂的GIT入门 Learn Version Control with Git for Free Git Do ...
- git 的一些指令
作为一个前端,git的各种指令应该是需要掌握的,因为前一段时间遇到了一些问题,总觉得每次遇到点问题都去百度这样总归不大好,还是记录一下比较常见的一些指令吧.以后遇到新的再继续添加. 1. 新建本地分支 ...
- git rebase 多分支操作
- git rebase and git merge 区别 这一次彻底搞懂 Git Rebase - git在工作中正确的使用方式----git rebase篇 Git 操作假设Git目前只有一个分支 ...
- 学习 Git Rebase
有问题为什么不问问神奇的 man 呢? rebase 也算是我比较常用的一个指令了,但是很长时间以来,对这个指令的认识还是不够深刻,于是就找了个时间认真地读了一下 git rebase 的文档.这份文 ...
- git的常用指令(一)
1. 查看git远程的所有分支 git branch -a 2.查看本地已有的分支 git branch 3.本地检出一个新的分支并推送到远程仓库 一).创建本地分支 git checkout -b ...
- 【译文】Git merge 和 Git rebase比较
[译文]Git merge 和 Git rebase比较 原创: 胡江华 胡同学和朋友们的成长日记 2017-03-22 git rebase 这个命令经常被人认为是一种Git巫术,初学者应该避而远之 ...
- Git应用详解第九讲:Git cherry-pick与Git rebase
前言 前情提要:Git应用详解第八讲:Git标签.别名与Git gc 这一节主要介绍git cherry-pick与git rebase的原理及使用. 一.Git cherry-pick Git ch ...
随机推荐
- bzoj1076
好像题目有点问题?且现在决定不吃的宝物以后也不能再吃好像下次还是可以吃的,就是这样然后明显是状压dp,注意这道题明显倒推更容易因为顺推很可能从一个无效状态推到有效状态 ..,..] of double ...
- BZOJ 1054 [HAOI2008]移动玩具
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1388 Solved: 764[Submit][Statu ...
- hdu-2586-How far away ?(离线LCA)
题意: 给定一棵树,每条边都有一定的权值,q次询问,每次询问某两点间的距离. 分析: 这样就可以用LCA来解,首先找到u, v 两点的lca,然后计算一下距离值就可以了. 这里的计算方法是,记下根结点 ...
- 【转】Android实例剖析笔记(二)--用实例讲解Andriod的开发过程,以NotesList为实例介绍Android的菜单机制
原文网址:http://kb.cnblogs.com/page/78304/ 简介 android提供了三种菜单类型,分别为options menu,context menu,sub menu. op ...
- Combination Sum III —— LeetCode
Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...
- CTE Recursion Performance
CTE全名是Common Table Expression,语法基础请参考MSDN文档:https://msdn.microsoft.com/zh-cn/library/ms175972.aspx. ...
- 用于A*的 二叉堆 AS3实现
package com.copper.isometric.pathing { import flash.sampler.startSampling; /** * ...
- Hard 计算0到n之间2的个数 @CareerCup
一种是Brute force,O(nlogn) 另一种是找规律O(n),见http://hawstein.com/posts/20.4.html 当某一位的数字小于2时,那么该位出现2的次数为:更高位 ...
- SAP OTR 字段维护 更改SAP的字段翻译
维护系统文本字段:SOTR_EDIT TC:SE63 在SAP用户选择屏幕中,用鼠标选定一个栏位后按F1键,能够看到SAP对其详细解释,通常这样的解释文本分为两部分,一部分为标题, ...
- JVM中java类的加载时机(转载:http://blog.csdn.net/chenleixing/article/details/47099725)
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制.类从被加载到虚拟机内存中开始,到卸载出内 ...