Git 于 2005 年 4 月 7 日发布,至今已整整 20 年!为了庆祝这一里程碑,我整理了 20 个 Git 技巧,帮助你更高效地使用 Git!
这些技巧没有特定的顺序,从初学者到高级用户都能从中受益。希望它们对你有用!
Git 20 周年
0. 正确设置个人信息
首先,全局配置你的姓名和邮箱:
如果需要为不同的仓库使用不同的邮箱(例如工作邮箱和个人邮箱),可以按仓库配置:
额外提示:设置 GPG 签名以验证你的提交!签名可以让你的提交更加安全,因为它验证了提交是由你完成的。了解更多,可以参考我的书 Docker 和 Kubernetes 安全。
1. 使用 .mailmap 清理作者名称
Git 通过姓名和邮箱来跟踪作者。有时可能会有人误用不同的姓名或邮箱提交,这会让提交历史变得混乱。
在这种情况下,我们可以使用 Git 的 mailmap 功能来统一这些信息。在仓库根目录下创建一个名为 .mailmap 的文件,并添加如下内容:
现在,git shortlog 和其他命令将显示干净的作者列表。
2. 新功能始终使用分支
避免直接提交到 main 或 master 分支。为每个功能和修复创建小的主题分支:
我个人会使用 GitHub 用户名、问题编号和简短的描述来命名分支:
之后,你可以在提交信息中提到问题编号,GitHub 或 GitLab 会自动将其链接到问题。你还可以通过在提交信息中添加 Fixes #1234 来自动关闭问题:
这样提交后,读者可以通过查看问题来了解提交的上下文。
3. 跨分支 Cherry-Pick 提交
如果你想将一个分支的某个提交应用到另一个分支,可以使用 cherry-pick。首先,记下你要 cherry-pick 的提交哈希,可以通过 git log 查看并复制。
然后,切换到目标分支并执行:
该提交会被添加到新分支,你可以继续在该分支上工作。
4. 从另一个仓库 Cherry-Pick 提交
你甚至可以从另一个仓库 cherry-pick 提交:
完成后,可以移除该远程仓库。
5. 使用 git switch 和 git restore 替代 git checkout
checkout 在过去是一个被过度使用的命令,它被用于切换分支、恢复文件等。现在,我们有了 git switch 和 git restore 来使操作更清晰:
这些命令更加明确且用户友好!
6. 理解三种合并方式
- 三方合并:常规合并,会创建一个合并提交。
- 快进合并:当没有分叉时自动进行,即分支领先于基础分支。
- 压缩合并:在合并前将所有提交压缩为一个(适用于 PR)。
在 GitHub 和 GitLab 中,你可以配置 PR 的默认合并方式。
如果不确定使用哪种方式,建议使用压缩合并。它保持历史记录干净,更易于理解。
如果你是高手,可以将 rebase 和快进作为默认的合并方式。在合并前,将你的分支 rebase 到基础分支:
使用 rebase 和快进,你可以保持功能分支的历史记录干净。
7. 使用 git add -p 选择性暂存更改
与其暂存所有更改,不如选择性地暂存部分更改:
这种方式是交互式的且安全!
8. 安全撤销 Rebase
如果你在 rebase 过程中搞砸了,可以撤销它:
找到 rebase 开始前的提交,然后重置:
9. 使用交互式 Rebase 清理历史
使用交互式 rebase 来重新排序、压缩或编辑提交:
这是保持提交历史整洁的秘诀。使用交互式 rebase,你可以:
- 压缩提交
- 删除提交
- 重新排序提交
- 重写提交信息
10. 使用 --autosquash 加速 Rebase
当添加一个提交来修复之前的提交时,你可以将其标记为 "fixup" 或 "squash" 提交:
提交信息应以 fixup! 或 squash! 开头。这样可以在 rebase 时自动压缩它们。
在进行交互式 rebase 时,可以使用 --autosquash 选项:
Git 会自动将这些提交移动到正确的位置,并标记为压缩或修复。
11. 使用 --update-refs 处理分支链
如果你从一个分支创建了另一个分支,并 rebase 了基础分支,通常需要手动 rebase 所有依赖分支。但有了 --update-refs,你就不需要这么做了:
它会自动更新子分支。
12. 使用 git stash --keep-index
只需要暂存未暂存的更改?使用:
它会保留你已暂存的工作。
13. 创建空提交
有时你可能需要创建空提交来测试或触发 CI/CD 流水线。你可以这样做:
如果是为了创建部署标记,可以使用标签代替:
14. 清理未跟踪的文件
快速删除未跟踪的文件(小心使用!):
可以先使用 -n 进行试运行:
这个命令会显示将要删除的内容,而不会实际删除。
15. 同时获取所有远程仓库
如果你有多个远程仓库:
这对于 fork 非常有用。
16. 查看分支历史图
使用以下命令查看分支图:
你也可以为其创建别名:
然后你可以使用:
17. 添加别名节省时间
厌倦了输入冗长的 Git 命令?添加别名:
现在 git enforce 等同于 git push --force-with-lease,它用于推送更改,同时确保不会覆盖其他人的更改。
永远不要使用 git push --force!
18. 使用 git worktree 进行多分支工作
与其来回切换分支,你可以同时检出多个分支:
Worktree 非常适合同时测试多个分支,而无需来回切换。
19. 使用 git bisect 查找 Bug
如果你的代码中有 Bug,可以使用 git bisect 来找到引入 Bug 的提交。这是对提交历史的二分搜索。
然后,Git 会检出中间的提交。你可以测试每个提交并标记为好或坏:
例如,你可以运行测试来查看 Bug 是否存在。一旦找到引入 Bug 的提交,可以重置 bisect:
这将返回到原始分支。
20. 阅读之前的技巧
Git 20 岁生日快乐!🎉