
很多人在 Windows 上装完 Git以为双击完 Next 就万事大吉结果第一天就翻车提交记录里中文全变乱码、diff 一整片标红、push 到 GitHub 每次都要求输密码密码输对了还报错。我早年吃过这些亏后来把整套环境从头到尾重新配置了一遍才搞明白问题基本都出在“装了 Git 但没配置 Git”这一步。今天这篇就把我从下载安装、全局配置到 SSH 免密登录的完整链路整理出来每一步会解释为什么要这么做而不只是告诉你点哪里。文章尽量保持保姆级颗粒度刚接触 Git 的新手照着做就能跑通遇到问题也能顺着排查思路自己定位。1. 安装还在选 32 位下载前先弄清这几件事1.1 为什么我只建议用官方 git-scm.com 的发行版Git 在 Windows 上其实有很多分发形式有些博客会提供“绿色版”“便携版”还有的 IDE 会自带内置 Git。便携版用来临时应急没问题但我不推荐把它当成日常主力原因有三个第一便携版通常缺少完整的 Git Bash 和 Git Credential Manager 组件而这两个东西在后文的环境配置里会反复用到。第二便携版不会跟着官方更新时间一长版本僵住遇到 bug 或兼容性问题也没人修。第三官方版安装包里自带的组件经过完整测试和 Windows 的集成度最高尤其是右键菜单和终端支持。下载地址就是官方站 git-scm.com进去之后下载页会自动识别系统架构。注意区分 64 位和 32 位2026 年的今天绝大多数电脑都是 64 位除非你的机器特别老否则优先选 64-bit。另外如果你的 Windows 还是 7 这种老系统需要留意新版对旧系统的支持情况去下载页里找对应旧版本就行别硬装装不上的。1.2 安装向导里真正需要留意的几个选项安装过程里确实有不少页面但不要被吓到真正需要动脑的选项就那么几项我列了个表你照着选就行。安装选项推荐选择理由Select Components默认全选额外建议勾上 Git LFS大文件管理早晚用得上后面再补装稍麻烦Default editor选 Visual Studio Code 或 Nano默认的 Vim 对新人不友好忘按 Esc 就卡在编辑界面Adjusting your PATH第二项“Git from the command line and also from 3rd-party software”选第一项的话在 cmd 或 PowerShell 里敲 git 会提示找不到命令Line ending conversions默认第一项Checkout Windows-style, commit Unix-style这是解决后续 diff 全红的根基具体原理第二章说终端模拟器MinTTY支持彩色输出和更好的复制粘贴比默认控制台舒服得多git pull 行为默认推荐fast-forward or merge对新人最安全不会因为默认 rebase 产生意外历史变更Credential Manager默认 Git Credential ManagerHTTPS 模式记密码靠它后面 SSH 也要和它共存安装到后期会问你“实验性功能”要不要开比如 symbolic link 支持。这个对普通用户没必要保持默认就行不然在 Windows 上开符号链接可能因为权限不足反而报错。1.3 安装完先别急着用验证这一步别省装完之后打开开始菜单找到 Git Bash 并打开先敲一句git --version正常情况下会输出类似git version 2.5x.x.windows.1的信息能输出就说明命令已经可用。如果提示找不到命令基本可以断定是安装时 PATH 那步选错了重装一次就能解决。这里多说一句Git Bash 是安装 Git for Windows 时自带的一个终端环境长得像 Linux 的 bash但跑在 Windows 上。后续绝大多数命令行操作我都会建议在 Git Bash 里做它兼容性最稳而且提供了ls、cat、ssh-keygen这些 Unix 工具体验比 cmd 好很多。2. 装完不配置等于白装身份、换行符和中文乱码一次讲清2.1 不设置用户名和邮箱的后果运行下面的命令设置你的提交身份git config --global user.name 你的名字 git config --global user.email 你注册 GitHub/Gitee 用的邮箱这两条信息会写进你每一次 commit 记录里。GitHub/Gitee 这类平台就是靠 user.email 来关联“这个提交是谁干的”。如果你不设置Git 会尝试从系统主机名猜一个身份最后提交记录里显示的名字和邮箱就变得莫名其妙贡献图也统计不进去。邮箱建议和你注册代码托管平台的邮箱保持一致如果不一致在 GitHub 上提交不会被计入你的账号贡献。这个细节新手很容易忽略等发现绿格子不亮时才回头改就麻烦一些因为历史提交已经产生。2.2 一个文件为什么被 diff 出几百行红色换行符的真相这是 Windows 上 Git 最容易踩的经典大坑现象是你只改了一行代码但git diff显示整个文件全被删掉重写了满屏红色。根因是操作系统的换行符差异。Windows 文本文件默认用回车加换行两个字符结尾记作 CRLFLinux 和 macOS 只用一个换行字符记作 LF。Git 是一个起源于 Unix 的工具仓库内部默认使用 LF 存储文本。问题就出在“checkout取出和 commit提交”这两个方向上的转换策略。安装时让你选的 Line ending 选项本质是设置了core.autocrlf这个参数core.autocrlftruecheckout 时把 LF 转成 CRLF写回仓库时把 CRLF 转回 LF。推荐给 Windows 使用者因为本地工具对 CRLF 兼容最好而仓库里始终是干净的 LF。core.autocrlfinput只把 CRLF 转成 LF 提交但 checkout 时不做任何转换。适合在 Linux 环境但会处理 Windows 项目的人。core.autocrlffalse完全不做转换仓库里存什么就是什么。如果你跨平台协作很容易把 CRLF 提交进去然后队友每次拉下来都会看到整文件 diff。个人电脑上我建议保持安装时的默认true。公司团队如果有多平台协作者一起干活更专业的做法是在仓库根目录放一个.gitattributes文件统一规则比如* textauto eollf *.bat text eolcrlf意思是绝大多数文件按文本处理仓库里统一存 LF但.bat批处理文件在 Windows 上需要 CRLF单独指定。有了.gitattributes以后不管谁用什么系统、个人配置是什么仓库的换行规则都被文件锁死这才是根治方案。2.3 中文文件名变成八进制乱码一个配置解决在 Git Bash 里执行git status时如果中文文件名显示成\346\265\213\350\257\225.txt这种鬼样子是因为 Git 默认对非 ASCII 字符做了转义防止某些终端渲染出错。解决办法是把转义关掉git config --global core.quotepath false设置完再跑git status中文文件名就正常显示了。这个参数非常实用强烈建议一开局就配上。另外提交信息里的中文乱码偶尔也会出现通常和 commit 编码有关。可以顺手再做两个设置git config --global i18n.commitEncoding utf-8 git config --global i18n.logOutputEncoding utf-8理论上现在 Windows 的 Git Bash 默认 UTF-8 已经很少乱码但多配一行不亏至少能少踩一个坑。2.4 用一条命令看清你的全部配置从哪来Git 的配置优先级是系统级 用户级 仓库级。查看完整配置时最好带上来源信息git config --list --show-origin输出里每一行会标注当前配置来自哪个文件这样你就能知道某个配置到底是在系统里、用户目录下还是当前仓库里被设置的。比如user.name如果在某个仓库里被单独设置了另外的值它会覆盖全局值排查问题时一眼就能看出来。用--global修改的是用户级配置存在C:\Users\你的用户名\.gitconfig里。这个文件本质上是纯文本你也可以直接用编辑器打开看内容一目了然配置项之间的顺序无所谓。3. SSH 密钥配置全链路从生成密钥到免密登录3.1 为什么推荐用 SSH 而不是 HTTPS克隆远程仓库时Git 支持 HTTPS 和 SSH 两种协议。HTTPS 方式用起来简单复制地址就能 clone但后面每次 push/pull 都可能要求验证身份。装了 Git Credential Manager 之后能帮你记住密码但依然有 token 过期、换电脑就需要重新鉴权的情况。SSH 则是一劳永逸的思路你在本机生成一对“钥匙”——私钥自己留着公钥放到 GitHub/Gitee/GitLab 等平台上。之后所有 Git 操作都通过私钥签名身份验证不用输密码不用管 token 什么时候过期。类比一下私钥是家门钥匙公钥是锁芯你把自己锁芯的备份交给平台回家时用钥匙一拧就开门。不仅如此很多场景只能走 SSH比如你要从自己的服务器上拉代码或者公司内网的 GitLab 只开放了 SSH 端口。所以这套技能不只是给 GitHub 用的是通用的。3.2 生成密钥选 ed25519 还是 RSA在 Git Bash 里先检查一下是否已经生成过密钥ls -al ~/.ssh如果看到id_ed25519和id_ed25519.pub这类文件说明以前生成过可以跳过生成步骤直接用。如果没看到.ssh目录或者里面是空的那就开始生成ssh-keygen -t ed25519 -C 你的邮箱-t指定算法类型-C是注释信息一般填邮箱用来标记密钥是谁的。这里我推荐ed25519它比老牌的 RSA 密钥更短、生成更快、安全性却不输给 RSA 4096。绝大多数现代平台都支持GitHub、Gitee、GitLab 都接得住。什么情况下还要用 RSA如果你的公司 GitLab 版本比较老或者有一台用 CentOS 6 之类的旧服务器老旧的 SSH 服务端可能不支持 ed25519那时就改用ssh-keygen -t rsa -b 4096 -C 你的邮箱生成过程中会问你保存路径直接回车用默认路径即可。接着会提示设置 passphrase口令这个东西类似于给私钥再加一层密码保护。有人觉得麻烦就不设也可以我建议设一个因为私钥一旦丢失没有 passphrase 等于别人拿着你钥匙直接进家门。设了 passphrase 之后可以借助后面要讲的 ssh-agent 机制只需要在每次开机解锁一次后续使用不再频繁输入。3.3 把公钥放到 GitHub、Gitee 和公司 GitLab生成完的密钥文件有两个id_ed25519是私钥绝对不能外传id_ed25519.pub是公钥可以放心交给平台。用下面的命令把公钥内容打出来cat ~/.ssh/id_ed25519.pub输出是一长串以ssh-ed25519开头、以你的邮箱结尾的字符串把它整行复制。接下来按平台操作GitHub登录后点右上角头像 → Settings → SSH and GPG keys → New SSH key → 粘贴公钥 → Add SSH key。Gitee设置 → 安全设置 → SSH 公钥 → 粘贴公钥 → 确定。公司 GitLab进入用户设置 → SSH Keys → 粘贴公钥 → Add key。都配好之后用测试命令验证是否通了ssh -T gitgithub.com首次连接时屏幕会提示你确认主机指纹问Are you sure you want to continue connecting (yes/no)?输入yes回车即可。如果看到Hi 你的用户名! Youve successfully authenticated, but GitHub does not provide shell access.这就代表 SSH 打通了。用同样的方法测 Giteessh -T gitgitee.com成功会返回Hello 你的用户名!之类的提示。两个平台都通过之后以后 clone 仓库时记得选 SSH 地址git clone gitgithub.com:用户名/仓库名.git而不是 HTTPS 地址这样整条链路就全部走免密了。3.4 配完 SSH 后重启电脑又失效把 ssh-agent 服务设为自动如果你在生成密钥时设置了 passphrase就会遇到一个现象刚配置完测试是通的重启电脑后再次git push却开始要密码。这是因为带 passphrase 的私钥需要经过一次“解锁”操作才能被使用系统重启后这个解锁状态就丢了。这时就要请出 ssh-agent它是一个常驻后台的密钥管理器用来帮你保管已经解锁过的私钥。在 Git Bash 里手动执行eval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519第一条命令启动 agent第二条命令让你输入一次 passphrase把私钥加进 agent 的内存。之后一段时间内 Git 操作就不再提示输入 passphrase 了。但这个状态重启后又没了吗解决方法是把 Windows 自带的 OpenSSH Authentication Agent 服务设为自动启动。按 Win R输入services.msc找到 OpenSSH Authentication Agent双击把启动类型改为“自动”然后手动启动这个服务。设置后需要在管理员 PowerShell 里执行一次Set-Service ssh-agent -StartupType Automatic再做一次ssh-add添加私钥之后系统启动时 agent 会自行加载。要注意agent 重启后私钥仍然需要一次ssh-add来解锁因为 agent 内存里不会存你的 passphrase这是刻意设计的安全机制。3.5 一台电脑多个平台多个账号SSH config 实战很多人同时用 GitHub 和 Gitee甚至公司 GitLab 的账号邮箱都不一样如果所有密钥都叫id_ed25519就要出现互相覆盖的问题。正确姿势是对每个平台生成专属密钥ssh-keygen -t ed25519 -C github邮箱 -f ~/.ssh/id_ed25519_github ssh-keygen -t ed25519 -C gitee邮箱 -f ~/.ssh/id_ed25519_gitee-f参数可以指定生成的文件名。然后用编辑器创建或修改~/.ssh/config文件Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github Host gitee.com HostName gitee.com User git IdentityFile ~/.ssh/id_ed25519_gitee这里的关键是Host和HostName的区别Host是你自己起的别名但因为它写的是github.com这种正式域名所以不会影响实际连接IdentityFile指定了连接这个 Host 时要使用的私钥路径。以后 clone GitHub 项目仍然用gitgithub.com:xxx/yyy.gitclone Gitee 项目用gitgitee.com:xxx/yyy.gitSSH 会自动按照 config 里的规则挑选对应密钥互不干扰。如果你的场景更特殊同一平台有两个账号比如一个私人账号一个公司账号那才需要给其中一个 Host 起一个独特的别名比如Host github-work然后 clone 时用gitgithub-work:用户名/仓库.git。不过对大多数用户来说一个平台一个密钥就够了。4. 让 Git 在日常工作流里真正顺手高频命令与配合技巧4.1 Git Bash 不是只能敲 Git 命令很多人打开 Git Bash 之后只会输入git开头的命令其实它自带了一套常用的 Unix 工具集。ls查看文件、cd切换目录、cat查看文件内容、touch创建新文件、rm删除文件这些命令都能用。熟悉 Linux 的朋友会觉得回家了不熟悉也没关系记住几个常用的就行。另外要理解~这个符号它代表你的用户目录在 Windows 上通常对应C:\Users\你的用户名。Git Bash 会把 Windows 路径自动映射成 Unix 风格路径比如C:\Users\你的用户名\Desktop可能显示为/c/Users/你的用户名/Desktop。这种差异刚开始有点绕习惯就好。4.2 一整天的核心工作流其实就是这几条命令不管项目多复杂日常操作跑不出下面这些命令git clone gitgithub.com:用户名/仓库名.git cd 仓库名 git checkout -b feature/xxx # 改代码…… git status git add . git commit -m 完成 xxx 功能 git push -u origin feature/xxxgit status随时看工作区状态git add .把当前所有改动加入暂存区git commit -m把暂存内容固化成一次提交git push推送到远程git pull或git fetchgit merge拉取远程更新git log --oneline --graph是我个人比较推荐的一条可视化命令能把分支合并历史用图形方式画出来。加上--decorate还能显示分支和标签指向一眼看清项目当前在哪、各个分支分别领先落后多少。新手最容易误解的是git pull到底干了什么。它等同于先git fetch再git merge把远程新增提交合并到当前分支。如果你在本地和远程同时改了同一个文件就可能出现合并冲突Git 会把冲突标记直接写进文件里用对比工具打开按提示手选保留哪部分即可。这说明 pull 不是单纯的更新下载而是一个合并动作在多人协作时要提前习惯。4.3 让编辑器、IDE 和 Git 配合顺滑Git 默认的编辑器是 Vim很多人第一次写提交信息时误进 Vim 就出不来了体验非常糟糕。解决办法是把默认编辑器换成 VS Codegit config --global core.editor code --wait--wait参数的意思是代码在你保存并关闭 VS Code 那个窗口后再继续执行 Git否则 Git 会认为你还没编辑完。设置好之后以后不带-m参数执行git commit时会自动弹出 VS Code 让你写提交信息。VSCode 里使用 Git 建议直接把内置终端的 shell 换成 Git Bash设置里搜terminal.integrated.defaultProfile.windows把它改成 Git Bash。这样在 VSCode 里写代码、跑命令都不用切换到外部窗口。IDEA、PyCharm 等 JetBrains 系 IDE 对 Git 的支持更完善Settings → Version Control → Git把 Path to Git executable 指到C:\Program Files\Git\bin\git.exe即可。可视化界面里 diff、分支切换、历史查看都很直观新手可以先用 GUI 学动作再用命令行理解原理。4.4 配置文件里藏着的 IDE 调用细节有些朋友在日志或进程里会看到一条很长的 Git 命令比如git -c diff.mnemonicPrefixfalse -c core.quotepathfalse --no-optional-locks status这是 IDE 在后台调用 Git 时附加的临时参数。-c可以在单次命令执行时临时覆盖某个配置项diff.mnemonicPrefixfalse表示 diff 里不使用 a/ 和 b/ 这类简写前缀core.quotepathfalse就是我们前面说过的中文转义问题--no-optional-locks是避免git status这类只读操作去获取可选锁防止和用户正执行的其他 Git 操作互相阻塞。理解了这一层你就知道这些参数和全局配置的关系——它们是“一次性配置”不改写你的全局设置只在当前命令生效。4.5 Alias把又长又难记的命令变成一句话如果觉得git log --oneline --graph --decorate --all太长可以设置别名git config --global alias.lg log --oneline --graph --decorate --all之后只需要敲git lg同样道理可以配一组常用别名git config --global alias.st status git config --global alias.co checkout git config --global alias.br branch git config --global alias.cm commit -m git config --global alias.unstage reset HEAD --别名的价值不只是少打几个字母更重要的是把你自己高频使用的命令固化成肌肉记忆。我见过很多老手都有自己的一套 alias 文件换电脑后第一件事就是恢复配置这就是“环境配置”的一部分。4.6 .gitignore谁该进仓库谁不该进项目根目录放一个.gitignore文件告诉 Git 哪些路径不需要纳入版本管理。最常见的例子是 IDE 配置目录.idea/、.vscode/、编译产物target/、dist/、node_modules/和敏感文件.env。# IDEA .idea/ # VS Code .vscode/ # 编译产物 target/ dist/ node_modules/ # 环境变量 .env在.gitignore里写好了规则之后git add .就会自动跳过这些路径避免把密钥文件或本地配置推到远程仓库里。这一点对新手尤其重要很多人第一次提交时把.env带了上去数据库密码什么的直接跑到 GitHub 上后面的麻烦远超想象。5. 实测中的高频报错与排查记录5.1 push 一直要求输入用户名密码输对了还报错这是一个典型场景一开始用 HTTPS 方式 clone 的项目每次 push 都要弹窗输密码。输入账号密码之后却提示 “Support for password authentication was removed. Please use a personal access token instead.”原因很直接GitHub 早已不支持用账号密码执行 Git 操作只接受 token 或 SSH 密钥。你在凭据框里输入的密码永远不可能正确。排查链路先看远程地址是什么协议git remote -v如果显示的是https://github.com/...你有两条路一是换成 SSH改远程地址为 SSH 格式并配置好密钥二是生成一个 personal access token把它当作密码填入。如果之前保存过错误凭据Windows 的凭据管理器会一直记住它导致每次都用旧凭据反复失败。在控制面板 → 用户账户 → 凭据管理器 → Windows 凭据 里找到git:https://github.com那一项手动删除下次就会重新询问。我个人的建议是既然已经走到这篇教程直接切换到 SSH 方案一劳永逸。5.2 只改一行代码diff 却整个文件标红这个现象在团队协作里也经常遇到。排查思路先看当前仓库的core.autocrlf是什么git config core.autocrlf如果别人提交的文件在仓库里被存成了 CRLF而你本地设置的是true那么你 checkout 下来的文件本身就是混合换行符状态Git 在对比时就觉得整文件都变了。根治方法是在仓库中加入.gitattributes并执行一次重新规范化git add --renormalize . git commit -m chore: normalize line endings这个操作会把仓库里所有文本统一成 LF 存储。提交后这个改动会作为一个独立 commit 出现在历史上虽然 diff 看着大了一次但之后项目的换行符就彻底稳定了。如果你是项目的唯一开发者尽早把.gitattributes加上如果是老项目先和团队沟通一次把换行符统一这件事作为一次“基建提交”处理掉后续能少很多无意义的冲突。5.3 “Host key verification failed” 和连接报错首次用 SSH 连接新服务器时会看到The authenticity of host github.com (IP) cant be established. Are you sure you want to continue connecting (yes/no)?这代表你的电脑还没“认识”这台主机输入yes并把其公钥指纹记录下来即可。如果你之前连过但对方服务器的密钥变了系统会直接拒绝WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!这种情况多发生在服务器重装系统后。处理方法ssh-keygen -R github.com该命令会把旧的主机密钥记录从~/.ssh/known_hosts里删除然后重新执行ssh -T gitgithub.com重新确认一遍指纹即可。还有一种很常见的报错是gitgithub.com: Permission denied (publickey).这几乎可以断定是 SSH 密钥没配对。排查链路ssh -T gitgithub.com -v-v参数会输出详细调试信息重点看它到底加载了哪个私钥文件。如果发现加载的不是你期望的那个去~/.ssh/config里检查IdentityFile的路径。如果提示找不到私钥文件确认你生成密钥时的保存路径是否在~/.ssh/下文件名是否写错。5.4 误删分支、reset 之后想反悔新手在分支操作里最容易翻车的是git branch -D some-branch然后发现分支里还有没合并的代码整个人瞬间凉了一半。这时候别慌Git 不会立刻把提交对象物理删除而是等它从所有引用中消失一段时间后才会被垃圾回收。这时可以靠git reflog找回git reflog输出里会列出所有 HEAD 曾经停留过的提交记录每一行都有 hash 值。找到你删除分支前那个提交的 hash然后重新从它创建分支git checkout -b recovered-branch hash就能把遗失的代码全部捞回来。这条命令同样适用git reset --hard之后的悔棋场景只要你有提交过reflog 里大概率还有迹可循。Git 的回收机制默认保留 90 天的“悬空提交”想找的东西还在窗口期内基本都能救得回来。5.5 有时候 Jenkins、Docker 脚本里的 Git 突然不识别命令如果你在一个 Windows 服务账号下跑自动化脚本经常会发现脚本里执行git提示找不到命令。原因是安装 Git 时如果只勾选了“仅给当前用户使用”那么 Git 只安装到当前用户的环境变量里服务账号读不到 PATH。解决方法是重装 Git在安装向导的“Adjusting your PATH”步骤选择第三项Use Git and optional Unix tools from the Command Prompt或者更保守一点选择第二项并手动把C:\Program Files\Git\cmd加进系统环境变量 PATH。之后重启服务或重开终端问题就消失了。这是个隐蔽但真实存在的坑尤其是在 Windows Server 上跑自动化构建的同学遇到莫名无法调用 Git 可以先走这条排查思路。5.6 交互命令卡在 Git Bash 里不动在 Git Bash 里运行node、python等需要交互输入的脚本时偶尔会出现命令行卡死、方向键乱码的现象。大多数情况是 Windows 控制台与 Unix 风格终端处理交互输入的方式不同导致的一个通用兜底方案是加winpty前缀winpty python winpty nodewinpty是一个兼容运行器负责把 Windows 的控制台交互映射成 Git Bash 能识别的形式。不过 2026 年新版 Git Bash 已经很少需要手动加这个前缀了如果你遇到输入异常再考虑这个方案也不迟。这里提出来是想说明Git Bash 里出怪问题时很多不是你项目代码的问题而是终端兼容层的事。这套配置我用了三年换新电脑只需五分钟配置环境这种事最怕每次换电脑都重新踩一遍坑。我后来把整套配置命令汇总成了一个初始化文档存在笔记里换新电脑时从头到尾跑一遍就能复现官方装 Git、开 Git Bash、跑完身份和中文配置、生成 SSH 密钥并添加到平台、再把 ssh-agent 服务设为自动。速度熟的话五分钟搞定之后一整个工作季都不用再碰配置。最后分享一个我自己的小习惯git config --global --edit可以快速打开.gitconfig文件所有全局配置都集中在这里。我隔几个月会回来看一眼把不用的别名清掉把新学的高频命令加进去。Git 这东西入门可以靠抄命令真正用顺手靠的其实是把自己最常用的操作固定成一套固定流程——这也是我认为“环境配置”真正值钱的地方。