1. 安装与初始配置:先解决“能不能跑起来”的问题
很多人第一次接触Git,是在下载了一个项目压缩包、或者被迫接手一个代码仓库之后。真正开始学的时候,第一道坎往往不是命令记不住,而是环境压根没搭对。所以我先把安装和初始化这一步讲透,这个环节如果稀里糊涂,后面会有一堆连锁问题。
1.1 Windows下安装Git最容易忽略的细节
Windows用户首选Git for Windows,官网下载安装包一路Next就能装完。但有几个选项建议手动调整一下。
第一是安装路径。默认会装到C:\Program Files\Git,这个路径有个隐患——中间有空格。虽然Git自己处理得了,但一些第三方工具(比如某些编辑器内置终端)在拼接命令时,偶尔会因为这个空格出问题。我个人习惯装到D:\Git或者C:\Git这种无空格路径,省心。
第二是PATH环境变量。安装向导里有三个选项:
- “仅从Git Bash使用Git”——不推荐
- “从命令行以及第三方软件使用Git”——推荐选这个
- “从命令提示符使用Git并覆盖系统工具”——不推荐
选第二个就可以了。选第一个的话,你在cmd或PowerShell里敲git,系统会报“无法将‘git’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”,这就是热搜里一条经典报错,根源就是PATH没配好。
第三是换行符转换方式。这是最容易被忽略、后来又是最能恶心人的设置。Windows和Linux/macOS的换行符不一样,Windows用CRLF,Linux和macOS用LF。安装向导会让你选:
- “Checkout Windows-style, commit Unix-style line endings”——推荐
- “Checkout as-is, commit as-is”——如果团队全是Windows用这个
- “Checkout Unix-style, commit Unix-style”——纯Linux/macOS开发选这个
如果团队成员跨平台,第一条最稳妥。它保证提交进仓库的文件统一用LF,避免因为换行符不同导致整个文件被标记为“已修改”,这个坑我帮人排查过很多次,根因基本都是autocrlf配置不对。
安装完成后,打开Git Bash,先跑一句git --version验证一下。能正常输出版本号,说明核心安装没问题。
1.2 配置用户身份:不配这个,commit根本没法进行
Git装好后第一步不是急着clone或init,而是配置用户信息。这个配置会写进每次commit的元数据里,不同的人的代码是谁提交的,全靠这个区分。
配置分三级:
| 配置级别 | 生效范围 | 修改命令 |
|---|---|---|
| --system | 整台机器所有用户 | git config --system --list |
| --global | 当前用户所有仓库 | git config --global user.name "张三" |
| --local | 当前仓库 | git config user.name "张三" |
新手建议至少先配好--global级别的user.name和user.email。注意这个email不一定要用真的邮箱,但最好是跟你代码托管平台账号绑定的邮箱,这样提交记录能正确关联到你的账号。
如果你不配这些信息就执行commit,Git会给你弹一个错误,告诉你“Please tell me who you are”,然后让你去设置。好消息是这不算严重的故障,按提示配置完再提交就行。坏消息是有些人会把自己电脑上的全局邮箱长期配成某个已离职同事的,导致历史记录张冠李戴,后面追责找人都费劲。
1.3 换行符、编码、别名:几个顺手就做掉的配置
除了用户信息,我还会顺手做三件配置:
第一,设置默认分支名。Git新版本默认分支叫master,但很多新仓库实际使用main,建议统一一下:
bash复制git config --global init.defaultBranch main
这样本地git init创建出来的仓库默认分支就是main,跟GitHub等平台保持一致。
第二,解决中文文件名乱码。Windows底下Git Bash对中文文件名显示经常是转义过的八进制编码,像\344\270\255\346\226\207这样。执行:
bash复制git config --global core.quotepath false
之后git status就能正常显示中文文件名了。
第三,配置别名。我常用的几个别名:
bash复制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 --all --decorate"
配置完之后,git st等于git status,git lg直接按图形化方式看提交历史,效率比敲全量命令高很多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 日常高频命令:提交、分支、远程协作
环境搭好之后,进入正题。Git命令看起来很多,但日常开发真正高频的其实就那么二十来个,我把它们按“本地操作”和“远程协作”两条线串起来讲。
2.1 本地提交:add、commit这套流程到底在干什么
Git的本地版本管理是分“工作区-暂存区-版本库”三层结构的。理解这个结构,你就理解了为什么Git要分add和commit两步。
工作区就是你打开编辑器能看到、能改的那些文件;暂存区可以理解成一个“候车区”,先把要提交的文件放进去;版本库才是真正存快照的地方。
git add就是把你选中的文件从工作区挪进暂存区。git commit则是把暂存区里的内容打包成一个新的版本快照,写进版本库。
实操上,新手最容易问的问题是“要不要每次git add -A”。回答是:要看你的提交粒度。git add -A把所有改动都放进去,适合一次性提交;但如果你这次只想提交A文件的改动、B文件还要继续改,就应该用git add A精准确认。
提交信息是另一个关注点。热搜里有“git提交规范”,建议按社区常见的Conventional Commits风格来写:
code复制feat: 新增用户注册功能
fix: 修复登录接口在空密码时崩溃的问题
docs: 更新README中的安装说明
refactor: 重构定时任务模块的调度逻辑
提交信息首行控制在50个字符以内,能说清楚“这次干了什么”就够了。如果需要补充细节,空一行后再写正文,用git commit -m "标题" -m "正文"可以实现多行提交信息。
2.2 分支操作:switch和checkout有什么区别
分支是Git相比SVN最让人舒服的设计,它本质上就是一个指向某个commit的指针。创建分支的代价极低,所以鼓励多开分支,不要在主分支上直接改。
bash复制# 查看所有分支
git branch -a
# 新建并切换分支
git checkout -b feature/login
# 或者新版命令
git switch -c feature/login
git switch是Git 2.23之后引入的新命令,专门用来做分支切换,语义比checkout清晰。checkout的历史包袱太重,既要管分支切换,又要管文件恢复,新手容易搞混。所以现在做分支操作我优先用switch,恢复文件用restore:
bash复制# 丢弃工作区某个文件的修改
git restore README.md
# 把暂存区的文件退回到工作区
git restore --staged README.md
合并分支的时候,Git默认采用fast-forward模式,也就是把分支指针直接往前移,不产生额外的合并提交。如果想让历史里保留“分支合并”这个动作,可以加--no-ff:
bash复制git merge feature/login --no-ff
我个人在项目上偏好--no-ff,因为能清楚看到哪些提交是合并进来的,将来用git log --graph回溯时一眼就能看出功能分支的完整线。
2.3 远程协作:clone、pull、push的完整闭环
本地玩溜之后,真正的协作场景是团队共用一个远程仓库。最常用的操作就三个:clone、pull、push。
git clone是把远程仓库完整复制到本地,包括全部历史记录。常见用法:
bash复制git clone https://example.com/group/project.git
如果你只需要拉取最新代码、不需要历史,可以用--depth 1做浅克隆,速度会快很多,适合临时参考的场景。
git push是把本地提交推送到远程。第一次推送新分支时,需要建立本地分支和远程分支的关联:
bash复制git push -u origin feature/login
-u的意思是--set-upstream,以后在这个分支上直接敲git push,Git就知道推送到哪。
git pull则是拉取远程最新改动并自动合并。它本质上是git fetch加git merge的组合。如果远程有改动、本地也有改动,并且改的是同一个文件的同一行,就会产生冲突。冲突解决是很多人的恐惧来源,实际不可怕——Git会把冲突标记写进文件里,形如:
code复制<<<<<<< HEAD
本地代码
=======
远程代码
>>>>>>> branch 'main' of https://example.com/group/project.git
你要做的就是把<<<<<<<、=======、>>>>>>>这些标记删掉,保留正确的内容,然后git add加上git commit。
冲突少不了的常用技巧是:push之前先pull。尽量让本地在最新代码基础上修改,冲突面天然就小。
2.4 看状态、看历史、看差异:三个被低估的“查看命令”
很多新手对git add和git commit很熟,但对“怎么确认自己做了什么”一问三不知。帮你确认的工具其实是这条命令:
bash复制git status
无论什么时候,执行完任何操作,只要对当前状态不确信,敲一下git status,它会明确告诉你现在在哪个分支、暂存区里有什么、工作区里有没有未暂存的改动。这是最值得养成肌肉记忆的三个字。
历史查看用git log,我几乎不用默认格式,因为信息太多太碎,反而看不到重点。我常用的是:
bash复制git log --oneline --graph --all --decorate
--oneline把每次提交压缩成一行,--graph用字符画画出分支拓扑,--all显示所有分支,--decorate标出分支和标签指向。这一条命令能干掉大部分可视化工具的日常需求。
比较改动用git diff:
bash复制# 看工作区未暂存的改动
git diff
# 看暂存区相对上一个提交的改动
git diff --staged
# 看两个提交之间的差异
git diff commitA..commitB
3. 免密登录配置:SSH和凭据存储怎么选
热搜里“git免密”“git clone配置账号密码”“git ssh配置教程”扎堆出现,说明这是一个人人都能遇到的痛点。每次push都要输一遍账号密码,确实烦人,而且公司系统如果启用了强密码策略,那密码长到粘贴都费劲。免密有两条主流路线,关键看你的远程仓库用的是什么协议。
3.1 HTTPS协议:用凭据存储解决
如果你一直是用https://开头的URL来clone,那其实不用切换协议,Git本身自带凭据存储机制。
Windows下安装Git for Windows时,默认凭据助手是manager,它会把密码存进Windows凭据管理器。第一次push输入账号密码后,之后就不会再问了。
如果之前没反应,可以检查一下凭据助手是否启用:
bash复制git config --global credential.helper
返回manager或者manager-core就是正常的。想要切换或者手动开启:
bash复制git config --global credential.helper manager
有些公司自建的代码托管平台使用了双因素认证,那么HTTPS免密时需要用平台生成的访问令牌(Access Token)来替代密码。热搜里有一个很典型的报错文案:“login failed. check api token or gitlab version. log in via git if the versi”——这就是IDE或命令行里用API token登录GitLab失败时的提示。遇到这类情况,先去平台账号设置里生成新令牌,然后以访问令牌作为密码输入,基本能解决。注意这类令牌通常有有效期,过期后重新生成一个就行。
3.2 SSH协议:密钥配好后就彻底不用管了
SSH免密的核心是“密钥对”:你在本地生成一把私钥和一把公钥,私钥自己留着,公钥上传到代码托管平台。push时Git会用私钥签名,平台拿公钥验证,验证通过就放行。
生成密钥的标准流程:
bash复制ssh-keygen -t ed25519 -C "你的邮箱或备注"
一路回车会在~/.ssh/下生成两个文件:id_ed25519(私钥)和id_ed25519.pub(公钥)。把公钥内容复制到代码托管平台的“SSH Keys”设置页,粘贴保存。
之后把远程URL从HTTPS切换成SSH格式:
bash复制git remote -v
git remote set-url origin git@example.com:group/project.git
验证是否成功:
bash复制ssh -T git@example.com
这时候你不需要输任何密码,能收到欢迎信息就代表SSH链路已通。
选择哪个方案?我的建议很简单:
- 多数个人项目、开源社区项目:SSH,配一次就一劳永逸
- 公司内部频繁更换账号权限、或使用双因素认证的环境:HTTPS加凭据存储加访问令牌,灵活性更好
3.3 多账号场景的host别名配置
如果你同时有个人仓库和公司仓库,且它们用的SSH密钥不一样,直接在~/.ssh/config里配host别名即可解决。
bash复制# 个人账号
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
# 公司账号
Host git.company.com
HostName git.company.com
User git
IdentityFile ~/.ssh/id_ed25519_company
这样clone的时候用git@github.com:...,Git会自动找到github.com这个别名对应的私钥。配完后先用ssh -T测试,确认返回的用户名分别对应各平台上的正确账号,避免“提交是别人身份”的尴尬。
4. 高频报错排查实录:遇到问题不要慌
Git报错种类繁多,但好多错误其实是同一批原因。下面这几个是搜索引擎、社区提问里最常出现的,我把排查链路和根因都梳理一下。
4.1 “无法将‘git’项识别为 cmdlet、函数、脚本文件或可运行程序的名称”
这条报错在Windows终端里太常见了。它的根因就一个:系统找不到git.exe的路径,也就是Git没被写进PATH环境变量。
排查步骤:
- 确认Git安装在哪个目录。正常是
C:\Program Files\Git\cmd\git.exe - 打开“系统属性-环境变量”,在Path里加这个目录
- 配置完重新打开终端窗口,再执行
git --version验证
如果Path里已经有了还是不行,可能是安装时选了“仅从Git Bash使用Git”。修复方式是重新运行Git安装包,把PATH选项改成“从命令行以及第三方软件使用Git”,安装向导会自动处理。
还有一种情况是编辑器内嵌终端(比如VSCode里的集成终端)没有继承最新的环境变量。重启一下编辑器,问题基本会消失。
4.2 “remote: http basic: access denied”
这条来自常见托管平台的经典报错是:“remote: http basic: access denied. if a password was provided for git authentication...”,一旦出现,基本就是认证失败。原因不外乎三种:账号密码错了、密码过期了、使用了双因素认证导致密码验证不通过。
排查顺序是这样的:
- 先确认URL里没有夹带旧的用户名信息:
git remote -v - 换一个能确认没问题的账号密码,手动push一次看是否成功
- 如果平台开着双因素认证,去账号设置里生成访问令牌,用它当密码
- 如果此前配置过旧的凭据存储,重新输入正确凭据:
bash复制git config --global --unset credential.helper
git config --global credential.helper manager
然后手动触发一次push,Git会重新弹出凭据输入框。
有时候报错信息里会提到error setting certificate file: d:/git/mingw64/etc/ssl/certs/ca-bun...,这是另一类问题——SSL证书文件路径配置不对或者环境变量干扰了证书读取。最直接的办法是检查系统环境变量里是否设了GIT_SSL_CAINFO,如果有且指向不存在的文件,删掉即可。没有的话就重设一下证书路径:
bash复制git config --global http.sslCAInfo "D:/Git/mingw64/etc/ssl/certs/ca-bundle.crt"
注意路径要跟你实际安装路径一致,反斜杠要转义或者用正斜杠。
4.3 .git目录泄露:一个不太常见但很要命的问题
热搜里有一条“git目录泄露如何下载”,说的是有些网站把.git文件夹暴露在Web根目录,攻击者可以借此逆向出整个项目的源码。
从Git使用者的视角,这个问题的教训是:不要把仓库里的敏感信息长期留在历史记录里。你以为是删除一个文件,实际上Git的commit历史里还保留着它的每一个版本。一旦编译部署生成的文件把.git目录带到了公网,等于源码和历史版本都暴露了。
防范比修复更重要,三条建议:
- 发布到公网前,明确排除
.git目录(配置Web服务器禁止访问它) - 敏感文件(密钥、配置)用
.gitignore排除,永远不要提交上去 - 如果真误提交了,不要只删文件再commit,要用
git filter-repo重写历史,把敏感内容彻底抹掉
关于.gitignore,稍微展开说几点。它其实就是一个“排除清单”,告诉Git哪些文件不需要纳入版本管理。新建项目建议一开始就配好,不然等文件进去了再补,历史里已经沾上了。常见需要忽略的是编译产物、依赖目录、IDE配置文件、本地环境变量等。
gitignore复制node_modules/
dist/
.env
*.log
.DS_Store
.idea/
.vscode/
4.4 IDE里的Git报错:别被大段日志吓住
热搜里那条很长的命令git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks,是VSCode这类编辑器在底层调用Git时自动拼接的。看到这类日志别慌,它只是把一些参数显式传给了Git。
这类报错对应的实际问题通常很小,比如提交时权限不足、分支有问题、或者本地仓库状态异常。IDE日志只是放大了命令细节而已。排查思路别跟着命令参数走,直接看报错最后一行——“fatal:”开头的句子才是真正的原因。把那一句放到搜索引擎里,比研究整段命令快得多。
遇到这种问题的时候,还有一个常常被忽略的简单手段:在IDE的终端里自己敲一条同样的命令,看看原生的报错是什么。IDE偶尔会把细节吞掉,命令行下还原出来的错误信息往往更直接。
总的来说,Git本身不难,它的难点在于大量配置和报错信息采用英文,新手遇到问题容易抓瞎。但只要养成了“出问题先看报错最后一行、再去看配置、最后才是怀疑工具坏了”这样的习惯,绝大多数所谓疑难杂症都是几分钟就能解决的小事。我个人用了这么多年的体感是,把上面这些高频问题摸透之后,Git的复杂度就基本只剩“想怎么用”的需求,而不是“用不起来”的焦虑了。
