1.提交代码
git commit 每一次的提交,其实都相当于在你的代码修改进程中将某一刻记录了下来,并且它只基于自己的父提交记录做一次差异记录:如下为一个git commit过程,当然这只是在一个分支上,但事实上无论几个分支都是这样,commit并没有改变整套的代码,只是将某个时刻记录了下来。(c0,c1,c2,c3都是commit记录)
image.png
2.新建分支
git branch 切换分支,它只是单纯的指向某个提交记录(commit),其实切换一个新的分支就是相当于想基于这个提交以及它所有的父提交进行新的工作:如下为切换一个分支,并且进行一个新的commit过程
//首先基于master创建一个newImage并切换至新分支
git checkout -b newImage
//然后进行一次commit
git commit
image.png
3.合并分支
git merge 合并分支,它会将某个分支的所有提交记录合并到当前分支,也就意味着被合并的分支将有两个父提交记录
image.png
//当前在master
git merge bugFix;
image.png
现在master分支的父级节点提交记录有两个c2和c3;
4.合并分支
git rebase ,它是将一系列的提交记录“复制”下来,然后一个个“粘贴”到当前分支,效果如下
image.png
//当前是在bugFix分支
git rebase master
image.png
//现在我们得到了一个更加线性的提交记录,当然c3那个commit还在,只不过现在相当于复制了一个c3的记录给c2,接下来可以更新下master就可以了
git checkout master
git rebase bugFix
image.png
由于 bugFix 继承自 master,所以 Git 只是简单的把 master 分支的引用向前移动了一下而已。个人感觉相较于merge就是更加线性了,不存在一个commit有两个父节点commit记录;
rebase意思是回扣,当前分支bugFix,执行git rebase master,其实就是相当于把当前的代码回扣在master上,只不过master还得在更新一次,就达到如上图效果了;
5.改变HEAD位置
HEAD默认指向最新的commit所处的分支
//比如当前在bugFix分支,执行:
git checkout master^
//就会将HEAD指向在master的父节点commit处,而不是某个分支
^是向上一个父节点的意思,~4:就是向上移动4次,指向父节点commit处;
6.撤销变更
git reset
//相当于修改历史,但是被回退的commit其实还在,只是没有在暂存区了(适用于本地分支,不和其他分支进行交互)
git revert
//相当于在当前commit位置重新加载一个新的commit,当然可以用HEAD来控制回退到哪个位置(适用于远端分支的合并)