Windows下Git安装配置与SSH密钥管理完整指南

发布时间:2026/9/14 18:10:13
Windows下Git安装配置与SSH密钥管理完整指南 Git 这个东西只要你开始正经写代码早晚都要碰。我带过不少新人发现大多数人去官网下载 Git 一点问题没有真正卡住的是另外几件事安装完之后不知道装了些啥环境变量一团乱麻第一次 push 代码时每次都被要求输密码烦到怀疑人生费了半天劲生成 SSH 密钥却分不清公钥私钥更不知道往哪儿贴、怎么配。这篇我就把整个流程完整走一遍——下载、安装、环境配置、SSH 密钥生成与托管平台配置每一步怎么选、为什么这么选、踩过哪些坑全部写清楚。无论你是刚装好系统的纯小白还是在 Windows 上折腾过几轮但一直没完全搞懂的老手照着做基本不会出大问题。1. Git 下载与安装1.1 下载前先搞清楚三件事第一件事你的 Windows 是 64 位还是 32 位。现在的电脑 99% 都是 64 位系统但毕竟还有少数老旧设备。查看方法很简单右键“此电脑”选“属性”或者直接去“设置 → 系统 → 系统信息”里看“系统类型”那一栏。Git for Windows 官方安装包的命名里带有64-bit或32-bit选错的话要么装不上要么装上之后各种奇怪报错。第二件事选择哪个版本。Git 官网git-scm.com下载页默认会给你推荐当前最新的稳定版一般写的是 “Download for Windows”。如果你没有什么特殊需求就直接下载这个默认版本。不建议去第三方下载站下载所谓的“绿色版”“精简版”一个是版本可能很久没更新另一个是有捆绑软件的风险。下载时注意看安装包的文件名比如是Git-x.x.x-64-bit.exe数字越大版本越新别下载成.tar.gz或者.zip源码包那是给开发者用的不是给普通用户安装用的。第三件事安装过程中要关注的关键选项。这一部分很多人都是无脑下一步装完发现终端里敲不了git命令或者文件换行符被改出毛病。后面我会把安装向导里的几个重要步骤单独拎出来讲。1.2 安装向导逐项拆解Git for Windows 的安装向导从Next到Finish大概有十几个页面我只挑影响实际使用的几个关键页面来说明其他像Select Components、Select Start Menu Folder这些用默认值即可。第一处关键选择是安装路径。默认装在C:\Program Files\Git我建议保持默认。如果你非要装到别的盘路径里绝对不能出现中文和空格比如D:\开发工具\Git这种路径非常容易在后续操作中踩坑。Git 是基于命令行的工具很多脚本和终端解析器对中文路径支持得并不好别给自己找事。第二处关键选择是Adjusting your PATH environment页面。这里有三个选项Git from the command line and also from 3rd-party software推荐Git from the command line onlyUse Git and optional Unix tools from the Command Prompt绝大多数情况下直接选第一项。它会帮你把git的可执行文件路径自动加入系统环境变量PATH这样你打开 CMD 或者 PowerShell 敲git --version才能正常识别。第三项会把 Git 自带的 Unix 工具也加进去这里面有些命令比如find、sort会和 Windows 系统自带的命令冲突新手容易摔跤不是特别需要就别碰。第三处关键选择是换行符处理方式Configuring the line ending conversions。这个页面有三选项Checkout Windows-style, commit Unix-style line endings推荐Checkout as-is, commit Unix-style line endingsCheckout as-is, commit as-is这里稍微解释一下为什么会有这种选项。Windows 系统里文本换行用的是CRLF回车换行两个字符而 Linux/macOS 用的是LF只保留换行一个字符。如果两边代码格式不一致你会看到整个文件都被 Git 标记为有改动明明只是打开保存了一次。第一项是 Git 在从仓库拉代码时帮你转成 Windows 的 CRLF在提交时自动转回仓库标准的 LF绝大多数 Windows 开发者都选这个。第二项适合那种用于部署在 Linux 服务器上的项目或者你非常清楚自己在做什么的场景新手不要选第三项。第四处关键选择是终端模拟器。默认推荐Use MinTTY我个人的建议是保持默认。MinTTY 是一个类 Unix 风格的终端对 Git 命令的输出颜色、字体支持更好。有的教程让你选Use Windows default console window我觉得没必要因为 Windows 默认控制台对 ANSI 颜色的渲染很迷Git 输出的高亮信息会变成一堆乱码一样的颜色符号。其他的页面比如Configure extra options里的文件缓存、符号链接都不用动直接一路Next到最后Install即可。2. 安装完成后的环境配置2.1 验证安装并弄懂三个“终端”的区别安装完成后先做一件事验证是否安装成功。按Win R输入cmd回车在命令行窗口里敲git --version看到类似git version 2.xx.x.windows.x的输出就说明 Git 已经安装成功并且环境变量也配置好了。有细心的朋友会问为什么我在开始菜单里能看到三个新程序——Git Bash、Git CMD、Git GUI——到底用哪个简单说Git Bash是 Git for Windows 自带的模拟 Linux 终端环境里面的ls、cd、pwd等命令风格和 Linux 一致它是所有 Git 教学里最常用的终端。主要原因是它的路径格式、命令风格都和 Linux 教程保持一致照着教程操作不会因为 Windows 的dir、copy这些命令而混乱。Git CMD就是在 Windows 原有命令提示符环境里加载 Git 工具用起来还是 Windows 的一套。Git GUI是图形化界面适合不想敲命令的极简操作。我个人实际工作中用得最多的是 Git Bash后续所有命令我都默认在 Git Bash 里执行。Windows 系统下的git命令在 CMD、PowerShell 和 Git Bash 里都能运行但 Git Bash 对密钥文件权限的处理、对路径的解析更接近 Linux这样和大多数教程一致少踩很多坑。2.2 全局配置用户名、邮箱和默认分支名装好 Git 的第一件事不要急着建仓库先告诉 Git 你是谁。打开 Git Bash逐行执行下面两条命令git config --global user.name 你的名字或昵称 git config --global user.email 你的邮箱这里的用户名和邮箱会作为这个电脑上所有 Git 操作的默认提交身份出现在你每次 commit 记录里。注意--global参数表示全局生效只要不重新配置这台电脑上所有仓库都会使用这个身份。还有两个比较推荐的全局配置git config --global init.defaultBranch main git config --global core.autocrlf true第一行是把新建仓库的默认分支名从master改成main。现在 GitHub、GitLab、Gitee 上新建仓库默认分支基本都是main本地提前对齐后面省得手动改来改去。第二行core.autocrlf true对应安装向导里的换行符自动转换选项除非你在安装时明确选了其他方案否则建议保持这个值。如果你需要确认当前所有配置运行git config --list这条命令会把system、global、local三层的配置全部列出来。要是看到配置不对可以用同样的命令覆盖比如刚才用户名打错了重新执行一次git config --global user.name 正确名字就会覆盖旧的不需要单独去编辑配置文件。2.3 Windows 上还需要设置代理吗很多国内用户在使用 GitHub 时经常遇到连接超时、下载缓慢的问题。这里涉及两种情况。如果你只是git clone和git push走的是 HTTPS 协议那么可以在全局配置里手动指定 HTTP 代理Git 会遵循这个代理去访问远程仓库。一般写法是git config --global http.proxy http://127.0.0.1:端口号 git config --global https.proxy http://127.0.0.1:端口号这么做的好处是明确指定后 Git 只走这个代理Windows 上不需要额外开系统代理而且对命令行操作稳定。如果你用的是 SSH 协议代理一般在~/.ssh/config文件里单独配置我会在 SSH 部分详细展开。如果不想配置代理另一个思路是使用国内访问更快的镜像站点。不少大厂和高校都提供 Git 仓库镜像速度确实会快很多。这里我不展开推荐具体哪个只提醒一点镜像站的同步频率和完整度参差不齐用之前先确认是不是你要的源码项目。最稳妥的方案还是把代理配好或者直接使用国内托管平台。3. SSH 密钥生成、配置与多账号管理3.1 为什么要用 SSH 而不是 HTTPS这是很多新手最容易困惑的地方。你在克隆远程仓库时通常会看到两种地址HTTPS 地址https://github.com/username/repo.gitSSH 地址gitgithub.com:username/repo.git用 HTTPS 克隆每次 push 的时候都要输入 GitHub 的用户名和密码或者 Personal Access Token非常烦。就算 Windows 上有 Git Credential Manager 能帮你记住密码可一旦碰到二次验证或者令牌过期还是会被反复弹窗折磨。SSH 的核心原理是“非对称加密”。你会生成一对密钥一把公钥、一把私钥。公钥放在代码托管平台上私钥留在这台电脑上。push/pull 时对端用你的公钥验证你私钥的签名匹配就放行全程不需要输密码。从 2021 年开始GitHub 已经不再支持用账户密码进行命令行 Git 操作哪怕你用 HTTPS 也只能用 token 或者 SSH key。所以现在新配置 Windows 开发环境我基本都是直接用 SSH。3.2 生成密钥选算法、设路径、留密码生成密钥的命令非常简单打开 Git Bash 输入ssh-keygen -t ed25519 -C youremailexample.com这里-t指定算法ed25519是目前推荐的密钥算法安全性高密钥长度短生成的公钥一行写得下各大平台都兼容。如果你用的是老系统或者必须兼容老的 Git 托管服务也可以换成-t rsa -b 4096不过新项目没有必要再用 RSA。-C后面跟的是备注信息通常填邮箱也可以填任何你方便识别的备注。这个备注只会显示在托管平台公钥列表里方便你以后认出是哪台电脑、哪个账号的密钥并不参与加密验证。回车后依次提示几个问题第一次是“密钥保存路径”默认显示的是Enter file in which to save the key (/c/Users/你的用户名/.ssh/id_ed25519):直接回车就用默认路径。除非你已经有一对密钥或者需要多账号管理否则不要改它。第二次提示是Enter passphrase (empty for no passphrase):这里我建议输入一个密码短语passphrase它是你私钥的密码。可能有人嫌麻烦直接回车留空但一旦私钥文件泄露或者电脑被人动了留空的话对方拿到私钥就能直接使用设置密码后至少能争取到处理时间。实际使用时会觉得麻烦我们可以通过后面说的ssh-agent让系统“记住”这个密码开机后只需要输一次。确认密码后会显示密钥的指纹和随机图案此时你的~/.ssh/文件夹下多了两个文件id_ed25519私钥绝对不要给别人也不要上传到任何地方id_ed25519.pub公钥可以随意发给平台也可以贴到代码托管平台的设置里3.3 让系统记住密钥配置 ssh-agent每次 push 都要求输入 passphrase 确实有点烦所以我们要启动 Windows 自带的 SSH 代理服务也就是ssh-agent让它解锁私钥后常驻内存。注意Windows 10 1809 之后系统自带 OpenSSH 组件但 Git Bash 里内置的ssh-agent是 Git 自己的版本两者可以共存直接用 Git Bash 的即可。在 Git Bash 里先启动服务eval $(ssh-agent -s)然后添加私钥ssh-add ~/.ssh/id_ed25519此时会提示输入密钥的 passphrase输一次即可。之后在当前这个 Git Bash 会话里你再 push/pull 都不会被要求输入密码了。但有个坑需要注意每次重新打开一个 Git Bash 窗口ssh-agent服务不一定会自动保留你之前添加的密钥因为eval $(ssh-agent -s)启动的是当前会话的代理进程。如果你希望在每次打开 Git Bash 时自动加载密钥可以在~/.bashrc或~/.bash_profile里加两行配置eval $(ssh-agent -s) /dev/null ssh-add ~/.ssh/id_ed25519 2/dev/null加了之后每次打开 Git Bash 会尝试加载密钥输入一次 passphrase 就行。实测下来这个配置在多数 Windows 开发机上都稳定。3.4 把公钥配置到 GitHub、GitLab、Gitee有了密钥之后要做的就是把公钥内容复制到你使用的代码托管平台上。查看公钥的命令cat ~/.ssh/id_ed25519.pub会输出一行以ssh-ed25519开头、以你备注结尾的字符串。用鼠标选中整行复制注意不要漏掉末尾的备注也不要复制到换行符。以 GitHub 为例操作入口是右上角头像 →Settings→ 左侧SSH and GPG keys→ 点击New SSH key。Title 随意填比如My Windows PCKey 类型选Authentication Key把刚才复制的公钥粘贴到 Key 输入框保存。GitLab 的入口是左侧Preferences→SSH Keys。Gitee 的入口是头像 →设置→安全设置→SSH 公钥。流程都一样就是把公钥贴上去而已不需要理解太复杂的概念。配置完之后测一下连接是否通ssh -T gitgithub.com第一次连接会提示确认 host key输入yes回车。如果看到类似Hi 你的用户名! Youve successfully authenticated, but GitHub does not provide shell access.说明公钥配置成功。GitLab 的测试命令是ssh -T gitgitlab.comGitee 是ssh -T gitgitee.com看到欢迎语就是配好了。3.5 多账号多平台密钥管理如果你同时使用 GitHub、GitLab 和 Gitee或者有多个 GitHub 账号就不适合用同一对密钥到处贴了。更安全的做法是每个平台单独生成一对密钥然后通过~/.ssh/config文件来区分。首先清空当前默认的密钥对或者改用它然后为不同平台创建独立的密钥文件。比如ssh-keygen -t ed25519 -C workcompany.com -f ~/.ssh/github_work ssh-keygen -t ed25519 -C personalexample.com -f ~/.ssh/gitee_personal这里-f参数指定文件路径把密钥按用途命名方便区分。然后在~/.ssh/下新建一个config文件无扩展名写入内容# GitHub 工作账号 Host github.com HostName github.com User git IdentityFile ~/.ssh/github_work IdentitiesOnly yes # Gitee 个人账号 Host gitee.com HostName gitee.com User git IdentityFile ~/.ssh/gitee_personal IdentitiesOnly yes这里要注意Host后面跟的别名和HostName的区别。Host是你在 SSH 命令里输入的别名HostName是真实的服务器地址。如果写的一样就相当于不取名直接用真实地址。IdentitiesOnly yes这一行很关键它告诉 SSH 连接时只用 config 文件里指定的密钥不要自动遍历~/.ssh/下所有密钥。我之前没加这行经常出现连接 GitHub 时用了 Gitee 的密钥然后被 GitHub 报权限拒绝。配置好之后测试ssh -T gitgithub.com ssh -T gitgitee.com分别显示对应的用户名就说明多账号配置成功。如果要用多账号 clone 仓库直接复制平台给出的 SSH 地址就行git clone gitgithub.com:username/repo.gitSSH 客户端会通过Host字段自动匹配 config 里的密钥。3.6 一个容易被忽略的细节known_hosts 文件在上面测试连接时第一次会提示确认远程主机的真实性输入yes后Git 会把远程主机的公钥指纹记录在~/.ssh/known_hosts文件里。这个文件是干什么用的它用于防止“中间人攻击”——确保你连上的服务器确实是你以为的那台。这个文件一般情况下不用管。但如果某天你发现 SSH 连接报错WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED不要慌原因通常是远程服务器重装了系统或者换了密钥解决办法是删除 known_hosts 文件里对应的那一行或者直接删除整个 known_hosts 文件它会在下次连接时自动重新生成。以我刚才的测试为例ssh-keygen -R github.com这条命令会从 known_hosts 文件里移除关于 github.com 的记录之后重新连接时重新确认一次即可。4. 常见问题与排查技巧实录4.1 SSH 连接报 Permission denied (publickey)这是 SSH 配置里最常见的错误。先用ssh -T gitgithub.com看具体输出不要只看最后一句报错。如果提示Permission denied (publickey)按以下顺序排查检查是否加载了正确的密钥ssh-add -l列出当前 ssh-agent 里的密钥列表如果为空或没有你预期的密钥用ssh-add ~/.ssh/id_ed25519重新添加。检查公钥是否贴到了正确的平台、正确的账号下。很多人把公钥贴到了另一个账号上或者少复制了一个字符。检查~/.ssh/目录权限。这一步在 Windows 上容易被忽略如果目录权限过于开放OpenSSH 客户端出于安全考虑会拒绝使用里面的密钥。在 Git Bash 里可以执行下面命令来修正chmod 700 ~/.ssh chmod 600 ~/.ssh/id_ed25519 chmod 644 ~/.ssh/id_ed25519.pub chmod 600 ~/.ssh/config如果你配了多个密钥并且使用了 config 文件检查Host、HostName和IdentityFile的路径是否正确。IdentityFile 路径里的~波浪线有时在 Windows 下解析会失效可以改成绝对路径比如/c/Users/你的用户名/.ssh/github_work。4.2 push 时总提示输入密码或者弹出 GitHub 登录框如果你用的是 HTTPS 克隆方式那 SSH 配置得再好也没用。检查当前仓库的远程地址git remote -v如果输出的是https://github.com/...开头的地址说明走的是 HTTPS。可以把它改成 SSH 地址git remote set-url origin gitgithub.com:username/repo.git改完之后再git push就应该走 SSH 配置不用再输密码了。如果你确实想继续用 HTTPS但你不想每次输密码Git for Windows 自带的 Git Credential Manager 会接管 Windows 系统的凭据管理器。第一次输入用户名和 token 后它会自动保存后续不需要重复输入。但用了 Credential Manager 之后如果你遇到“token 过期还要重新弹窗”的情况可以运行以下命令清理现有的 Windows 凭据git credential-manager erase然后重新 push按照提示输入新的 token 即可。4.3 文件换行符导致的“全文件被标记为改动”这是 Windows 上 Git 用户最经典的坑之一。现象从远程 clone 一个项目没有做任何修改但是git status显示大量文件是 modified 状态打开一看是每一行都被改动了。原因就是换行符不一致。你本地 Git 配置的core.autocrlf和项目仓库里实际保存的换行符格式不匹配。排查方法git config --global core.autocrlf如果是true代表 checkout 时会把仓库里的 LF 转成 CRLF 写入工作区。此时如果项目里某些文件比如.sh脚本、.gitattributes指定的二进制文件不能做转换就会出现这种诡异状态。最简单有效的解决方法有两种如果这个仓库只有你一个人在用或者项目规范允许全用 LF那就在仓库目录下执行git config core.autocrlf false然后再执行git checkout -- .把工作区文件重新恢复到和暂存区一致的状态再看git status是否干净。如果项目里有.gitattributes文件比如 GitHub 在部分项目里会自动生成则应该以仓库里的配置为准手动覆盖全局配置不是好方案。这类文件里通常写明了哪些文件按 LF 处理、哪些按 CRLF 处理此时你应该把全局的core.autocrlf删掉或设为false让.gitattributes来接管git config --global --unset core.autocrlf这里能讲的细节非常多但记住一个原则不要把core.autocrlf和.gitattributes混用否则 Git 行为会变得不可预测。4.4 Git Bash 中文乱码在 Git Bash 里输入中文文件名或者日志输出中文乱码这属于编码设置问题。Windows 的默认代码页是 GBK或者部分地区为 ANSI而 Git Bash 默认使用 UTF-8。解决方法是修改 Git 的全局配置git config --global core.quotepath false git config --global gui.encoding utf-8 git config --global i18n.commit.encoding utf-8 git config --global i18n.logoutputencoding utf-8然后右键 Git Bash 窗口的标题栏 →Options→Text→ 把Character set设为UTF-8或Unicode (UTF-8)。这样 Git Bash 里显示中文文件名、中文提交信息就不会乱码了。如果还不行检查一下 Windows 系统区域设置里是否勾选了“Beta: 使用 Unicode UTF-8 提供全球语言支持”这个选项开启后系统级编码会统一为 UTF-8但可能会影响一些旧软件的中文显示建议先改 Git 的配置。4.5 凭据管理器弹窗或者报错 “could not read Username”这种情况多发生在 HTTPS 协议下且 Git Credential Manager 的配置出问题。先看全局配置里的credential.helper值git config --global --get credential.helper正常情况应该显示manager或manager-core。如果显示为空说明没有配置凭据助手Git 就没有办法保存账号密码每次都会强制弹窗输入。手动配置git config --global credential.helper manager-core如果你已经改用了 SSH 方式也可以直接禁掉凭据管理器避免它总是跳出来干扰。执行git config --global --unset credential.helper这样 Git 在走 HTTPS 时将不再信任凭据管理器而是每次都提示输入用户名密码对于刚转 SSH 的新手来说反而是更明确、不容易困惑的行为。4.6 多账号下 SSH 连上了不对的平台我见过一个非常典型的问题用户同时在 GitHub 和 GitLab 上配了不同密钥结果执行ssh -T gitgitlab.com时输出的是 GitHub 的用户名。原因就是 ssh-agent 把所有密钥都加载了而 SSH 客户端在默认情况下会按顺序尝试所有密钥文件而不是只试和当前主机匹配的密钥。修复方式就是我前面提到的~/.ssh/config文件每个 Host 段都加上IdentitiesOnly yes并且指定该 Host 唯一使用的IdentityFile。配置好之后再测试就不会出现“拿 A 平台的密钥去连 B 平台”的尴尬了。还有一个细节Windows 上如果同时安装了系统自带的 OpenSSH 和 Git 自带的 OpenSSH两者的~/.ssh/config路径可能不一样。比如C:\Users\用户名\.ssh\config因为是同一用户主目录两边其实会读到同一个文件但保险起见先确认ssh -V正在执行的到底是哪个 ssh 程序。在 Git Bash 里执行which ssh如果输出的是/usr/bin/ssh说明用的是 Git 内置的那 config 文件就放在~/.ssh/config如果输出的是C:\Windows\System32\OpenSSH\ssh.exe那你需要检查系统版 OpenSSH 的配置规则。总之保持一致只认一个 ssh 程序问题就少一大半。5. 几个值得养成的操作习惯5.1 新机器开箱三步走每换一台新电脑Git 环境配置我基本都会按固定顺序处理熟练之后三分钟内可以完成先安装 Git for Windows然后用 Git Bash 设置user.name和user.email再生成并配置 SSH 密钥最后用ssh -T gitgithub.com测试连通。这样每一步都有明确的验证点不会配完之后才发现上一步有问题。如果你经常有换开发机的需求可以把这套流程存成一个笔记照着做就行了。5.2 用.gitignore提前排除垃圾文件Windows 环境下有几个文件几乎每个项目都会生成而且不应该提交到仓库。我会在初始化项目时第一时间写好.gitignore比如# Windows 系统文件 Thumbs.db Desktop.ini # IDE 配置 .vscode/ .idea/ *.suo # 编译输出 bin/ obj/ dist/ build/ # 日志和临时文件 *.log *.tmp .DS_Store不要小看这个文件。Windows 里只要预览过图片文件夹就会生成Thumbs.db你要是不忽略它每次打开这个文件夹 Git 都会检测到变化烦不胜烦。.vscode/也建议忽略因为不同开发者的本地调试配置不一样传上去容易互相覆盖。5.3 关于 Windows 上 Git 证书与 HTTPS 的一个提示如果你所在的内网或公司环境用了自签名的 HTTPS 证书git clone时可能会报SSL certificate problem: self-signed certificate。网上的解决方案经常是让你全局关闭 SSL 验证git config --global http.sslVerify false我强烈不建议这么做因为这会让你后续所有的 HTTPS 推送都处于“裸奔”状态。正确做法是把公司或内网的自签名证书下载下来然后配置 Git 信任它git config --global http.sslCAInfo D:/certs/company-ca.pem路径里不要用反斜杠Git 在 Windows 下对路径分隔符的解析有时会和 shell 冲突统一用正斜杠最省事。如果确实拿不到证书文件再考虑局部仓库关闭校验并且只在可信任的内网仓库里用千万别在公共网络环境这样配置。这套流程走完你的 Windows 开发机基本上就有一套干净、顺手、不需要反复调试的 Git 环境了。后面无论你是 clone 开源项目、往 GitHub 上推自己的代码还是在公司 GitLab 协作都不会被“环境问题”卡住。我们平时写代码最怕的就是在一个坑里反复横跳Git 配置这种事一次性弄好后面几十年舒舒服服。