
最近总有人问我同一个问题“为什么我 Git 装完了在 CMD 里敲git --version却告诉我不是内部或外部命令” “SSH 密钥也生成了添加也添加了怎么 push 的时候还是Permission denied (publickey)”这些场景我见得太多了十有八九不是 Git 本身的问题而是 Windows 环境下装 Git 时那些不起眼的选项没选对或者配置链路有一步断了。今天我就把 Windows 上 Git 从下载、安装、环境配置到 SSH 密钥的整套流程完整过一遍每一步都讲清楚为什么这么做踩过的坑也一并列出来。不管你是完全没装过 Git 的新手还是装过但环境一团乱、想一次性理清楚的老同学照着这篇走基本不会再被环境问题卡住。1. 下载之前先弄清楚“Windows 上的 Git”到底是什么1.1 Git for Windows 和 Git 本身的关系Git 是一个版本控制工具本身是 Linux 世界的产物核心命令跑在 Unix 环境里非常顺畅。但 Windows 上没有天生的 bash 环境所以官方专门维护了一个 Windows 发行版名字就叫 Git for Windows。这个发行版不只是把 Git 命令编译成 exe还附带了一个 Git Bash 终端和一批常用的 Unix 小工具。你后面会经常听别人说“打开 Git Bash 敲命令”说的就是这个东西。为什么要单独带一个 Git Bash因为很多 Git 相关的脚本、钩子、别名配置都是按 Unix 风格写的如果你在 Windows 自带的 CMD 里跑经常会遇到路径分隔符、通配符、编码风格不一致的问题。Git Bash 等于在 Windows 里给你开了一个迷你 Linux 终端让 Git 的很多高级玩法能正常跑起来。理解了这一点你就不太会问“我明明有 PowerShell为什么还要用 Git Bash”这种问题了——不是不能替代而是 Git 生态默认的姿势就是 Bash。1.2 官方下载和国内镜像怎么选下载地址就是 Git 官网 https://git-scm.com/downloads 进去之后页面会自动识别你的操作系统Windows 用户直接点“Windows”就会跳转到下载页。一般来说会看到 64-bit 和 32-bit 两个版本现在只要是近几年的电脑一律选 64-bit。页面上通常还挂着 Portable 版我的建议是新手别碰那个只是免安装的绿色版虽然解压即用但右键菜单、文件关联、环境变量这些都不会自动配好后面反而要多花时间手动折腾。如果你的网络环境下官网下载慢得离谱可以用国内高校或云厂商的镜像站。清华开源镜像站和中科大开源镜像站都有 Git for Windows 的镜像目录阿里云的镜像也可以。镜像站里的目录结构通常跟 GitHub Release 一致你只需要找到最新的Git-2.x.x-64-bit.exe这样的文件下载就行。版本号不用太纠结2026 年现在官网稳定版已经到了 2.x 比较靠后的维护版本你下载时看到的那个就是当前最推荐的。1.3 动手安装前先花 30 秒检查现状别急着双击安装包先检查一下这台电脑是不是已经装过 Git。按Win R打开运行框输入cmd回车然后敲一行命令git --version如果有输出说明已经装过了你这次安装其实是在做版本覆盖。覆盖安装本身没问题配置文件一般不会丢因为用户级的.gitconfig和.ssh目录都在你的用户目录下不在 Git 安装目录里。不过保险起见建议先把这两个东西备份一下。.gitconfig一般位于C:\Users\你的用户名\.gitconfig.ssh目录在C:\Users\你的用户名\.ssh直接复制到别处就行。如果你的系统是 Windows 10 1709 以上版本或者 Windows 11那 Git for Windows 的所有功能都能正常支持。如果还在用特别老的系统建议先升级系统再说不然新版 Git 很可能装得上但跑不稳定。2. 安装 Git安装向导里的每个选项到底该怎么选2.1 安装向导逐页拆解先说不痛不痒的选项下载好的文件一般是Git-2.xx.x-64-bit.exe右键以管理员身份运行。第一个界面是 GNU 许可证直接 Next。然后会让你选安装目录默认C:\Program Files\Git就行不建议改到中文路径或带空格的奇怪位置省得后面有些工具解析路径出问题。接着到了 Select Components 这一步界面是英文的很多新手直接一路 Next其实这里面有几个值得说一下Additional icons 里的 On the Desktop 是桌面快捷方式可勾可不勾。Windows Explorer integration 里的两个选项建议都勾上尤其是Git Bash Here。勾了之后你在任意文件夹里右键就能直接打开 Git Bash并且自动切到当前目录这个功能日常用起来非常顺手。Git LFS 建议勾上它是 Git 官方的大文件扩展以后你要提交视频、设计稿、二进制包之类的文件没有这个会非常痛苦。Associate.git*configuration files 和 Associate.shfiles 这两个关联建议保持勾选这样你双击.sh脚本会用 Git Bash 打开配置文件默认用文本编辑器打开。Check daily for Git for Windows updates 这个随意我一般不勾因为更新提示有时候会打扰工作节奏。2.2 三个真正决定成败的关键选项从 Choosing the default editor used by Git 开始就要打起精神了。这个选项决定你以后执行git commit时如果需要写提交说明会弹出来哪个编辑器。默认是 Vim但很多新手用了 Vim 根本不知道怎么退出卡在编辑界面里心慌得不行。我的建议是如果你电脑装了 VSCode直接选 Visual Studio Code以后提交信息都在 VSCode 里改舒服很多。如果没装 VSCode选 Notepad 也行至少能看懂。实在不行用 Vim 也可以但要记住退出办法按Esc然后输入:wq回车这样是保存退出。下一个关键页面是 Adjusting the name of the initial branch in new repositories。这里建议选 main因为现在 GitHub、Gitee、GitLab 新建仓库默认分支全是 main你本地保持一致会省掉很多麻烦。如果留 master 也不是不能用就是每次本地初始化仓库后可能还要手动改分支名。重头戏是 Adjusting your PATH environment这一页的选项直接决定你 CMD 和 PowerShell 里能不能敲git命令。三个选项分别是Only use Git from Git Bash只在 Git Bash 里能用 gitCMD 里敲会提示不是内部或外部命令。Git from the command line and also from 3rd-party software会把 Git 的 cmd 目录加入系统 PATH这样 CMD、PowerShell、VSCode 终端里都能直接用 git这也是我推荐的选项。Use Git and optional Unix tools from the Command Prompt会在 PATH 里加更多 Unix 工具比如 find、sort 之类的但这些工具和 Windows 自带命令重名容易引发莫名其妙的冲突新手不建议选。这个选项我见过太多人选了第一个装完以后满腹疑惑以为安装失败了。认准第二项这个坑就算绕过去了。2.3 SSH 组件、HTTPS 后端与换行符转换接下来的 Choosing the SSH executable 有两个选择Use bundled OpenSSH 和 Use system OpenSSH。前者是 Git 自带的 OpenSSH版本固定跨机器表现一致后者是 Windows 自带的 OpenSSH 客户端跟着系统更新走。我推荐选 bundled OpenSSH因为这样你生成的密钥和管理方式在任何一台机器上都一样排查问题也简单。再往后是 Choosing HTTPS transport backend默认选 Use the OpenSSL library 就行。只有在企业内部网所有 Git 服务都挂在 Windows 域的证书体系下才需要考虑选 Use the native Windows Secure Channel library。普通用户不用动。Configuring the line ending conversions 这一页是很多团队协作矛盾的根源。Windows 下文本文件默认用 CRLF\r\n做行尾而 Linux 和 Git 仓库内部默认用 LF\n。如果不管这件事你 Windows 上改过的文件提交到仓库里Git 可能觉得整个文件每一行都变了diff 看得人崩溃。这一页的三个选项Checkout Windows-style, commit Unix-style line endings检出到工作区时自动转成 CRLF提交时自动转回 LF这是默认项也是 Windows 单机用户最稳妥的选择。Checkout as-is, commit Unix-style line endings工作区保持原样提交前转换成 LF适合团队有严格统一规范的情况。Checkout as-is, commit as-is完全不转换能不用就别用。我这里多说一句如果团队项目里有严格的.gitattributes文件里面会为不同文件类型指定换行规则那么 Git 会优先遵守.gitattributes安装向导里的这个选项只是全局兜底。所以选第一项问题不大后面如果出现换行符地狱优先排查是不是有.gitattributes规则在起作用。2.4 终端模拟器、git pull 行为和凭证管理器Configuring the terminal emulator to use with Git Bash 这页问的是 Git Bash 用哪种终端窗口。第一个是 MinTTY这是 Git Bash 默认终端支持键盘快捷键、彩色输出风格更接近 Linux 终端第二个是 Windows 默认控制台窗口外观更像 CMD。我推荐 MinTTY用起来顺手得多。Choose the default behavior of git pull 是问执行git pull时的合并策略。默认的 fast-forward or merge 对新手最友好选它就行。如果你已经理解了 rebase 并且明确喜欢线性历史选 rebase 也没问题但新手阶段别给自己增加理解负担。最后有一个 credential helper 选项推荐保持默认的 Git Credential Manager。这个组件可以在你通过 HTTPS 协议操作远程仓库时帮你保存凭据第一次输入账号密码或令牌后后面就不用反复输了。这不是 SSH但日常用起来非常加分保留即可。安装完成后有 Launch Git Bash 和 View Release Notes 两个勾选项把 View Release Notes 去掉直接启动 Git Bash安装环节到这里就算结束了。3. 环境配置装完之后先做这几件事Git 才算真正可用3.1 初始化身份user.name 和 user.email 为什么非配不可Git 每次提交记录里都会记录作者是谁这个信息不是从 Windows 登录账号里自动读的而是从 Git 配置里读。如果你没配置就提交Git 会提示Please tell me who you are或者用一堆不完整的默认信息生成一条奇奇怪怪的提交记录。在 Git Bash 里执行下面两行命令把名字和邮箱换成你自己的git config --global user.name 你的名字 git config --global user.email youexample.com这里有一个很容易被忽略的点邮箱建议跟你 GitHub、Gitee、GitLab 账号里绑定的邮箱保持一致。因为托管平台是通过邮箱把提交记录关联到账号的如果乱填一个邮箱你在平台上的提交记录就不会进入 contribution graph也就是说你的绿格子不会亮。这个配置是全局的之后所有仓库都会用所以第一次就认真填好。3.2 生产环境常用全局配置抄作业直接复制除了用户名和邮箱我会在装完 Git 后顺手把下面这些全局配置也都跑一遍git config --global init.defaultBranch main git config --global core.autocrlf true git config --global core.quotepath false git config --global pull.rebase false git config --global credential.helper manager逐条解释一下。init.defaultBranch main是让git init默认创建 main 分支跟远程平台保持一致。core.autocrlf true对应安装向导里的换行符第一项Windows 机器上设置成 true 最省心。core.quotepath false是解决中文文件名显示成八进制转义的问题不设置的话你在git status里看到的中文文件名会变成一串\xxx非常痛苦。pull.rebase false让git pull默认走 merge 而不是 rebase新手用 merge 语义更好理解。credential.helper manager是确保 Git Credential Manager 作为凭据工具生效这样在 HTTPS 协议下操作远程仓库时第一次认证后就能记住凭据。然后用一行命令检查一下全局配置有没有生效git config --global --list输出里能看到 user.name、user.email还有上面那些配置项说明都写进去了。3.3 设置默认编辑器别在提交时卡死在 Vim 里如果你安装的时候没有把默认编辑器改成 VSCode或者你后来换了编辑器可以随时用命令改。装 VSCode 的话这一条命令很经典git config --global core.editor code --wait这个配置的意思是当 Git 需要打开编辑器时会调用 VSCode并且等待文件关闭后再继续执行。--wait这个参数是关键少了它 Git 不会等 VSCode 保存完就直接认为编辑器已经退出了然后提交就会被打断。我第一次在这个细节上翻过车折腾了半天才发现是少了--wait。如果你用的是其他编辑器把命令里的code换成对应编辑器命令就行但格式基本是固定的。3.4 复查 PATH确保 CMD 和 PowerShell 也能直接敲 git前面安装时推荐了第二项 PATH 配置正常情况下 CMD 和 PowerShell 里已经能直接用 git 了。但有些特殊情况比如公司电脑有组策略或者安装时用的不是管理员账号PATH 可能没写进去。这时候可以手动检查一下右键“此电脑” → 属性 → 高级系统设置 → 环境变量在系统变量里找 Path编辑后确认里面有没有C:\Program Files\Git\cmd这一条。没有就手动加上。加完之后一定要重开一次 CMD环境变量的修改对已经打开的终端窗口不会立即生效这个点也常有人踩。顺便提一句如果你在 PowerShell 里敲 git 时提示“无法加载因为在此系统上禁止运行脚本”那其实不是 Git 的问题是 PowerShell 执行策略的限制。可以换到 Git Bash 里用或者以管理员身份执行Set-ExecutionPolicy RemoteSigned调整 PowerShell 策略但这事跟 Git 本身关系不大知道怎么回事就行。4. SSH 密钥从生成到免密推送一套配到你再也不输密码4.1 为什么要把远程仓库从 HTTPS 换成 SSH克隆远程仓库有两种常见协议HTTPS 和 SSH。HTTPS 方式拉代码很快但每次 push 都需要输入用户名和密码虽然 Git Credential Manager 能记住凭据但第一次认证还是有点麻烦而且现在 GitHub 等平台已经不支持用账号密码推送只允许个人访问令牌Personal Access Token做 HTTPS 认证。那个令牌是一长串随机字符串复制粘贴很不方便。SSH 是另外的思路你在本地生成一对密钥一把公钥一把私钥公钥放到托管平台私钥留在自己电脑上。以后推送代码时服务器通过数学方式验证你确实持有对应的私钥验证通过就放行全程不需要输密码。打个比方公钥就是一把锁你可以随便挂在服务器上私钥是钥匙只有你自己有。服务器只认锁不认人你只要能打开这把锁就说明身份没问题。4.2 生成密钥为什么我推荐 ed25519 而不是 rsa以前的老教程总让你用ssh-keygen -t rsa -b 4096生成出来是一大串上千字符的公钥。现在完全有更好的选择用 ed25519 算法。这个算法密钥更短、生成速度快、安全性高而且所有主流 Git 托管平台都支持。在 Git Bash 里执行ssh-keygen -t ed25519 -C youexample.com-C参数是注释一般填你的邮箱主要作用是当你有好几把密钥时能在文件里区分是谁生成的。执行后会问你要把密钥保存到哪里默认是C:\Users\你的用户名\.ssh\id_ed25519直接回车用默认路径就行。接下来会问你 passphrase也就是给私钥再加一层密码保护。这个可以留空直接回车但如果你用的是容易被别人接触到的电脑还是建议设一个。设置 passphrase 之后每次连接 SSH 会要求输入一次可以通过 ssh-agent 记住不用每次手输具体后面说。生成完成后在你用户目录下的.ssh文件夹里会出现两个文件id_ed25519是私钥绝对不能外传id_ed25519.pub是公钥这就是要添加到托管平台的内容。查看公钥内容用cat ~/.ssh/id_ed25519.pub如果老平台确实不支持 ed25519再退回ssh-keygen -t rsa -b 4096也不迟但要意识到这是少数情况绝大多数场景 ed25519 都是最优解。4.3 把公钥添加到 GitHub、Gitee、GitLab不同平台的入口不一样但操作逻辑都一样找到 SSH keys 设置粘贴公钥内容保存。GitHub 在右上角头像 → Settings → SSH and GPG keys → New SSH key。Gitee 在头像 → 设置 → SSH 公钥。GitLab 在左下角 Preferences → SSH Keys。粘贴的时候注意把ssh-ed25519 AAAA... 你的邮箱整段复制不要漏字符也不要多出换行。添加完之后在 Git Bash 里测试一下连接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 通了。Gitee 对应的测试命令是ssh -T gitgitee.comGitLab 要看你公司实例的域名也是类似格式。4.4 多平台多密钥用 config 文件管理一劳永逸很多人手上有 GitHub、Gitee、GitLab 好几个账号如果各自生成不同密钥文件名又不一样SSH 客户端就不知道该用哪把钥匙去开哪把锁。解决办法是在C:\Users\你的用户名\.ssh\config文件里写清晰的路由规则。没有这个文件就新建一个注意没有后缀名。Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github PreferredAuthentications publickey Host gitee.com HostName gitee.com User git IdentityFile ~/.ssh/id_ed25519_gitee PreferredAuthentications publickey这里的关键是Host后面的名字它对应你后续 clone 仓库时 URL 里的域名部分。SSH 每次连接时会读 config看图里HostName是真正要连的服务器IdentityFile指定用哪把私钥。如果只有一套密钥文件名是默认的id_ed25519其实不用写这个 config 也能正常工作但如果你给不同平台生成了不同密钥这个文件就是刚需。Windows 下还有一个别处教程很少提的坑.ssh目录和私钥文件的权限不能太宽松。Windows 自带的 OpenSSH 对权限很敏感如果私钥文件权限继承了太多用户它可能直接拒绝使用这把密钥报的错还是Permission denied (publickey)很容易让人误以为公钥没加对。解决办法是右键私钥文件 → 属性 → 安全 → 高级 → 禁用继承 → 删除所有用户只保留你自己并设置为完全控制。做完这一步再配好 SSH遇到权限问题的概率会降到很低。4.5 把现有仓库切换到 SSH 远程地址如果你之前已经用 HTTPS 地址 clone 了仓库切到 SSH 很简单。先看看现在的远程地址git remote -v输出会是https://github.com/用户名/仓库名.git这种。改成 SSH 地址git remote set-url origin gitgithub.com:用户名/仓库名.git改完再git remote -v确认一下。SSH 的地址格式在平台仓库页面都能直接复制GitHub 上点 Code 按钮切到 SSH 标签就能看到。如果是新仓库直接git clone gitgithub.com:用户名/仓库名.git就行走的就是 SSH 协议后续 push 不再要密码。5. 高频问题与排查技巧这些坑我基本都替你踩过5.1 遇到的问题基本都能在一张表里找到答案我把实际使用中最高频的几个问题整理成了速查表建议收藏遇到对应症状直接对照处理。症状常见原因解决办法git 不是内部或外部命令安装时 PATH 选项选错或 PATH 未生效重装时选第二项或手动把C:\Program Files\Git\cmd加入系统 PATH重开终端push 时报 Permission denied (publickey)公钥没添加、私钥文件名非默认且未加入 agent、仓库地址仍是 HTTPS重新确认公钥是否已粘贴到平台用git remote -v检查地址把变名密钥加到 ssh-agent每次 push 都让你输用户名密码远程地址是 HTTPS不是 SSHgit remote set-url origin gitgithub.com:用户名/仓库名.git换成 SSH 地址git status 中文文件名显示成 \xxxcore.quotepath 默认开启git config --global core.quotepath false提交时报 LF will be replaced by CRLF换行符自动转换的提示正常现象Windows 下推荐开启core.autocrlf true团队项目以.gitattributes规则为准SSL certificate problem访问的 Git 服务器使用自签名证书找管理员要正确的根证书配置不要为了省事全局关闭 sslVerify提交时卡在 Vim 编辑器不会退出默认编辑器是 Vim新手不会操作按Esc然后输入:wq回车退出或把默认编辑器改为 VSCode5.2 SSH 连接失败的标准排查顺序如果你遇到了Permission denied (publickey)别上来就删密钥重新生成按照这个顺序排查基本能定位第一步跑ls -al ~/.ssh看有没有密钥文件文件是不是默认名第二步跑ssh -T gitgithub.com看具体报错信息第三步确认公钥已经添加到平台并且粘贴时没有多空格或者漏字符第四步检查git remote -v看仓库地址是不是 SSH 格式第五步确认.ssh目录权限正常没有继承其他用户的权限导致私钥被忽略。这套顺序排查下来九成问题都能解决。还有一个比较隐蔽的点如果你的公钥在多个平台上用了同一把也完全没问题一把密钥可以同时添加给 GitHub、Gitee、GitLab互不影响。如果你在某个平台添加失败大概率是粘贴的时候公钥内容多复制了换行或者平台只允许添加一次同内容密钥检查一下历史添加记录就知道了。5.3 一些我自己养成的实际操作习惯装完 Git 后我一般会立刻做三件事跑一次git config --global --list确认配置完整跑一次ssh -T gitgithub.com确认 SSH 链路通再临时建一个本地仓库执行一次git init和git commit确认提交链路没有异常。这三件事全部通过以后后面写代码推送基本不会再遇到环境问题。换新电脑时我习惯把C:\Users\你的用户名\.gitconfig和整个.ssh文件夹直接拷贝到新机器对应目录。.gitconfig里面存了所有全局配置.ssh里存了密钥和 config 文件拷过去就不用重新生成密钥了。不过要注意拷过去之后私钥文件权限可能因为系统账户不同而变宽记得重新做一次权限收紧否则 OpenSSH 有概率不认。最后再分享一个小技巧日常开发不一定要单独开 Git Bash直接打开 VSCode 内置终端默认的 PowerShell 里敲 git 命令完全没问题路径会自动识别提交、推送、查看日志都在一个窗口里完成。如果你更喜欢 Git Bash 的体验也可以在 VSCode 里把默认终端切换成 Git Bash按Ctrl Shift P搜索“默认终端配置文件”选 Git Bash 就行。Git 这个东西装好配好之后存在感会很低但一旦环境乱了你写代码的心情会被破坏掉一整天。照着这篇走一遍后面就安心写代码吧。