Learning Git Branching
基础篇
1.git commit:提交代码记录(把差异作为一个提交记录)
可以把提交记录看作是项目的快照。
2.git branch:创建分支
git branch newImage:创建一个到名为 newImage 的分支。
git checkout branch-name:切换分支
git checkout -b new-branch-name:创建一个新的分支同时切换到新创建的分支
3.git merge:合并分支
git merge <待合并分支>:注意如果当前在main分支上,要想合并other分支,则待合并分支为other
4.git rebase:Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
git rebase main:带星号的表示为当前所在分支,rebase效果如下(rebase英文意思也是换基,rebase后面的main即为基,相当于当前所在的bugFix分支移动到以main为基的线性分支上了)
注意,提交记录 C3 依然存在(树上那个半透明的节点),而 C3’ 是我们 Rebase 到 main 分支上的 C3 的副本。
现在我们切换到了 main 上(git checkout main),把它 rebase 到 bugFix 分支上(git rebase bugFix)
由于 bugFix 继承自 main,所以 Git 只是简单的把 main 分支的引用向前移动了一下而已。
我们可以发现分开的不同分支rebase与在同一条线性上的rebase是不同的,一个是复制提交记录,一个只是引用向前移动。
高级篇
5.head:HEAD 是一个对当前所在分支的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。
HEAD 总是指向当前分支上最近一次提交记录。
head除了常见的指向最近的一次提交记录,我们也可以让他指向之前的提交记录,具体来说就是使用 git check <记录哈希值>
(只需要提供记录哈希值中能够唯一标识提交记录的前几个字符即可)
备注:git log可以查看提交记录的哈希值
6.相对引用:^ ~
1)使用 ^ 向上移动 1 个提交记录(注意可多次使用 main^^ 是 main 的往前2个 parent 节点)
git checkout main^:切换到 main 的 parent 节点
2)使用 ~num
向上移动多个提交记录,如 ~3
,不跟数字时与 ^ 相同,向上移动一次
3)也可以将 HEAD 作为相对引用的参照:git checkout HEAD^ (head需要大写)
7.强制修改分支位置:可以直接使用 -f 选项让分支指向另一个提交
git branch -f main HEAD~3:将 main 分支强制指向 HEAD 的第 3 级 parent 提交
注意:分支与提交记录是不同的,分支默认指向最近的提交记录,但是可以强制修改分支位置
8.撤销变更
git reset:通过把分支记录回退几个提交记录来实现撤销改动(即改写历史)
与前述 git checkout 后接参数一致,例如 git reset <记录哈希值>、git reset HEAD^(撤销到上一记录)
注:“改写历史”的方法对大家一起使用的远程分支无效,为了撤销更改并分享给别人,我们需要使用git rever
git revert:通过引入新提交来达到撤销目的
git revert HEAD(撤销当前记录)【注意与git reset HEAD^的不同】
新提交记录 C2’ 引入了更改 —— 这些更改刚好是用来撤销 C2 这个提交的
Learn Git Branching