本文目录:
1.HEAD是什么?
2.用checkout来改变HEAD当前的指向(-b可以创建并指向新的分支)
3.rebase来合并分支
3.1rebase -i的用法
4.merge来合并分支
4.1rebase和merge的区别
5.cherry-pick挑选提交来合并
6.reset在本地分支穿越时空
7.revert来撤销远程的修改
8.怎么对以前提交的记录调整?
9.怎么给提交设置tag?
10.describe帮你在提交历史中移动了多次以后找到方向
11.简单案例分析
11.1怎么只提交最后的一个记录?
11.2多次rebase的使用
Git练习网站:https://learngitbranching.js.org/?locale=zh_CN
推荐去这个网站练习,有可视化的节点动作辅助理解。
1.HEAD是什么?
HEAD 就是当前活跃分支的游标,你现在在哪儿,HEAD 就指向哪儿,所以 Git 才知道你在那儿!
2.用checkout来改变HEAD当前的指向(-b可以创建并指向新的分支)
git checkout HEAD^ 把HEAD向上移动一格
git checkout HEAD~4 把HEAD向上移动四格
git checkout C1 把HEAD指向C1(这里的C1指的是hash值,下同)
git branch -f master C6 把master分支指向C6
git checkout -b bugFix 创建并指向bugFix分支并
git checkout master 指向master分支当前所在位置
^可以连用,后面的数字表示选择哪个父节点,
~也可以连用,后面的数字表示选择往前几个父节点
image.png
3.rebase来合并分支
Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
//在指向bugFix的时候,调用git rebase master ,将bugFix上的改动逐个放到master中。如下图箭头所示
git checkout bugFix
git rebase master
//当然也可以用下面这种方法,更为清晰,也不用确认当前节点是否在bugFix上。意为将bugFix的分支逐个放到master下面
git rebase master bugFix
3.1rebase -i的用法
git rebase -i HEAD~4 (HEAD原来指向的是左边分支的C5),通过出现的vim改变文件来调整顺序和数量
或者
git rebase -i overHere master (将master分支重新调整后方到overHere分支下)
出现的VIM界面类似于下图所示,可随意调整位置
image.png
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
4.merge来合并分支
把bugFix分支合并到master,注意需要确定HEAD节点在master上。
git checkout master
git merge bugFix
4.1 merge和rebase的区别
git merge 操作合并分支会让两个分支的每一次提交都按照提交时间(并不是push时间)排序,并且会将两个分支的最新一次commit点进行合并成一个新的commit,最终的分支树呈现非整条线性直线的形式
git rebase操作实际上是将当前执行rebase分支的所有基于原分支提交点之后的commit打散成一个一个的patch,并重新生成一个新的commit hash值,再次基于原分支目前最新的commit点上进行提交,并不根据两个分支上实际的每次提交的时间点排序,rebase完成后,切到基分支进行合并另一个分支时也不会生成一个新的commit点,可以保持整个分支树的完美线性
5.cherry-pick的用法
将c3 c4 c7节点挑出来放到master分支下,如下两图所示
git cherry-pick c3 c4 c7
image.png image.png
6.reset在本地分支穿越时空
注意:虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦
比如:
git reset HEAD~1 原来指向的提交记录就跟从来没有提交过一样,但是仍然存在
git reset C2 移动分支。(C2可以是未来的,我们又回来啦)
7.revert来撤销远程的修改
git revert HEAD
或者直接
git revert C2(当前Head指向的hash值)
我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录 C2' 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的。
image.png
如果撤销了c2,还想撤销c1,他只是再将c1'接在c2’后即可。
下图先撤销了c2的修改,又撤销了c1的修改。如果这个时候上传我们的pushed分支,我们的远程分支就能正确的回到c0了。
image.png
8.怎么对以前提交的记录调整?
你之前在 newImage 分支上进行了一次提交,然后又基于它创建了 caption 分支,然后又提交了一次。
此时你想对的某个以前的提交记录进行一些小小的调整。比如设计师想修改一下 newImage 中图片的分辨率,尽管那个提交记录并不是最新的了。
image.png
比如我们可以用rebase -i来操作。
78$FJCH3J(28A_SA6R4W)SW.png
再比如,我们可以用cherry-pick来操作,方法多多。
git checkout master
git cherry-pick c2 (master和HEAD都指向c2')
git commit --amend (添加新的message后,master指向c2'')
git cherry-pick c3 (在c2''后面放c3)
image.png
9.怎么给提交设置tag?
分支很容易被人为移动,并且当有新的提交时,它也会移动。分支很容易被改变,大部分分支还只是临时的,并且还一直在变。有没有比分支更好的可以永远指向这些提交的方法呢?
将HEAD指向特定的节点并赋值tag
git tag v1 side~1
git tag v0 master~2
git tag v0 c1 (当然也可以直接通过hash值来确定锚点)
git checkout v1(我们也可以直接可以用tag来对HEAD定位)
10.describe帮你在提交历史中移动了多次以后找到方向
Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 git bisect(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。
image.png11.简单案例分析
11.1怎么只提交最后的一个记录?
来看一个在开发中经常会遇到的情况:我正在解决某个特别棘手的 Bug,为了便于调试而在代码中添加了一些调试命令并向控制台打印了一些信息。
这些调试和打印语句都在它们各自的提交记录里。最后我终于找到了造成这个 Bug 的根本原因,解决掉以后觉得沾沾自喜!
最后就差把 bugFix 分支里的工作合并回 master 分支了。你可以选择通过 fast-forward 快速合并到 master 分支上,但这样的话 master 分支就会包含我这些调试语句了。怎么只提交一个最后的bugFix呢?
git checkout master
git cherry-pick c4
或者
git rebase -i HEAD~3 (丢弃C2和C3)
git checkout master
git reset c4'
image.png
11.2多次rebase的使用
git rebase master bugFix (把bugFix放到master后面)
git rebase bugFix side
git rebase side another
git rebase another master(快速前进)
image.png
image.png
网友评论