之前偶尔遇到一些大厂面试官(网易)喜欢问git一些东西,所以说git命令行还是得掌握,虽然说不是每个大厂面试官都问,但是你防不住他问你这些非常冷门的东西。
像commit push这种我就不说了,说点进阶的,fetch、rebase、cherry-pick这种。像rebase、cherry-pick是我们公司资深开发告诉我的,但是你长期这样就是很巨婴,你不能老是别人喂饭给你吃对吧,所以像这种东西还是得去系统学习一下。
cherry pick
背景:本来应该在branch1 comomit 结果你在branch2直接commit,那想要把这些东西搬到branch1就会很麻烦,所以直接把1或者多个commit内容放到branch1上,于是
git checkout branch1
git cherry-pick <commit id>
语法
git cherry-pick <commit id>
git cherry-pick <commit id1> <commit id2>
git cherry-pick <commit id1>...<commit id8>
#2-8的commit全部复制过来(开区间)
git cherry-pick <commit id1>^...<commit id8>
#1-8的commit全部复制过来(闭区间)
这样这一个或者多个commit就会被复制到branch1上
解决cherry-pick造成的冲突
git add git cherry-pick --continue#1 继续
git cherry-pick --abort#2 回滚
git cherry-pick --quit#3 中断(不咋用)
stash
当你在本地有文件变动,又想直接pull,是不会成功的,如果说你本身不希望这些变动直接commit,那么可以先保存起来。用stash,这个是一个栈,先把变动代码保存在栈里面,等pull之后再取出来,继续修改。
使用
- 存栈
git stash
git stash name(注释)
- 出栈
git stash pop(出栈顶)
git stash apply(不出栈 peek)
- 清除
git stash drop 索引
git stash clear
- 查看
git stash list
git stash show 索引
rebase
相比git merge,rebase会很干净,比如说原来merge,出现冲突,解决merge完之后 修改人的名字变成你的,这样就很难去追踪到底是谁的代码。merge之后这条分支记录还在,但是rebase完就相当于没有这个分支了。 develop #开发分支 master #主分支,并且有新代码
git checkout develop
git rebase master
git rebase --continue#出现冲突
diff
查看区别
git diff A...B
比较3和8的区别
git diff A..B
比较7 和 8的区别
log
查看日志
git log A..B
查看 4 6 8
git log A...B
查看 5 7 、4 6 8
fetch
- git remote show origin查看本地是否落后于远程
语法
git fetch [远程] # 拉取全部
git fetch 远程 分支 # 拉取分支
pull
git pull=git fetch+git merge
git pull [远程] #拉取全部并合并
git pull 远程 分支 #拉取分支并合并