接下来我要讲的这个技巧,是讲分支合并成一个节点。比方现在有个main分支和dev分支,dev对于main,领先了一千个节点。那么使用这个技巧之后,main上就多了一个节点,这个节点包含了dev那领先的一千多个节点的内容。
该技巧就是git merge --squash xxx。
这是上述例子的实例代码:
(main)$ git merge --squash dev
有另外两种合并的办法:
git reset的办法
## 在dev分支的最新节点上,新建一个分支tmp,并切换到这个分支上
(dev)$ git checkout -b tmp
## 在tmp分支上,将HEAD指针设到main分支与tmp分支的交界处,
## 并且相关变更(tmp分支最新节点与交界处节点之间的变更)将存到git staged里
## (也就是git add .后,变更存储的地方啦)
(tmp)$ git reset main
## 现在,多个commit就合并成一个commit啦
(tmp)$ git add .;git commit -m "xxx"
## 接下来只要把这份“精华”节点,放到main上就大功告成啦
(tmp)$ git checkout main
## 这会把tmp分支最新节点,复制一份放到当前的main分支上
(main)$ git cherry-pick tmp
## 不要忘记删除多余分支噢
(main)$ git branch -D tmp
缺点,我记得这种合并方式,并不会将“删除文件”这样的变更给合并起来。
git rebase -i 的办法
会出现一个命令行的节点记录的界面,对于要合并的每个节点,手动打上s的记号,如果有一千个commit,就是要打一千次记号。
该技巧的实操场景示例
场景1
聪明的你,从develop分支切出了一个分支,叫feature1,在上面进行开发。
经过一天的辛勤劳动,你开发完毕了。由于你有每写几句代码就git add .;git commit的良好记录习惯,你产生了1000个commit。现在,你需要将feature1上的内容,合并到develop上,但是只能作为1个节点提交到develop分支上,因为邪恶的同时和愚蠢的上司并不喜欢见到这些。
所以你进行以下的操作:
(feature1)$ git checkout develop
(develop)$ git merge --squash feature1
(develop)$ git add .;git commit -m "feat: This is a feature"
场景2
你中午吃饱了饭,在午休的时候有点无聊。想要将当前分支的前1000个commit压缩成一个commit,向测试小妹展示你的炫酷手指操作。
于是你进行以下的操作:
## 在featrue1分支目前节点,往前数,第1000个节点上,
## 开一个分支,名为tmp
(feature1)$ git branch tmp feature1~1000
(feature1)$ git checkout tmp
(tmp)$ git merge --squash feature1
(tmp)$ git add .;git commit -m "feat: This is a feature"
(tmp)$ git checkout develop
(develop)$ git cherry-pick tmp
(develop)$ git branch -D tmp