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则对应需要撤销的节点的子节点;两者分别用于本地和远程。



