这篇文章主要是想讲一讲在git 工作流过程中,如何将你的工作树,变成一条线,而不是线条错乱分开的。
一个优秀的Git 管理流程应该是职责清晰,条例清晰,网上也有很多的的介绍:
https://www.jianshu.com/p/bb980de96be6
https://www.oschina.net/translate/a-successful-git-branching-model
一、rebase、stash的基本用法
stash
它的意思就是,把当前你已经修改了的文件暂存到本地,把你的分支恢复到未修改状态。你可以无限存储,存储的顺序是倒序的,最后的提交排序在最顶端,通过list 来查看存储的列表。
stash相关命令
- 存储当前修改:git stash save "message" 或者 git stash "message"
- 查看存储列表:git stash list
- 恢复存储的修改:git stash apply
- 恢复指定的存储修改:git stash apply stash@{l} l 是指当前存储列表中的顺序 0,1,2,3...
- 清空存储列表:git stash clear
- 移除指定的存储修改:git stash drop stash@{l} l 是指当前存储列表中的顺序 0,1,2,3...
rebase
rebase 字面意思就是修改它的基础版本,使用rebase 命令的分支不要轻易使用push命令,也就是说两个分支master,branch1,branch1是基于master的最新提交创建的,现在master中 提交了commit1,而branch1 中也有修改需要提交,这个时候branch1,commit2修改到本地分支,然后使用rebase命令,这个时候branch1 做的事情是先把commit2存储在patch中,然后把master的最新提交commit1 合并过来,然后再讲存储在patch 中的commit2恢复到branch1分支中,这个时候有冲突就解决冲突,如果没有就可以提交commit,push 到branch1的远程分支,然后合并到master分支中。这里我们下不说为什么要这么做,我们先看看有哪些命令。
rebase相关命令
- 合并分支内容:git rebase [branch]
- 解决冲突后继续合并:git rebase --continue
- 终止合并(还原到原有状态):git rebase --abort
二、如何将工作树变成一条线,而不是很多的分叉线,合并线。
在工作过程中,我们会创建很多的分支,用于不同的功能或者修改,这样就会有很多的合并merge,一般的情况下都是直接使用merge,然后有冲突解决冲突,然后提交,这些操作没有问题,所生成的工作树就会有很多的分叉、合并,对于这种情况,有没有更好的办法,使得我的工作树种不会有那么多分叉、合并,使它看起来就是一根线,答案可定是有的,接下来看一下这种常见情况:
可以看到这样直接操作就会产生两条线,branch的分叉线也在其中。接下来我们看一下 rebase或者stash 的区别。
是不是觉得很神奇,只有一根线了。这里其实你可以看到,最根本的是commit4的指针指向问题,或者说它是基于什么地方开始修改的,如果变成了基于最新的内容进行修改的,那就会变成一根线了。这就是最根本的。
三、stash,rebase的区别
原理不一样
- stash操作,只是把修改的内容保存起来,然后还需要执行merge操作,把master的最新提交合并到branch分支中,然后执行 stash apply,把暂存的修改内容恢复,这样就把commit4指向了最新的内容修改了。
- rebase操作,是在branch分支中已经把修改内容提交到本地分支了,这个时候执行rebase操作,会先把修改的内容放入patch中,然后还原到未修改的状态,然后合并master的最新修改到branch中,然后再把patch中的内容恢复,同样的也是把commit4指向了最新的内容修改了。
时机不一样
- stash操作,有修改的内容,还没有提交到本地分支,也没有提交到远程分支
- rebase操作,有修改的内容,已经提交到本地分支,没有提交打远程分支
步骤不一样
- stash操作,需要执行 stash + merge + apply
- rebase操作,需要执行 commit+ rebase
注意:
1.stash 可以选择性恢复修改的内容。
2.rebase操作分支,只能commit到本地,不能push到远程分支,不然还是会出现两根线的。