对于git的使用,平时都是
git pull & git push
,最近开发使用到了新的命令git rebase & git fetch
,记录一下
关于git fetch
直接说git fetch也许会有些陌生,但说起git pull肯定会了解,git pull的作用是将远程分支拉回到本地,这中间其实做了两件事:拉取与合并。
- 拉取:将远程代码拉到本地,此时还没有合并。如果使用
git branch -a
的话,可以看到一个origin/xxxx
的分支,这就是本地的远程分支。 - 合并:将本地的远程分支(origin/xxxx)合并到本地分支(xxxx)。
这里的拉取对应git fetch
,合并对应git merge
注意
git fetch
默认会拉取全部的远程分支,而git pull
只是拉取合并本地当前所在分支
关于git rebase
git merge
是一个经常使用的命令,可以将多个分支合并到一起,但是这样呈现的git节点树是不太友好的,很容易多条分支线错综复杂,不能直观的看出所做的更改,这显然不够合理
为了应对这种情况,出现了一种更好的做法,以一种续
的方式来将节点接到主分支的末端,最后呈现给人的就是一条长长的主分支,十分干净明了,这就是rebase。
在当前功能分支上正常开发,开发完毕后,需要合并到主分支时,平常的思路是:
- 切到本地主分支,
git pull
代码进行更新 - 切到本地功能分支
- merge冲突
- push
- 提个MR,合并到主分支。
rebase的思路是:
git fetch
代码拉取代码(此时远程代码是在origin/master上)git rebase -i origin/master
变基到主分支后- merge冲突
- push -f(强制推送)
- 提个MR,合并到主分支
这里用rebase -i的原因是,如果在功能分支上进行了多次commit,合到主分支上应该只保留一个。这时候我们可以使用git rebase -i origin/[xxx]
来进行提交,具体的可以看命令行提示。但需要注意,从上到下,在p标记前不可以使用s标记,否则会报错。
merge结束后,可以使用git rebase --continue
来继续rebase,也可以使用git rebase --abort
来取消掉rebase。
关于git graph
如果你使用的是vscode
,那么可以考虑使用该插件,原生的git log
是不够友好易读的,使用该插件可以清晰的看到所有节点的情况。
如果使用git rebase
后git graph
还是错综复杂,那么应该是没有删除已开发完成的功能分支,删除之后就一目了然了。