写在前面

最近写代码的过程中发现自己对Git的使用仅限于cloneaddcommit之流,对于需要重构或者需要修改BUG的部分没有很好地用到Git的分支进行管理,故在之前学习git分支中学了一下,在此记录一下。<由于时间有限还没学完,这里仅解释其中一部分内容,后续补充>

基础篇

Commit

根据当前目录中的文件内容与上一个版本中的文件内容进行对比,差异化地添加文件。当执行此命令时HEAD会跟随当前分支追加节点,使其指向其父节点。
git commit xxx:提交暂存区中的内容

Branch

分支即指向某个提交的记录,多分支协同工作在实际开发中是十分有用的(圣经:早用分支,多用分支)。对于分支,可以将其理解为在当前节点及其父节点的基础上更改。
git checkout <name>:切换到名为name的分支上
git checkout -b <new-branch-name>:创建新分支并切换过去

Merge

对于多个分支负责不同功能,应有支持将多个分支合并在一起的操作,merge便可完成这种事。
git merge <branch-name>:将当前分支与名称为的分支合并到当前分支上

根据理论,假设上图为当前分支结构,此时如果键入命令git merge bugFix会变成什么样?

Rebase

虽然同merge一样都是合并分支作用,但rebase的合并是更加“线性”的。
git rebase <branch-name>:将名为的分支合并到当前分支上,但当前分支随之作为叶子节点指向节点

对于上图,如果使用git rebase main会发生什么效果?

注:此时c3仍然存在,只是不在暂存区。

高级篇

分离HEAD

HEAD可以抽象为git分支上的一个指针头,其总是指向当前分支的最近一次提交记录。一般来说HEAD通常指向改变分支名,但分离HEAD就是为了使得HEAD指向某个具体的提交记录而不是分支名。

在Git中查询HEAD指向:cat .git/HEAD

相对引用^

当需要让HEAD指向HEAD的父节点时,通过查看log执行哈希值的方式是不够方便的,因此可以使用相对引用来向父节点寻找(可以从一个易于记忆的地方比如bugFix分支或HEAD)。
git checkout <name>^:在name指定的节点处向上一步找其父节点(两个^即向上两步)
git checkout <name>~<number>:在name指定的节点上向上找number个父节点

相对引用~

见相对引用

撤销RESET、REVERT

git reset撤销变更是通过“回退”的方式来做变更。

假设对于上图git reset HEAD^会发生什么?

结果是分支节点向上移动,此时C2并没有丢失,只是未放在暂存区中。
git revertgit reset则相反,其通过在需要撤销更改的节点下增加一个引入了更改的节点,该更改正是用来撤销记录的,可以用来更改后推送到远程仓库。

对于上图,git revert HEAD后会发生什么呢?

新增加c2’节点用来记录更改后(撤销)的样子。

注:注意git resetgit revert的使用,reset对应需要撤销的节点,revert则对应需要撤销的节点的子节点;两者分别用于本地和远程。