这篇文章整理了在 Windows 上从零使用 Git 的完整流程:安装、必要配置、连接 GitHub(SSH 与 HTTPS 两种方式)、日常命令,以及最容易卡住的几类报错。目标很简单——照着做能跑通,出问题时也能快速定位。
本文覆盖:
先看懂下面这张图:几乎所有日常命令,都是在这四个区域之间搬运内容。
官方下载地址:https://git-scm.com/download/win(会自动给出 Git for Windows 的安装包)。
提示:国内下载慢怎么办
官网在海外,国内下载可能很慢或中断。可改用以下镜像之一:
- 中科大:
https://mirrors.ustc.edu.cn/git/- 清华大学:
https://mirrors.tuna.tsinghua.edu.cn/git/- 阿里云(npmmirror):
https://registry.npmmirror.com/binary.html?path=git-for-windows/也可直接到 GitHub Release 页面下载:
https://github.com/git-for-windows/git/releases。
安装向导基本一路 Next 即可,但下面几屏建议留意:
| 安装步骤 | 推荐选择 | 说明 |
|---|---|---|
| 默认编辑器 | VS Code(若已装),否则用 Vim | 提交时弹出的编辑器,新手用 VS Code 更友好 |
| 默认分支名 | main | 与 GitHub 默认保持一致 |
| PATH 环境变量 | Git from the command line and also from 3rd-party software | 让 cmd / PowerShell / 其他软件都能调用 git |
| HTTPS 传输后端 | OpenSSL | 一般默认即可 |
| 换行符处理 | Checkout Windows-style, commit Unix-style | 即 autocrlf=true,Windows 上的推荐设置 |
| 凭据管理器 | Git Credential Manager | 关键项,负责记住 GitHub 账号,省去每次输密码 |
注意:换行符(CRLF / LF)
Windows 用 CRLF,Linux / macOS 用 LF。团队协作里换行符不统一,会导致整文件被标记为改动的"假 diff"。Windows 上推荐
autocrlf=true,详见下文配置。
安装完打开 Git Bash 或 PowerShell:
git --version
能打印出版本号即成功。Git for Windows 自带的 Git Bash 是一个类 Unix 终端,后面的命令在它里面运行最省心。
重要:装好后第一件必做的事
配置提交身份。下面这两行决定了每次提交记录里"作者是谁",必须最先设置。注意它只是写进提交记录的署名信息,和后面登录 GitHub 的认证是两回事——它不会让你获得推送权限,推送权限由第三章的 SSH 或 PAT 决定。
# 设置提交署名:用户名 + 邮箱(建议用 GitHub 注册邮箱)
git config --global user.name "你的名字"
git config --global user.email "you@example.com"
# 以下均为可选项
# 默认分支名设为 main
git config --global init.defaultBranch main
# Windows 推荐的换行符处理
git config --global core.autocrlf true
# 设置默认编辑器为 VS Code
git config --global core.editor "code --wait"
# 让中文文件名正常显示,而不是一串八进制转义
git config --global core.quotepath false
查看与定位配置:
git config --list # 查看所有生效的配置
git config --global --edit # 直接打开全局配置文件编辑
git config user.email # 查看某一项
说明:配置的三个层级
--system(整机)<--global(当前用户,文件在C:\Users\你\.gitconfig)< 仓库本地(项目目录的.git/config)。范围越小,优先级越高。
有两种主流方式,选一种即可。SSH 一次配置长期免密;HTTPS 配合凭据管理器在 Windows 上几乎零配置。两者都很常用。
ssh-keygen -t ed25519 -C "you@example.com"
一路回车即可(密钥默认存到 C:\Users\你的用户名\.ssh\id_ed25519,passphrase 可留空)。
老系统不支持 ed25519 时,改用 ssh-keygen -t rsa -b 4096 -C "you@example.com";此时密钥文件名为 id_rsa 与 id_rsa.pub,同样位于 .ssh 文件夹下。
密钥生成后,会在 C:\Users\你的用户名\.ssh\ 下得到两个文件:
id_ed25519 —— 私钥,绝不外传,留在本机id_ed25519.pub —— 公钥,要贴到 GitHub 上的就是它打开 id_ed25519.pub,把里面一整行内容复制下来,两种方式任选:
用记事本打开:在文件资源管理器进入 C:\Users\你的用户名\.ssh\,右键 id_ed25519.pub,用记事本打开后全选复制。
或在 Git Bash 里打印出来再手动复制:
cat ~/.ssh/id_ed25519.pub
内容形如 ssh-ed25519 AAAA... you@example.com。
注意:只复制
.pub公钥千万不要把没有
.pub后缀的私钥贴出去。
打开设置页面(需登录):https://github.com/settings/keys
点 New SSH key,Title 随便填(如"我的笔记本"),在 Key 框里粘贴刚才的公钥,再点 Add SSH key。
页面路径也可手动找到:GitHub 右上角头像 → Settings → SSH and GPG keys → New SSH key。
ssh -T git@github.com
说明:首次连接会询问"主机指纹"
第一次连 GitHub,SSH 会提示这台主机不在已知列表里,显示一段指纹并询问:
The authenticity of host 'github.com (...)' can't be established. ED25519 key fingerprint is SHA256:... Are you sure you want to continue connecting (yes/no/[fingerprint])?输入
yes回车即可。这是正常步骤,只在第一次出现,它会把 GitHub 记进known_hosts。
看到 Hi 用户名! You've successfully authenticated... 就成功了。之后克隆 / 推送使用 SSH 地址:
git clone git@github.com:用户名/仓库名.git
说明:这种方式不涉及 SSH
走 HTTPS 就不用生成密钥、不用贴公钥,也没有上面的主机指纹确认。只需要一个令牌(PAT),再让 Windows 凭据管理器记住它即可。
注意:GitHub 已不支持账号密码做 Git 操作
用 HTTPS 时,密码位置要填 Personal Access Token(PAT),而不是登录密码。
GitHub 网页路径:Settings → Developer settings → Personal access tokens → Tokens (classic) → Generate new token,勾选 repo 权限,生成后立即复制保存(只显示一次)。
用 HTTPS 地址克隆 / 推送时会弹出登录框(或命令行提示):用户名填 GitHub 用户名,密码处粘贴刚才的 PAT。
git clone https://github.com/用户名/仓库名.git
输入一次后,Git Credential Manager 会帮你记住,后续不再询问。
打开任意仓库主页,点绿色的 Code 按钮,会看到三种取法:
| 方式 | 怎么做 | 适合 |
|---|---|---|
| HTTPS 克隆 | Code → Local → HTTPS,复制 https://github.com/...git | 用方式 B(PAT)的人 |
| SSH 克隆 | Code → Local → SSH,复制 git@github.com:....git | 已配好方式 A(SSH)的人 |
| 下载 ZIP | Code → Download ZIP | 只想要代码、不打算用 Git 跟踪 |
克隆(会保留 Git 历史,可后续 pull / push):
git clone <复制来的地址>
提示:克隆 vs 下载 ZIP
克隆得到的是一个完整 Git 仓库,能拉取更新、提交、推送;下载 ZIP 只是某一刻的代码快照,没有
.git,无法用 Git 命令同步。想参与开发就用克隆。
这一章只解决一个问题:用 HTTPS 时不必每次都输 PAT。(用方式 A SSH 的人基本可以跳过本章。)
安装 Git for Windows 时勾选的 Git Credential Manager(GCM) 会自动处理这件事:
通常什么都不用配。只在出问题时才需要下面这两条:
# 查看当前用的凭据助手(正常会显示 manager)
git config --global credential.helper
# 万一没生效,手动指定为 GCM
git config --global credential.helper manager
提示:换了账号 / 想重新登录
打开 Windows 搜索「凭据管理器」→「Windows 凭据」,找到
git:https://github.com删除,下次操作会重新要求登录。
命令行高效,但有些操作用图形界面更直观、更不容易出错。常用 GUI 有:GitHub Desktop、Sourcetree、VS Code 内置 Git 面板、GitKraken、TortoiseGit。
GUI 更适合做这些
- 解决合并冲突:三方对比界面直接挑选保留哪边,比命令行手动编辑冲突标记清晰得多。
- 查看历史与 diff:浏览提交图、分支走向、逐行改动,GUI 一目了然。
- 交互式 rebase / 整理提交:拖拽调整顺序、合并(squash)、改写提交信息,可视化操作不易出错。
- 挑选要暂存的具体行(hunk staging):VS Code / Sourcetree 里勾选某几行加入暂存区,比
git add -p直观。- 撤销 / 回退某次提交:对着提交图右键操作,降低误删风险。
- 管理分支、查看远程状态:分支多时图形化更省脑。
命令行更适合
批量 / 脚本化操作、远程服务器无图形界面、需要精确控制的场景,仍然首选命令行。多数人的习惯是:GUI 看历史和解冲突,命令行做日常提交推送,两者混用。
git init # 当前目录初始化为 Git 仓库
git clone <url> # 克隆远程仓库
git clone <url> 目录名 # 克隆到指定目录
git status # 查看当前改动状态
git diff # 工作区 vs 暂存区的改动
git diff --staged # 暂存区 vs 上次提交的改动
git log --oneline --graph --all # 精简的图形化提交历史
git add 文件名 # 暂存指定文件
git add . # 暂存所有改动
git add -p # 交互式选择要暂存的片段
git commit -m "提交说明" # 提交
git commit -am "说明" # 已跟踪文件:暂存 + 提交一步完成
git commit --amend # 修改上一次提交(信息或内容)
git branch # 列出本地分支
git branch <名> # 新建分支
git switch <名> # 切换分支(新语法)
git switch -c <名> # 新建并切换
git checkout <名> # 切换分支(老语法,仍常用)
git merge <名> # 把指定分支合并到当前分支
git branch -d <名> # 删除分支
git remote -v # 查看远程地址
git remote add origin <url> # 添加远程仓库
git remote set-url origin <url># 修改远程地址
git fetch # 抓取远程更新(不合并)
git pull # 抓取并合并(= fetch + merge)
git push # 推送当前分支
git push -u origin main # 首次推送并建立追踪关系
git push origin --delete <名> # 删除远程分支
git restore 文件名 # 丢弃工作区改动(新语法)
git restore --staged 文件名 # 取消暂存(保留改动)
git reset --soft HEAD~1 # 撤销上次提交,改动留在暂存区
git reset --hard HEAD~1 # 撤销上次提交并丢弃改动(慎用)
git revert <commit> # 用一次新提交来撤销某次提交(安全,适合已推送的)
警告:
reset --hard不可逆
--hard会直接丢弃改动。推送前的本地操作还能靠git reflog找回,但养成习惯前请先确认没有未保存内容。
git stash # 临时收起当前改动(同步进度时有时需要)
git stash list # 查看储藏列表
git stash pop # 恢复最近一次储藏并删除记录
git stash apply # 恢复但保留记录
git tag # 列出标签
git tag v1.0.0 # 打轻量标签
git tag -a v1.0.0 -m "说明" # 打带注释标签
git push origin v1.0.0 # 推送指定标签
git push origin --tags # 推送所有标签
看到报错先别慌,大多是下面这几种:
| 报错(关键字) | 原因 | 解决 |
|---|---|---|
fatal: not a git repository | 当前目录不是 Git 仓库 | cd 进项目目录,或先 git init |
Permission denied (publickey) | SSH 公钥没加到 GitHub 或未生效 | 重新执行 ssh -T git@github.com 排查;确认公钥已加到 https://github.com/settings/keys |
Support for password authentication was removed / Authentication failed | HTTPS 用了登录密码而非 PAT,或 PAT 过期 | 改用 PAT;在 Windows 凭据管理器删掉旧的 git:https://github.com 后重登 |
failed to push some refs / Updates were rejected(non-fast-forward) | 远程有你本地没有的提交 | 先 git pull 合并,再 git push |
Your branch and 'origin/main' have diverged | 本地和远程各自有新提交 | git pull(必要时 git pull --rebase)解决后再推 |
CONFLICT (content): Merge conflict in ... | 合并 / 拉取产生冲突 | 打开文件处理 <<<<<<< ======= >>>>>>> 标记,留下想要的内容,再 git add + git commit(推荐用 GUI 解,见第五章) |
error: Your local changes would be overwritten by merge | 有未提交改动挡住了合并 | 先 git commit 或 git stash 收起改动,再操作 |
fatal: remote origin already exists | origin 已存在 | 用 git remote set-url origin <新地址> 修改,而不是再 add |
fatal: refusing to merge unrelated histories | 本地新仓库去连一个已有 README 的远程仓库,两边历史无关 | git pull origin main --allow-unrelated-histories |
warning: LF will be replaced by CRLF | 换行符自动转换的提示 | 不是错误,可忽略;由第二章的 core.autocrlf 控制 |
万能急救
- 不确定当前状态时,先
git status,它的提示里常常直接给了下一步命令。- 提交搞乱了想反悔,先别急着
reset --hard,用git reflog找回历史。
.gitignore
在仓库根目录建
.gitignore,写入不想被 Git 跟踪的文件 / 目录(如node_modules/、.env、*.log)。模板参考:https://github.com/github/gitignore。
reflog 是后悔药
几乎所有"丢失"的提交都能用
git reflog找回,它记录了 HEAD 的每一次移动。
让已经误传的文件重新被忽略
.gitignore只对"还没被跟踪"的文件生效。如果文件在加进.gitignore之前就已经提交过(比如不小心传了.env),需要先把它从 Git 的跟踪里移除。只取消跟踪指定文件 / 目录(推荐,影响最小):
git rm --cached 文件名 # 单个文件 git rm --cached -r 目录名/ # 整个目录 git commit -m "停止跟踪 xxx"或按
.gitignore一次性重整所有已跟踪文件:git rm -r --cached . # 从索引移除全部(本地磁盘文件不动) git add . # 重新添加,会自动跳过 .gitignore 里的文件 git commit -m "Apply .gitignore"三点注意:
--cached只把文件移出 Git 跟踪,本地磁盘上的文件不会被删除。- 这是一次"删除"提交,协作者 pull 后该文件会从他们的工作区消失,记得知会一声。
- 它不会清除历史。若误传的是密码 / 密钥等敏感信息,旧提交里仍能翻到,需用
git filter-repo或 BFG 重写历史,并立即作废已泄露的凭据。
https://git-scm.com/dochttps://git-scm.com/book/zh/v2https://docs.github.com