自定义Git行为:配置、别名与关键文件
通过有用的配置设置、清晰的别名以及.gitignore和.gitattributes等关键文件来自定义Git。
自定义Git行为:配置、别名与关键文件
自定义Git行为有助于让日常版本控制更快速、更安全、更可预测。通过正确的Git配置、别名和关键文件,你的本地工作流可以与团队实际构建软件的方式相匹配。
目标不是创建一个别人看不懂的巧妙设置,而是消除常见任务中的摩擦,同时让仓库易于审计和维护。
Git配置的工作原理
Git从多个位置读取设置,且越近的设置优先级越高。这在调试Git为何使用了错误的名称、编辑器、合并工具、换行符或签名行为时非常重要。
三个主要的配置范围是:
- 系统级:适用于机器上的每个用户。
- 全局级:适用于你的用户账户。
- 本地级:仅适用于当前仓库。
你通常使用全局和本地设置。全局设置适用于你的身份、默认编辑器和常用别名。本地设置更适合仓库特定行为,例如工作项目使用不同的电子邮件地址。
使用以下命令检查设置的来源:
git config --list --show-origin
git config user.email
git config --local user.email
git config --global user.email
例如,你可以在全局使用个人电子邮件:
git config --global user.name "Alex Morgan"
git config --global user.email "[email protected]"
然后,在工作仓库中,仅覆盖电子邮件:
git config --local user.email "[email protected]"
这可以避免意外使用个人身份向公司仓库提交。同时,它也使提交历史更清晰,便于合规、所有权和代码审查。
如果你想更深入地了解身份设置,请参阅掌握Git用户配置。
首先自定义的有用设置
从能提高清晰度和防止小错误的设置开始。你不需要一个庞大的配置文件就能获得实际价值。
一个好的基线包括默认分支名称:
git config --global init.defaultBranch main
设置你偏好的编辑器,以便Git能在你实际使用的工具中打开提交消息、变基计划和合并注释:
git config --global core.editor "code --wait"
如果你在macOS、Linux和Windows之间工作,换行符值得关注。许多团队选择在仓库中保持换行符标准化,并让每个开发者的编辑器处理显示。一个常见的Windows设置是:
git config --global core.autocrlf true
在macOS或Linux上,团队通常使用:
git config --global core.autocrlf input
不要随意更改现有仓库中的换行符设置。如果你看到一个大差异,其中每一行似乎都被修改了,请在提交前停止并检查.gitattributes。
你还可以让Git的输出更易读:
git config --global color.ui auto
git config --global column.ui auto
git config --global branch.sort -committerdate
git config --global tag.sort version:refname
对于拉取更改,选择团队期望的行为:
git config --global pull.rebase false
或:
git config --global pull.rebase true
两种选项都不是普遍正确的。基于合并的拉取保留合并提交。基于变基的拉取保持线性本地历史。重要的是有意识地选择并记录团队期望。
创建节省时间的Git别名
Git别名将长命令转换为简短、易记的快捷方式。它们对于每天运行多次的命令特别有用。
以下是保持可读性的实用别名:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm commit
git config --global alias.last "log -1 HEAD --stat"
git config --global alias.unstage "restore --staged"
之后,git st显示状态,git unstage file.txt从暂存区移除文件而不影响工作副本。
日志别名是许多团队获得最大价值的地方:
git config --global alias.lg "log --oneline --decorate --graph --all"
现在你可以运行:
git lg
这会给你一个包含分支、标签和提交的紧凑图。在变基、合并或清理本地分支之前,这非常有用。
保持别名足够简单,以便队友能猜到它们的作用。像git save这样的别名可能意味着提交、暂存或其他操作,取决于创建它的人。而git unstage这样的别名则一目了然。
你可以使用以下命令查看别名:
git config --global --get-regexp '^alias\.'
更多示例,请参阅创建自定义Git别名。
你应该了解的重要Git文件
Git行为不仅仅由git config控制。几个仓库文件决定了哪些内容被跟踪、忽略、标准化和保护。
最常见的文件是.gitignore。它告诉Git忽略哪些未跟踪的文件。典型条目包括构建输出、本地环境文件、编辑器文件夹和依赖缓存:
node_modules/
dist/
.env
.DS_Store
注意宽泛的模式。忽略*.json可能会隐藏生成的文件,但也可能隐藏重要的配置。尽可能忽略特定的目录或文件名。
.gitattributes文件控制Git如何处理文件类型。它对于换行符、生成的文件、linguist行为和合并策略非常有用:
* text=auto
*.sh text eol=lf
*.bat text eol=crlf
这在使用不同操作系统的团队中特别有用。它减少了嘈杂的差异,并防止脚本因错误的换行符而中断。
.git/config文件存储本地仓库配置。你通常使用git config --local编辑它,但阅读它可以帮助你排查远程仓库、分支跟踪和仓库特定选项的问题。
Git钩子位于.git/hooks/下。它们可以在提交、推送、合并和其他事件之前运行脚本。默认情况下,钩子是本地的,不会作为活动脚本提交。依赖钩子的团队通常使用设置脚本或钩子管理器来一致地安装它们。
何时寻求帮助
大多数Git配置更改是安全的,但有些如果未在上下文中应用可能会干扰团队。在更改换行符规则、合并驱动程序、签名要求或共享钩子行为之前,请咨询高级工程师、DevOps工程师或仓库所有者。
如果提交在受保护仓库中显示错误的身份,你也应该寻求帮助。在代码推送后修复作者元数据可能需要重写历史,这会影响使用该分支的每个人。
如果Git突然行为异常,从git config --list --show-origin开始。这一条命令通常比猜测更快地解释问题。
深思熟虑的自定义让Git感觉不那么重复,同时不会隐藏正在发生的事情。保持别名清晰,记录仓库规则,并在一个项目需要与机器其他部分不同行为时使用本地设置。