Git 20 周年的 20 个 Git 技巧

开发 前端
Git 于 2005 年 4 月 7 日发布,至今已整整 20 年!为了庆祝这一里程碑,我整理了 20 个 Git 技巧,帮助你更高效地使用 Git!

Git 于 2005 年 4 月 7 日发布,至今已整整 20 年!为了庆祝这一里程碑,我整理了 20 个 Git 技巧,帮助你更高效地使用 Git!

这些技巧没有特定的顺序,从初学者到高级用户都能从中受益。希望它们对你有用!

Git 20 周年

0. 正确设置个人信息

首先,全局配置你的姓名和邮箱:

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
  • 1.
  • 2.

如果需要为不同的仓库使用不同的邮箱(例如工作邮箱和个人邮箱),可以按仓库配置:

git config user.email "work.email@company.com"
  • 1.

额外提示:设置 GPG 签名以验证你的提交!签名可以让你的提交更加安全,因为它验证了提交是由你完成的。了解更多,可以参考我的书 Docker 和 Kubernetes 安全。

1. 使用 .mailmap 清理作者名称

Git 通过姓名和邮箱来跟踪作者。有时可能会有人误用不同的姓名或邮箱提交,这会让提交历史变得混乱。

在这种情况下,我们可以使用 Git 的 mailmap 功能来统一这些信息。在仓库根目录下创建一个名为 .mailmap 的文件,并添加如下内容:

Proper Name <proper@example.com> <alias@example.com>
  • 1.

现在,git shortlog 和其他命令将显示干净的作者列表。

2. 新功能始终使用分支

避免直接提交到 main 或 master 分支。为每个功能和修复创建小的主题分支:

git switch -c feature/new-login
  • 1.

我个人会使用 GitHub 用户名、问题编号和简短的描述来命名分支:

git switch -c aerabi/1234-new-login
  • 1.

之后,你可以在提交信息中提到问题编号,GitHub 或 GitLab 会自动将其链接到问题。你还可以通过在提交信息中添加 Fixes #1234 来自动关闭问题:

Add new login page

Closes #1234
  • 1.
  • 2.
  • 3.

这样提交后,读者可以通过查看问题来了解提交的上下文。

3. 跨分支 Cherry-Pick 提交

如果你想将一个分支的某个提交应用到另一个分支,可以使用 cherry-pick。首先,记下你要 cherry-pick 的提交哈希,可以通过 git log 查看并复制。

然后,切换到目标分支并执行:

git cherry-pick <commit-hash>
  • 1.

该提交会被添加到新分支,你可以继续在该分支上工作。

4. 从另一个仓库 Cherry-Pick 提交

你甚至可以从另一个仓库 cherry-pick 提交:

git remote add other-repo <repo-url>
git fetch other-repo
git cherry-pick <commit-hash>
  • 1.
  • 2.
  • 3.

完成后,可以移除该远程仓库。

5. 使用 git switch 和 git restore 替代 git checkout

checkout 在过去是一个被过度使用的命令,它被用于切换分支、恢复文件等。现在,我们有了 git switch 和 git restore 来使操作更清晰:

git switch branch-name         # 切换分支
git switch -c new-branch       # 创建并切换到新分支
git restore file.txt           # 丢弃文件的更改
git restore --staged file.txt  # 取消暂存文件
  • 1.
  • 2.
  • 3.
  • 4.

这些命令更加明确且用户友好!

6. 理解三种合并方式

  • 三方合并:常规合并,会创建一个合并提交。
  • 快进合并:当没有分叉时自动进行,即分支领先于基础分支。
  • 压缩合并:在合并前将所有提交压缩为一个(适用于 PR)。

在 GitHub 和 GitLab 中,你可以配置 PR 的默认合并方式。

如果不确定使用哪种方式,建议使用压缩合并。它保持历史记录干净,更易于理解。

如果你是高手,可以将 rebase 和快进作为默认的合并方式。在合并前,将你的分支 rebase 到基础分支:

git pull --rebase origin master
  • 1.

使用 rebase 和快进,你可以保持功能分支的历史记录干净。

7. 使用 git add -p 选择性暂存更改

与其暂存所有更改,不如选择性地暂存部分更改:

git add -p
  • 1.

这种方式是交互式的且安全!

8. 安全撤销 Rebase

如果你在 rebase 过程中搞砸了,可以撤销它:

git reflog
  • 1.

找到 rebase 开始前的提交,然后重置:

git reset --hard <commit-hash>
  • 1.

9. 使用交互式 Rebase 清理历史

使用交互式 rebase 来重新排序、压缩或编辑提交:

git rebase -i HEAD~5
  • 1.

这是保持提交历史整洁的秘诀。使用交互式 rebase,你可以:

  • 压缩提交
  • 删除提交
  • 重新排序提交
  • 重写提交信息

10. 使用 --autosquash 加速 Rebase

当添加一个提交来修复之前的提交时,你可以将其标记为 "fixup" 或 "squash" 提交:

git commit --fixup <commit-hash>
  • 1.

提交信息应以 fixup! 或 squash! 开头。这样可以在 rebase 时自动压缩它们。

在进行交互式 rebase 时,可以使用 --autosquash 选项:

git rebase -i --autosquash
  • 1.

Git 会自动将这些提交移动到正确的位置,并标记为压缩或修复。

11. 使用 --update-refs 处理分支链

如果你从一个分支创建了另一个分支,并 rebase 了基础分支,通常需要手动 rebase 所有依赖分支。但有了 --update-refs,你就不需要这么做了:

git rebase --update-refs
  • 1.

它会自动更新子分支。

12. 使用 git stash --keep-index

只需要暂存未暂存的更改?使用:

git stash push --keep-index
  • 1.

它会保留你已暂存的工作。

13. 创建空提交

有时你可能需要创建空提交来测试或触发 CI/CD 流水线。你可以这样做:

git commit --allow-empty -m "Trigger deployment"
  • 1.

如果是为了创建部署标记,可以使用标签代替:

git tag -a v1.0 -m "Deployment marker for version 1.0"
  • 1.

14. 清理未跟踪的文件

快速删除未跟踪的文件(小心使用!):

git clean -fd
  • 1.

可以先使用 -n 进行试运行:

git clean -fdn
  • 1.

这个命令会显示将要删除的内容,而不会实际删除。

15. 同时获取所有远程仓库

如果你有多个远程仓库:

git fetch --all
  • 1.

这对于 fork 非常有用。

16. 查看分支历史图

使用以下命令查看分支图:

git log --oneline --graph --all --decorate
  • 1.

你也可以为其创建别名:

git config --global alias.graph "log --oneline --graph --all --decorate"
  • 1.

然后你可以使用:

git graph
  • 1.

17. 添加别名节省时间

厌倦了输入冗长的 Git 命令?添加别名:

git config --global alias.enforce "push --force-with-lease"
  • 1.

现在 git enforce 等同于 git push --force-with-lease,它用于推送更改,同时确保不会覆盖其他人的更改。

永远不要使用 git push --force!

18. 使用 git worktree 进行多分支工作

与其来回切换分支,你可以同时检出多个分支:

git worktree add ../branch-folder branch-name
  • 1.

Worktree 非常适合同时测试多个分支,而无需来回切换。

19. 使用 git bisect 查找 Bug

如果你的代码中有 Bug,可以使用 git bisect 来找到引入 Bug 的提交。这是对提交历史的二分搜索。

git bisect start
git bisect bad # 当前提交是坏的
git bisect good <commit-hash> # 最后一个已知的好提交
  • 1.
  • 2.
  • 3.

然后,Git 会检出中间的提交。你可以测试每个提交并标记为好或坏:

git bisect good # 如果提交是好的
git bisect bad # 如果提交是坏的
  • 1.
  • 2.

例如,你可以运行测试来查看 Bug 是否存在。一旦找到引入 Bug 的提交,可以重置 bisect:

git bisect reset
  • 1.

这将返回到原始分支。

20. 阅读之前的技巧

Git 20 岁生日快乐!🎉

责任编辑:武晓燕 来源: 前端小石匠
相关推荐

2025-02-28 08:30:00

Git开发命令

2024-10-28 16:06:50

2020-12-09 11:52:28

Python字符串代码

2023-05-24 16:39:30

CSS技巧开发

2021-01-31 23:56:49

JavaScript开发代码

2018-05-04 09:14:09

Git技巧shell命令

2018-12-07 10:30:50

盘点CSS前端

2023-01-17 07:45:09

2021-04-20 20:36:14

Git家目录Linux

2020-07-25 20:01:45

CSS前端

2023-10-08 13:59:56

Git开发

2018-04-15 15:43:46

Git技巧命令

2021-06-17 07:45:35

Javascript 技巧效率

2020-07-23 07:27:50

编程学习技术

2025-04-09 08:50:00

Linus软件开发

2020-08-25 23:06:33

开发技能代码

2012-03-19 09:25:41

SUSE

2022-12-06 17:07:40

2021-07-29 11:30:31

GitLinux命令

2017-07-18 09:00:59

GitGitHub移动应用
点赞
收藏

51CTO技术栈公众号