实现上述目标一行命令足矣,可以使用 git checkout C3 命令就可以将HEAD命令指向C3提交上。git checkout HEAD^ 命令可以将HEAD指针向上移动一个距离,git checkout HEAD~3 则可以将HEAD向上移动三个距离。具体操作如下所示:
2、在提交树上移动分支
下方要完成的不单单是HEAD指针的移动,而是分支指针的移动,在Git上可以移动你所创建分支的指向,使其指向任意提交过的分支上。下方就来看一下如何在git上移动分支指针,下方左边是我们要完成的目标,右边是分支的初始化状态。需要做的事情如下:
将 bugFix 分支移动到C0上。
然后将master分支移动到C6上。
最后将HEAD分支上移。
需要操作的命令如下所示:
首先使用 git branch -f bugFix C0 命令将bugFix指向C0节点。(C0表示的是相关提交的哈希值)。
然后使用 git branch -f master C6 命令将master分支指向C6节点。
最后使用 git checkout HEAD^ 命令将分离的HEAD指针进行上移。
3、撤销操作
接下来我们来看一下撤销操作,同样左边是我们要完成的目标,右边是初始状态。从下方的目标中我们可以看出 local 分支的撤销操作是使用的 git reset 操作的, 因为是在本地来向上移动的,进行reset后是不可以push到远端的。而push分支使用的是revert操作,撤销了C2的提交后,再C2的基础上又生成了一个新的提交。reset 操作是不可以被push到远端的,而revert则可以,稍后会进行实验。下方会有具体的操作。
下方就是我们为了完成目标而又的具体的操作:
首先在 local 分支上执行git reset HEAD^1 或者 git reset HEAD C1 操作来撤销本地的C3操作。
然后我们再通过 git checkout pushed操作切换到 pushed 分支上,然后执行 git revert HEAD^1 操作,撤销C2的提交。
如果你reset某个提交,想在将分支号移动到之前的提交上,可以使用上面的 git branch -f 操作,将相应的分支移到相应的提交上。下方是将 local 分支又移动回了C3, 如下所示。
接下来我来看一下对 reset 后的分支进行push, 以及对 revert 分支后进行push。
首先在local分支上执行reset操作,然后进行push会提示本地仓库和远程仓库产生了分歧,先git pull 或者 git pull --rebase。
而在pushed分支上的revert操作就不会有这样的提示,因为revert是在原来的分支下方产生了一个新的提交,和正常提交一样对待,所以是可以push的。
下方我们再做个尝试,在一个分支上进行了reset , 然后在reset后的分支上做了一些提交。最后我们将这些提交进行push,然后看一下具体的效果。
首先我们对clone到本地的local分支进行了reset操作,操作后在新的分支上进行两次commit。
然后我们进行push , 会提示先pull或者pull --rebase , 然后在进行push.
下方先执行了 git pull 操作,执行pull操作后,就是将 o/local 分支和 local分支进行合并,合并后就可以进行push了。这样一来,我们之前reset操作就不起什么作用了。因为 pull 操作后进行了merge, 就等效于在C3上直接进行commit。