

两条命令让你的git自动变基
source link: https://segmentfault.com/a/1190000040712052
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

为什么要变基
Git官方文档中提到:
在 Git 中整合来自不同分支的修改主要有两种方法:
merge
以及rebase
。
merge
也就是合并
,这个概念很容易理解,我们从分支上拉取代码进行修改,再提交的时候,如果遇到了别人的修改,则把我们的修改和他们的修改合并一下。那么rebase
中文译为变基是什么意思呢?首先要理解这个base
,base
也就是基础的意思,当我们从代码分支上获取代码的时候,我们就有了一个基础,也就是base
,此后的修改我们都是在这个基础之上进行的,但是当我们需要提交修改的时候,遇到了别人的代码,变基这个操作就是在这个时候,我们不去合并别人的代码,而是直接把我们原先的基础变掉,变成以别人修改过后的新代码为基础,把我们的修改在这个新的基础之上重新进行。基础变掉了,所以叫作变基
。
那么,变基有什么好处呢?好处之一是可以使我们的时间线变得非常干净,以前采用合并的时候,时间线里完整记录了我们的代码是从哪个基础上拉取出来的,做了哪些修改,然后又在哪个时间点合并回分支去,而采用变基之后,时间线上不再反映拉取的时间点,因为每次提交都是以最新代码为基础的,所以时间线就变成了一根直线。
下面拿两个真实例子给大家更直观地看一下:
这是采用自动变基之前的时间线,可以看到,各种混乱:
这是采用自动变基之后的时间线,非常整齐,可以很清楚地看到哪一次修改之后又发生了什么修改,而不是多次修改纠缠在一起:
虽然网上关于变基的教程很多,但是一般初学者总会感到茫然,不敢轻易下手,怕万一把时间线弄坏了,一发不可收拾。而且所有关于变基的命令都和我们已经多年习惯了的pull/add/commit/push
不一样,很多图形化的工具例如vscode也不直接支持rebase
这样的命令,都需要手工输入,繁琐而且容易出错。所以我们今天不讲太多的rebase
命令怎么用,而直接用两条命令设置一下,从此以后让你每次提交都可以自动变基,而不必改变之前的任何操作习惯。这两条命令就是:
git config --global pull.rebase true git config --global rebase.autoStash true
这两条命令在任意一台电脑上都只需要设置一次,而且一次设置,全局生效,所有的项目以后每次pull/push
都会自动变基,再也不用担心在提交之前忘记变基了。
如果不想了解原理的话,则执行完上面两条命令就可以去开心地变基了,完全没有问题。如果想了解一些原理,可以接着往下看。下面我们来详细解释一下这两条命令的原理:
首先,我们要搞清楚一点:什么时机是变基的时机?一般理解是推送的时候,其实不是,而是从拉取的时候就要开始变基了,因为你拉取的时候,服务器上可能已经有新代码了,所以要变基也是在这个时候,一旦发现有新基础了,则立马变掉。所以,通常情况下,我们拉取新代码无非就是一个命令:git pull
,但现在我们要变基拉取,就需要用git pull --rebase
。但是每次这样执行命令就会很麻烦,而且你在vscode里也没有办法自动加这个参数,所以为了方便起见,我们就设置一下第一条命令,这样每次拉取它都会自动变基。
但是自动变基往往会带来一个额外的问题,那就是每次当你手头有正在编辑的文件的时候,它就说它无法变基,因为你的工作区不干净。为什么不变基的时候没有这个问题,而一旦选择了自动变基,工作区就必须保持干净呢?因为变基的操作原理是它需要先把你本地代码库里还没有推送的那部分提交反向释放到工作区,然后从服务器拉取新代码,再以新代码为基础把工作区里的修改附加上去,因为有这个过程,所以它必须要求你的服务区是干净的。为此git提了两个建议:要么你把所有修改先全部都commit
到本地,要么你把它们都stash
保存起来。首先说,commit
肯定不是一个好主意,因为很有可能这时候我们的工作做到一半,还不适合commit
,如果每次pull
都commit
一下的话,那么分支树上会多出很多无用的节点。那只剩下最后一个选择,就是每次pull
之前都stash
一下,pull
完了之后再把stash
的内容pop
出来,但这样岂不是更麻烦?所以这里我们用第二条命令设置一下,每次rebase
的时候都自动把我们工作区里的内容自动stash
进去,rebase
完成之后再自动恢复出来。
其余要注意的就是有冲突的时候,如果有冲突,则合并完冲突之后,执行一下git rebase --continue
就好了,其它和原先的用法没有任何区别。
Recommend
-
36
流量IP商业化走出了两条完全不同的路:独乐乐、与众乐乐
-
54
新浪科技讯10月15日上午消息,据北京市海淀区人民法院官方网站,因认为“补刀小视频”App未经许可擅自播放其平台中的“PPAP”(时长36秒)和“这智商没谁了”(时长18秒)两条短视频,北京快手科技有限公司将广州华多网络科技有限公司诉至法院
-
31
在咖啡这条火热的赛道上,瑞幸和连咖啡走出了两条完全不同的路,互为映衬,彼此对照,才使这条赛道不会过于单调和乏味,这两种商业样本的同时存在,最大的意义并不在于赢得对手,而是证明自身。 但随着互联网咖啡步入后半场,...
-
48
程序员 - @fakeMaster - 公司搞了两条光纤组成的两个局域网,现在想两个局域网可以互通,静态路由好像不行,是否需要使用 VLan ?有没有大神解答下,谢谢
-
27
讲个故事,假如…… 某天,老板让你分省统计口罩最近的订货数据,以快速决策需要向哪里调货。你发起查询,全部订单数据多达数亿甚至更多,TiDB 不得不花费一小段时间。由于存储节点在全力计算...
-
18
Git 核心的附加价值之一就是编辑历史记录的能力。与将历史记录视为神圣的记录的版本控制系统不同,在 Git...
-
9
简单两条命令让群晖存储空间类型为RAID1或者SHR无损转换成Basic 2021年11月22日 0条评论 229次阅读...
-
7
两条命令搞定免密码 ssh 连接服务器 SSH 为 Linux 环境下最常用的远程连接协议,它是 SecureShell 的简写。SSH 除了可以用作安全的远程 shell 来对主机进行管理外,其套件中还包括 scp 等文件传输工具,方便本地与远程主机的文件传输。通过配...
-
8
两条命令搞定 ChatGPT API 的调用问题,有手就会!
-
3
关于Git分支变基操作的一些笔记 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。——–王小波
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK