大多数开发者只使用Git的一小部分:clone、add、commit、push、pull、merge,偶尔使用rebase。解决生产工作流中实际问题的高级Git命令不太常见。以下是值得学习的命令。
git bisect:二分查找Bug
当你知道当前代码库中存在Bug,但三个月前不存在时,bisect让你通过提交历史进行二分查找,找到引入Bug的确切提交。用法:`git bisect start`、`git bisect bad`(当前提交有问题)、`git bisect good [commit-hash]`(已知的良好状态)。Git检出中间点提交;你测试Bug是否存在;`git bisect good`或`git bisect bad`;Git移动到下一个中间点。经过N次检查(好坏之间提交的log₂),bisect识别出确切的破坏性提交。如果你有自动化测试来检测Bug,`git bisect run ./test.sh`自动化整个过程——Git在每个中间点运行脚本,并自动确定好/坏。对于1,000个提交范围:10次手动检查,或用测试脚本完全自动化。对于大型代码库的回归调试非常有价值。
git reflog:安全网
reflog记录了HEAD的每一次移动,包括`git reset –hard`、`git rebase`或意外删除分支之后。如果你意外丢失了提交,`git reflog`显示HEAD位置的历史,让你恢复。用法:`git reflog`显示类似`abc1234 HEAD@{2}: reset: moving to HEAD~2`的条目。要恢复:`git reset –hard HEAD@{2}`或`git checkout -b recovery-branch HEAD@{2}`。Reflog条目默认在90天后过期。实际建议:在运行任何破坏性Git操作之前,记下当前HEAD哈希(`git log –oneline -1`)。如果出现问题,reflog会告诉你回路。
git worktree:多个工作副本
Git worktree创建链接到同一Git对象存储的额外工作副本。用例:你在复杂的功能分支中间,需要紧急检出main来修复Bug——不需要stash、切换分支并失去你的思维状态。使用worktree:`git worktree add ../project-hotfix main`在`../project-hotfix`创建指向main的第二个工作目录,而你的原始目录留在功能分支上。两者同时活动。清理:`git worktree remove ../project-hotfix`。现代CI系统使用worktree在同一机器上并行运行测试,而不进行完整的仓库克隆。
git log有用模式
`git log –oneline –graph –all –decorate`:最有用的git log调用——显示所有分支的紧凑ASCII艺术分支图。值得别名化。`git log -S “function_name”`:pickaxe搜索——查找添加或删除特定字符串的所有提交。当你想知道特定函数何时被引入或删除时使用。`git log –follow -p — path/to/file`:显示文件整个历史的所有更改,包括重命名。`git log main..feature-branch`:显示feature-branch中不在main中的提交。`git log –author=”name” –since=”2 weeks ago”`:按作者和时间范围过滤。`git show commit-hash:path/to/file`:显示文件在特定提交时的内容——不检出提交。对于在不切换分支的情况下提取文件的特定版本很有用。
git stash高级用法
`git stash push -m “descriptive message” — specific/file`:只stash特定文件(不是所有文件),带有描述性标签。`git stash list`:查看带消息的所有stash条目。`git stash show -p stash@{0}`:查看特定stash中的diff。`git stash branch new-branch-name stash@{0}`:从stash条目创建新分支——当你意识到在stash中途你应该在一个新分支上时很有用。`git stash drop stash@{0}`:删除特定stash而不应用它。



