Git进阶:变基、挑选和二分查找

大多数开发者90%的时间使用Git功能的10%。高级命令——变基、挑选和二分查找——解决在协作代码库中定期出现的问题,避免使用它们会产生混乱的合并历史和缓慢的调试过程,使得仓库随着时间推移越来越难以使用。

变基(Rebase)

变基的作用:将你分支上的提交提取出来,在另一个分支之上重新应用,产生没有合并提交的线性历史。比较:`git merge main`创建记录两个父节点的合并提交;`git rebase main`将你的分支提交移动到从main尖端开始,重写它们的SHA哈希。何时变基:在将特性分支合并到main之前,以便在不创建合并提交的情况下合并main的更改;在代码审查之前清理杂乱的本地分支历史。交互式变基(`git rebase -i HEAD~N`):Git中最强大的历史编辑工具。打开一个编辑器,列出最后N个提交,每个都有一个操作词:
– `pick` — 保持提交不变
– `reword` — 保持提交但编辑消息
– `edit` — 在此处暂停以修改提交
– `squash` — 将此提交与前一个合并(保留两个消息)
– `fixup` — 与前一个合并但丢弃此提交的消息
– `drop` — 完全删除此提交

常见用途:在合并之前将8个进行中的提交压缩成1个干净的提交。黄金法则:永远不要变基已经推送到共享分支的提交。变基重写历史;如果其他人已经基于原始提交进行了工作,他们将会有冲突。只变基本地的或你完全拥有的分支上的提交。变基后强制推送:在变基已经推送的分支后,你必须强制推送(`git push –force-with-lease`)。使用`–force-with-lease`而不是`–force`——如果自你上次获取以来有其他人推送到了分支,它会失败,防止意外的历史丢失。

挑选和二分查找

挑选(`git cherry-pick `):将仓库中任何地方的特定提交应用到你的当前分支。创建具有相同更改但新SHA的新提交。何时使用:将错误修复从main向后移植到发布分支;从同事的分支中提取特定功能提交而不合并所有内容。多个提交:`git cherry-pick A..B`选取A和B之间的所有提交(不含A,含B)。使用`-n`标志:应用更改而不提交,允许你首先修改它们。冲突:挑选冲突的解决方式与合并冲突相同——编辑文件,`git add`,然后`git cherry-pick –continue`。二分查找(`git bisect`):对提交历史进行二分搜索,以找到引入错误的提交。对于在大型代码库中调试回归问题至关重要,在那里失败的提交并不明显。工作流程:
“`bash
git bisect start
git bisect bad # 当前提交是坏的
git bisect good v1.2.0 # 这个标记的版本是可以的

# Git检出中点提交
# 测试它,然后:
git bisect good # 或者:git bisect bad
# Git将范围减半并检出下一个中点
# 重复直到Git识别出第一个坏提交
git bisect reset # 返回原始HEAD
“`
二分查找也可以自动化:`git bisect run ./test.sh`在每个候选提交上运行脚本——退出代码0表示好,非零表示坏。对于1000个提交的范围,二分查找在约10步内找到罪魁祸首(log₂1000≈10)。Reflog(`git reflog`):Git的安全网——记录HEAD所在的每个位置,包括变基、重置和检出。如果你意外地通过硬重置或坏的变基丢失了提交,`git reflog`显示操作之前的SHA,`git checkout`或`git reset`可以恢复它。

上一篇 Git Advanced: Rebase, Cherry-Pick, and Bisect
下一篇 Athens: Acropolis, Ancient Agora, and the Modern City