[博客翻译]核心Git开发人员如何配置Git


原文地址:https://blog.gitbutler.com/how-git-core-devs-configure-git/


核心Git开发者如何配置Git

几天前,由Scott Chacon撰写了一篇关于Git核心开发人员如何配置他们的Git的文章。这篇文章讨论了一些大多数人可能不知道的Git配置设置,并提出了一些建议,认为这些设置应该成为默认值。接下来,我会通过这篇文章,为你解析一些可能并不为大众所熟知但非常实用的Git配置设置。

TLDR:快速获取设置

如果你对rerere值或其他历史故事不感兴趣,只想直接获取可以加入到你的~/.gitconfig文件中的配置,请看以下内容:

# 显著提升Git体验
[column]
    ui = auto
[branch]
    sort = -committerdate
[tag]
    sort = version:refname
[init]
    defaultBranch = main
[diff]
    algorithm = histogram
    colorMoved = plain
    mnemonicPrefix = true
    renames = true
[push]
    default = simple
    autoSetupRemote = true
    followTags = true
[fetch]
    prune = true
    pruneTags = true
    all = true
# 为什么不用呢?
[help]
    autocorrect = prompt
[commit]
    verbose = true
[rerere]
    enabled = true
    autoupdate = true
[core]
    excludesfile = ~/.gitignore
[rebase]
    autoSquash = true
    autoStash = true
    updateRefs = true

Git核心开发者如何配置他们的Git?

在深入探讨之前,我们可以先问一个问题:连核心Git开发人员是否都认为某些默认值需要调整?这个问题曾在Git邮件列表上引发了一场有趣的讨论。

Felipe Contreras曾发起一个名为“春季清理”的挑战,邀请Git核心团队成员删除他们所有的配置选项和别名,尝试使用完全未经过修改的Git。他们需要关注哪些设置是真正需要更改的,并将最重要的配置变更分享给社区。最终,参与者们达成了几项几乎一致的建议:

merge.conflictstyle = zdiff3
rebase.autosquash = true
rebase.autostash = true 
commit.verbose = true
diff.colorMoved = true
diff.algorithm = histogram
grep.patternType = perl
feature.experimental = true
branch.sort = committerdate

虽然这些设置在几年内并没有成为新的默认值,但可以看出,很多Git开发者依赖它们来更高效地工作。

那么,让我们来逐一了解这些配置的实际作用吧!


第一部分:明显让Git变得更好

这一组设置显著改善了Git的基本体验,几乎没有任何缺点。

列出分支

默认情况下,Git会以字母顺序列出分支,但这往往不是最有用的方式。通过以下两个设置,可以让列表按照最近提交时间排序,并以多列形式显示:

git config --global column.ui auto
git config --global branch.sort -committerdate

这样可以让你更容易找到最近活动过的分支。

列出标签

类似地,默认按字母顺序排列的标签列表也可能不太友好。设置如下可以以版本号排序:

git config --global tag.sort version:refname

这种方式能够更好地反映标签的实际意义。

默认分支名称

为了避免每次初始化仓库时都遇到分支命名问题,可以通过以下命令设定默认分支名称:

git config --global init.defaultBranch main

无论你偏好main还是master,只要选择适合自己的就好。

更智能的差异比较

默认的差异算法是1986年提出的Myers算法。虽然可靠,但现代的histogram算法更为智能:

git config --global diff.algorithm histogram

配合以下设置还可以增强可读性:

git config --global diff.colorMoved plain
git config --global diff.mnemonicPrefix true
git config --global diff.renames true

改进推送体验

启用以下三个推送设置,可以避免许多常见问题:

git config --global push.default simple
git config --global push.autoSetupRemote true
git config --global push.followTags true

改进拉取操作

通过设置自动修剪远程分支和标签,确保本地引用与远程保持同步:

git config --global fetch.prune true
git config --global fetch.pruneTags true
git config --global fetch.all true

第二部分:为什么不试试?

这些设置通常无害,偶尔还能带来帮助。

自动补全提示

启用自动补全功能可以减少拼写错误:

git config --global help.autocorrect prompt

提交时显示差异

在编辑提交信息时显示详细差异,有助于提供更多的上下文:

git config --global commit.verbose true

记录冲突解决方案

如果经常遇到冲突,可以启用rerere记录解决方案并自动应用:

git config --global rerere.enabled true
git config --global rerere.autoupdate true

全局忽略文件

创建全局忽略文件,避免重复配置:

git config --global core.excludesfile ~/.gitignore

更友好的变基体验

启用以下设置可以优化变基流程:

git config --global rebase.autoSquash true
git config --global rebase.autoStash true
git config --global rebase.updateRefs true

第三部分:各取所需

合并冲突样式

启用zdiff3合并冲突样式,可以显示冲突前的基础代码,但可能会增加复杂度:

git config --global merge.conflictstyle zdiff3

拉取时默认使用变基

设置pull.rebase=true后,拉取时会默认执行变基而非合并:

git config --global pull.rebase true

文件系统监控加速

对于大型仓库,启用文件系统监控可以显著加快git status的速度:

git config --global core.fsmonitor true
git config --global core.untrackedCache true