git三个小技巧:合并commit,删除已经被合并的分支,维护单向依赖的两个分支

今天准备整理一下git仓库,准备下一期的开发,写一下中间新学到的几个技巧。

一、使用 git rebase 的 squash 功能整合多个commit

在开发过程中,可能连续几分钟,每分钟都commit了1次,每个都是零碎的改动,看起来不优雅,就可以使用这个技巧。

在编辑git rebase --edit-todo 的时候,把 pick 改为squash即可,squash是合并到前一个commit的意思,所以第一次提交是不可以被标记为squash的。

二、使用删除本地仓库中已被远程仓库删除掉的分支

使用fetch

git fetch -p

删除本地 origin/xxx 的指令

git remote prune origin

删除本地 xxx 的指令

git branch -d xxx

如果本地认为xxx没有被合并、正在尝试删除未被merge的分支时,可以强制删掉它

git branch -D xxx

三、维护两个代码大致相同的、存在单向依赖关系的分支

我的情景是这样:一个本地离线运行的分支,一个在线部署的分支。离线的负责大部分的功能实现,在线是为了和其他人交互方便,也会用一些额外的依赖,所以前者经常更新,后者写一遍后,基本不会更新了,但后者会经常从前者拿一些新的功能过来。

为了描述方便,前者记做dev,后者记做online。

最开始,只有dev一个分支,我们可以在里面写好离线的代码和在线的代码,之后通过修改编译选项(例如我这个是gradle,删掉gradle模块的声明即可),虽然离线代码和在线代码都在仓库里,但平时编译时只编译离线部分。这时候 branch 一个 online出来,在这个 branch 里引入在线代码的模块,做一次提交。

这样做的好处是,将来从dev分支merge到online分支时,gradle文件不会被覆盖掉(不信的话可以让dev和online的操作顺序反过来,每次merge时候都要手动忽略掉gradle文件)。而且绝大部分情况下,merge都是从dev到online的,所以也不会出现反向覆盖的情况。

将来呢,每写完一个功能,就发起一个从 dev 到 online 的merge,即可同步代码过去,非常方便。