Git branch
Git 的分支非常轻量。只是简单地指向某个提交纪录
git checkout -b bugFix
创建一个新的分支并切换到新分支
Git merge
新建一个分支,在其上开发某个新功能,开发完成后再合并回主线

image.png
git checkout -b bugFix
git commit -m 'c2'
新建并切换到新分支上,且 提交 一次
git checkout main
git commit -m 'c3'
切换回 并行分支,且 提交 一次
git merge bugFix
把 bugFix 分支合并到 main 分支
Git Rebase
第二种合并分支的方法是 git rebase。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去
Rebase 的优势就是可以创造更线性的提交历史

image.png
git checkout -b bugFix
git commit -m 'c2'
新建并切换到 新 分支上,且 提交 一次
git checkout main
git commit -m 'c3'
切换回另一并行分支,且提交一次
git checkout bugFix
git rebase main
再次切换到 新 分支,rebase 到 另一并行分支
HEAD~<num>

image.png
git checkout '哈希' // 改变 HEAD 指向
git checkout HEAD^ // 相对引用(^)
使用 ^ 向上移动 1 个提交记录
使用 ~<num> 向上移动多个提交记录,如 ~3
git branch -f <分支> HEAD~<num>
将 分支 强制指向 HEAD 的第 <num> 级父提交
git branch -f main c6
git branch -f bugFix c0
git checkout HEAD~1
想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向。但是该程序不支持这两个命令)
git reset git revert

image.png
git reset
在reset后,C2 所做的变更还在,但是处于未加入暂存区状态,且对 远程分支 无效
git revert
新提交记录 C2' 引入了更改,这些更改刚好是用来撤销 C2 这个提交的,也就是说 C2' 的状态与 C1 是相同的

image.png
git reset HEAD~1
撤销本地 local 分支 的最近一次提交
git checkout pushed
切换 远程分支 pushed
git revert HEAD
撤销远程 pushed 分支的最近一次提交
git cherry-pick <提交号>

image.png
git cherry-pick c3 c4 c7
rebase 交互式
交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i

image.png
git rebase -i HEAD~4
'pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
--onto的意思是要将该指定的提交复制到哪个分支上'
rebase 界面能做3件事:
调整提交记录的顺序
删除你不想要的提交(通过 pick 来完成)
合并提交,允许把多个提交记录合并成一个
提交技巧

image.png
git rebase -i HEAD~2 // 交换C2和C3的位置
git commit --amend // 当前结点的父结点再分出一个修改后的子结点
git rebase -i HEAD~2 // 调回顺序
git checkout main // 将当前分支切回 主分支
git rebase <合并分支>
提交技巧 git cherry-pick

image.png
git checkout main // 切换到主分支
git cherry-pick newImage // 将C2接到C1后面
git commit --amend // 创造新结点C2''
git cherry-pick caption // 将C3加至C2''后面
git tag <标签名> <提交点>

image.png
git tag v0 c1 // 给c1 加上标签名
git checkout c2 // 切换指向到 c2
git tag v1 // c2 加上标签名 第二参数不写默认当前指向
Git Describe

image.png
标签在代码库中起着“锚点”的作用,git describe用来描述离你最近的锚点
git describe <ref> // 任何能被 Git 识别成提交记录的引用,默认为当前 <HEAD>
输出的结果是这样的:
<tag>_<numCommits>_g<hash>
tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
当 ref 提交记录上有某个标签时,则只输出标签名称