Learn Git Branching
写在前面:
最近写代码的过程中发现自己对Git的使用仅限于clone
、add
、commit
之流,对于需要重构或者需要修改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 revert
与git reset
则相反,其通过在需要撤销更改的节点下增加一个引入了更改的节点,该更改正是用来撤销记录的,可以用来更改后推送到远程仓库。

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

新增加c2’节点用来记录更改后(撤销)的样子。
注:注意
git reset
和git revert
的使用,reset对应需要撤销的节点,revert则对应需要撤销的节点的子节点;两者分别用于本地和远程。