02. Git 配置总踩坑?全局/仓库/SSH 密钥一次搞懂

「Git」系列已发布: 00. 改崩代码不敢回退?Git 版本控制 3 分钟救你狗命 | 01. Git 装完不会配?Windows/macOS/Linux 三端配置一次到位 | 02. Git 配置总踩坑?全局/仓库/SSH 密钥一次搞懂(本文) | 03. add/commit/push 别再死记:Git 工作流核心概念实操

全局配置、仓库级配置、SSH 密钥——Git 配置的层级与优先级常让人迷糊。本文一次讲清所有细节,从此配置不再靠试错。

确保已装好 Git(见第 01 篇)。不需要其他软件。

一、Git 的三层配置体系

Git 的配置分成三层,每层作用域和优先级都不一样。搞懂这个,后面配什么都不会乱。

层级 配置文件路径 作用范围 优先级 常用来干嘛
系统级 /etc/gitconfig(Linux/macOS);C:\ProgramData\Git\config(Windows) 本机所有用户 最低 企业统一策略、安全基线
全局级 ~/.gitconfig或~/.config/git/config 当前用户所有仓库 中 个人信息、编辑器偏好
仓库级 <repo>/.git/config 当前仓库 最高 仓库特有的远程地址、分支策略

同一个配置项在多个层级都设了的话,仓库级盖全局级,全局级盖系统级。Git 读配置"就近优先"——从仓库级开始,逐级往上找。

1.1 查看各层级配置


# 系统级

git config --system --list

# 全局级

git config --global --list

# 仓库级(要在 Git 仓库目录里跑)

git config --local --list

# 所有层级合并后的最终效果

git config --list

# 看每个配置项出自哪个文件

git config --list --show-origin

# 输出示例:

# file:/home/user/.gitconfig   user.name=Zhang San

# file:/home/user/.gitconfig   user.email=zhangsan@example.com

# file:.git/config             core.repositoryformatversion=0

# file:.git/config             remote.origin.url=git@gitlab.com:team/project.git

1.2 用户身份配置

提交之前必须设用户名和邮箱——Git 靠这个来标识每次提交是谁干的。


# 全局配(推荐,所有仓库默认用)

git config --global user.name "Zhang San"
git config --global user.email "zhangsan@example.com"

# 仓库级覆盖(公司项目用企业邮箱,个人项目用私人邮箱)

cd /path/to/work-project
git config --local user.name "Zhang San"
git config --local user.email "zhangsan@company.com"

1.2.1 多身份自动切换

同时维护个人和公司项目的人经常会头疼:这个仓库到底用了哪个邮箱?解决方案是用includeIf:


# 编辑 ~/.gitconfig,加以下内容

[includeIf "gitdir:~/work/"]
path = ~/.gitconfig-work
[includeIf "gitdir:~/personal/"]
path = ~/.gitconfig-personal

然后分别创建两个文件:


# ~/.gitconfig-work

[user]
name = Zhang San
email = zhangsan@company.com

# ~/.gitconfig-personal

[user]
name = san-zhang
email = san@gmail.com

搞定之后
,~/work/下的仓库自动用企业配置,~/personal/下自动切个人配置。不用每次 cd 进去再手动设了。

二、编辑器与 diff/merge 工具

2.1 默认编辑器


# VS Code

git config --global core.editor "code --wait"

# Vim

git config --global core.editor vim

# Sublime Text

git config --global core.editor "subl -n -w"

# macOS TextEdit(备用)

git config --global core.editor "open -W -n"

这个编辑器会在
git commit(不带-m)和git rebase -i时弹出来。

三、diff 和 merge 工具


# 可视化 diff 用 VS Code

git config --global diff.tool vscode
git config --global difftool.vscode.cmd "code --wait --diff \$LOCAL \$REMOTE"

# 可视化 merge 用 VS Code

git config --global merge.tool vscode
git config --global mergetool.vscode.cmd "code --wait --merge \$REMOTE \$LOCAL \$BASE \$MERGED"

# 实际使用

git difftool HEAD~3 HEAD   # 可视化看最近 3 次提交的差异
git mergetool              # 冲突时启动可视化合并

四、别名:建你自己的命令工具箱

别名是提升日常效率最快的手段。把常用命令映射成短别名,省掉大量重复输入。

4.1 基础别名


# 状态和切换

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit

# 日志

git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.lg10 "log --oneline --graph --decorate -10"
git config --global alias.ll "log --pretty=format:'%C(yellow)%h%Creset %C(cyan)%ad%Creset %s %C(green)(%an)%Creset' --date=short"

# diff

git config --global alias.d diff
git config --global alias.dc "diff --cached"
git config --global alias.ds "diff --stat"

4.2 稍微进阶一点的


# 看每个作者提交了多少次

git config --global alias.count "shortlog -sn"

# 撤销上一次提交,保留修改

git config --global alias.undo "reset --soft HEAD~1"

# 看还没合进当前分支的分支

git config --global alias.unmerged "branch --no-merged"

# 已合并的

git config --global alias.merged "branch --merged"

# 列出所有别名

git config --global alias.alias "config --get-regexp ^alias\."

# 当前分支名

git config --global alias.current "rev-parse --abbrev-ref HEAD"

4.3 带参数的外部命令

别名开头加!可以执行 Shell 命令:


# 删掉已合并到当前分支的本地分支(排除 main 和当前分支)

git config --global alias.clean-branches '!git branch --merged | grep -v "\*\|main\|master" | xargs -r git branch -d'

# 看看每个文件的行数贡献

git config --global alias.lines "!git ls-files | xargs wc -l"

# 拉取所有远程分支到本地

git config --global alias.fetch-all "!git branch -r | grep -v '\->' | while read remote; do git branch --track \"${remote#origin/}\" \"$remote\"; done && git fetch --all"

验证:

git alias

# 或

git config --global --get-regexp alias

五、换行符与编码:跨平台的隐形坑

换行符差异是跨平台协作里最常见的隐形问题。Windows 用 CRLF(\r\n),macOS/Linux 用 LF(\n)。

5.1 core.autocrlf

值 行为 适合谁
true 提交时 CRLF→LF,检出时 LF→CRLF Windows 开发者
input 提交时 CRLF→LF,检出时不转 macOS/Linux 开发者
false 完全不转 纯二进制项目或统一了换行符

# macOS/Linux

git config --global core.autocrlf input

# Windows

git config --global core.autocrlf true

5.2 .gitattributes 精细控制

如果需要更精确的控制,用.gitattributes文件:

# 所有文本文件统一换行符为 LF
* text=auto

# 特定文件类型
*.sh text eol=lf
*.bat text eol=crlf

# 二进制文件不做转换
*.png binary
*.jpg binary
*.pdf binary

5.3 编码


# 提交信息用 UTF-8

git config --global i18n.commitEncoding utf-8

# 日志输出用 UTF-8

git config --global i18n.logOutputEncoding utf-8

# 中文文件名别转义

git config --global core.quotepath false

六、凭据管理

HTTPS 方式推拉代码,每次输密码太烦了。配一下凭据管理:


# macOS — 系统钥匙串

git config --global credential.helper osxkeychain

# Linux — 缓存凭据(默认保留 15 分钟)

git config --global credential.helper cache

# Linux — 自定义超时(单位秒)

git config --global credential.helper 'cache --timeout=3600'

# Linux — 永久存储(明文,安全性较低)

git config --global credential.helper store

# Windows — Git Credential Manager(Git for Windows 自带)

git config --global credential.helper manager

七、性能相关


# 文件系统缓存(Windows 平台提升明显)

git config --global core.fscache true

# untracked 文件缓存(大型仓库建议开)

git config --global core.untrackedCache true

# 并行索引预加载

git config --global core.preloadindex true

# 增加 delta 压缩线程数(0 = 自动检测 CPU 核心数)

git config --global pack.threads 0

# 限制 delta 压缩内存(512MB)

git config --global pack.deltaCacheSize 512m

# 大文件压缩级别(1-9,低值更耗 CPU 但更快)

git config --global core.compression 1

八、日常管理

8.1 备份全局配置


cp ~/.gitconfig ~/.gitconfig.backup

# 提取关键配置项便于迁移

git config --global --list | grep -E "(user\.|core\.|alias\.)" > git-config-essentials.txt

8.2 团队统一配置

在项目里维护一份仓库级配置,纳入版本控制:


# 项目根目录下创建 .gitconfig-repo

# .gitconfig-repo

[pull]
rebase = true
[merge]
ff = only

# 引用

git config --local include.path ../.gitconfig-repo

8.3 配置审计


# 定期检查可能出问题的配置

git config --list | grep -E "(autocrlf|filemode|ignorecase)"

# 看某个配置项从哪来的、当前值是什么

git config --show-origin user.name

九、文章引用

📌 本文首发于微信公众号 【运维知识点滴】——专注运维实战干货,微信搜索“运维知识点滴”或扫下方二维码关注,更新不迷路。
📎 微信原文:02. Git 配置总踩坑?全局/仓库/SSH 密钥一次搞懂

微信公众号【运维知识点滴】 微信小程序【A5单据合并&大试卷拆分转A4打印】
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费
运维实战干货 · 关注追更 Word 转 PDF · 试卷/发票打印神器 · 免费

💡 小程序【A5单据合并&大试卷拆分转A4打印】是干嘛的? 一个 Word 转 PDF 的打印神器,专治“文档版式和打印机对不上”:

  • A3 试卷打不出来? 学校发的电子版试卷多是 A3,家用打印机只吃 A4——上传 Word 一键转换:可缩到一页 A4(页数不变),也可对半拆成两张 A4(1:1 原大、字更清晰),两种模式自选;
  • 版式不乱:真实渲染引擎原样转换、绝不重排内容,转出的 PDF 和原 Word 排版一致,公式/表格/图片不跑版;
  • 两张 A5 单据拼一张 A4:出租车票、火车票等报销凭证拼版后,一次打印、整齐粘贴;
  • 隐私省心:无需注册,转换结果留存 5 天、最多下载 5 次即自动删除,不留任何历史记录;
  • 微信扫码即用,免费、免安装,支持 doc / docx(≤50MB)。

上一篇:01. Git 装完不会配?Windows/macOS/Linux 三端配置一次到位 | 下一篇:03. add/commit/push 别再死记:Git 工作流核心概念实操