如何克服解决Git冲突的恐惧症?(Git高级篇)

2,644 阅读3分钟

HEAD

HEAD是一个对当前检出记录的符号引用,也就是指向你正在其基础上进行工作的提交记录。

HEAD总是指向当前分支上最近一次提交记录。大多数修改提交树的Git命令都是从改变HEAD的指向开始的。

我们可以通过下面这张图来理解:

HEAD->master->C1,HEAD指向master, master指向C1

HEAD通常情况下是指向分支名的(如bugFix)。在你提交时,改变了 bugFix的状态,这一变化通过HEAD变得可见。

如果想看HEAD指向,可以通过cat .git/HEAD查看,如果HEAD指向的是一个引用,还可以用git symbolic-ref HEAD查看它的指向。

分离HEAD

分离的HEAD就是让其指向了某个具体的提交记录而不是分支名。

当我们执行git checkout C4命令时,效果如下gif图所示:

使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算。

相对引用

相对引用非常给力,这里我介绍两个简单的用法:

  • 使用^向上移动1个提交记录
  • 使用~<num>向上移动多个提交记录,如~3

相对引用(^)

把操作符(^)加在引用名称的后面,表示让Git寻找指定提交记录的父提交。

所以,master^相当于“master的父节点”,master^^是master的第二个父节点。

执行git checkout master^,具体效果如下gif所示:

相对引用(~)

如果你想在提交树中向上移动很多步的话,敲那么多^貌似也挺烦人的,Git当然也考虑到了这一点,于是又引入了操作符~

该操作符后面可以跟一个数字(可选,不跟数字时与^ 相同,向上移动一次),指定向上移动多少次。

执行git checkout master~2,具体效果如下gif所示:

撤销变更

在Git里撤销变更的方法很多。和提交一样,撤销变更由底层部分(暂存区的独立文件或者片段)和上层部分(变更到底是通过哪种方式被撤销的)组成。我们这个应用主要关注的是后者。

主要有两种方法用来撤销变更:

  • git reset
  • git revert。

接下来咱们逐个进行讲解:

git reset

git reset通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset向上移动分支,原来指向的提交记录就跟从来没有提交过一样。

虽然在你的本地分支中使用git reset很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的哦!

执行git reset master^,具体效果如下gif所示:

git revert

为了撤销更改并分享给别人,我们需要使用git revert。

执行git revert master^,具体效果如下gif所示:

奇怪!在我们要撤销的提交记录后面居然多了一个新提交!这是因为新提交记录C2'引入了更改,这些更改刚好是用来撤销C2这个提交的。也就是说C2'的状态与C1是相同的。

revert之后就可以把你的更改推送到远程仓库与别人分享啦。

相信大家对git的高级篇已经基本掌握,不妨在自己的git环境中动手试一试吧~

微信公众号:码上论剑 请关注我的个人技术微信公众号,订阅更多内容