一、背景
多人开发,免不了要在提交之前先 git pull --rebase 一下,修完冲突再提交;
就是这么一个简简单单的命令,却时常让我胆战心惊 —— 一不小心就会在 pull 的时候把辛辛苦苦写的代码给搞丢了!
所以,痛定思痛,决定优化这个操作!
二、设计
思路
其实,为了避免代码丢失,在重要操作之前,我都会通过「检出分支」的方式备份当前代码,所以可以把 pull 操作扩展为如下操作:
- 查看当前分支名称,并检出备份
- 执行
git pull --rebase
实现方式
参考 gpush 的实现:
alias gpush='git push origin HEAD:refs/for/master'
注:顺便优化一下它的实现,使得可以push到当前分支的远程分支:
alias gpush='git push origin `git symbolic-ref --short HEAD`:refs/for/`git symbolic-ref --short HEAD`'
三、实现
新加别名
废话不多说,直接上代码:
# git pull --rebase 的同时检出一份以备份,避免本地代码被覆盖、丢失
alias gpull='cb=`git symbolic-ref --short HEAD` && dt=`date "+%Y%m%d%H%M%S"` && bb="${cb}_${dt}" && git branch backup/$bb && git pull --rebase'
让别名生效
最后参考如下方法 或 这篇文章 完成该别名的加载,这样就算完事儿了~
1. 临时生效
在终端执行该代码
2. 永久生效
a. 把上述代码粘贴到 ~/.bashrc 文件(没有就自己创建一个吧)的最后,然后执行 source ~/.bashrc
b. 新建或打开 ~/.bash_profile 文件,在新的一行写入 source ~/.bashrc
执行效果
执行效果如下:
Andys-MacBook-Pro-2018:WKStudent mengxinxin$ git branch
* dev1.1.0
master
Andys-MacBook-Pro-2018:WKStudent mengxinxin$ gpull
^ ^ | Hi, mengxinxin |
| o .:[I]:_ Welcome to iCode ,:[I]:.
| .: :[C]: :-. _= ET@baidu =_ ,-: :[C]: :.
| .: : :[O]: : :`._ ,.': : :[O]: : :.
| _..: : : :[D]: : : : : :-._________.-: : : : : :[D]: : : :-._
| ^^^^^^^^^^[E]^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^[E]^^^^^^^^^^
| [|] [|]
| ~~^-_~^~|||~^-~^~_~^-~_^~-^~_^~~-^~_~^~-^~_^|||~^-~_~^--
|
|Please wait a moment...
|Already up to date.
Current branch dev1.1.0 is up to date.
Andys-MacBook-Pro-2018:WKStudent mengxinxin$ git branch
backup/dev1.1.0_20200816175915
* dev1.1.0
master
Andys-MacBook-Pro-2018:WKStudent mengxinxin$