一、Git 基础概念
1. 什么是版本控制
版本控制(Version Control)是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。常见版本控制工具对比如下:
| CVS | 集中式 | 1986 年 | 早期经典,已基本淘汰 |
| SVN | 集中式 | 2000 年 | 集中管理,需联网,权限控制强 |
| Git | 分布式 | 2005 年 | 离线工作,分支轻量,速度极快 |
2. 集中式 vs 分布式
| 仓库位置 | 只有中央服务器有完整仓库 | 每个开发者都有完整仓库副本 |
| 联网需求 | 必须联网才能提交 | 可离线提交,联网时再推送 |
| 分支成本 | 分支操作昂贵 | 分支操作极轻量(指针切换) |
| 单点故障 | 中央服务器挂了全停 | 任何一份副本都能恢复 |
| 速度 | 较慢 | 极快(本地操作) |
3. Git 工作区域
Git 的工作流程围绕三个区域展开:
| 工作区(Working Directory) | 你编辑文件的地方 | 直接编辑文件 |
| 暂存区(Staging Area / Index) | 临时存放待提交的改动 | git add |
| 本地仓库(Local Repository) | 提交后的历史记录 | git commit |
| 远程仓库(Remote Repository) | 服务器上的仓库(GitHub/Gitee) | git push / git pull |
文件状态流转:
未跟踪 ──git add──▶ 暂存区 ──git commit──▶ 本地仓库 ──git push──▶ 远程仓库
工作区 ◀──git restore── 暂存区 ◀──git restore –staged── 本地仓库
二、安装与配置
1. 下载安装 Git
-
Git 下载地址:Redirecting…
-
TortoiseGit 下载地址:Download – TortoiseGit – Windows Shell Interface to Git
安装完成后,打开终端验证:
git –version
# 输出: git version 2.49.0.windows.1
2. 全局配置
首次使用必须配置用户名和邮箱,这会出现在每次提交记录中:
# 设置用户名和邮箱(必做)
git config –global user.name "你的名字"
git config –global user.email "your-email@example.com"
# 查看所有配置
git config –list
# 设置默认编辑器(可选,需确保 code 命令在 PATH 中)
git config –global core.editor "code –wait" # VS Code
# 设置默认分支名为 main(可选,Git 2.28+)
git config –global init.defaultBranch main
3. SSH 密钥配置(免密推送)
每次 push 都输密码很烦,配置 SSH 密钥可以免密操作:
# 1. 生成 SSH 密钥(在 Git Bash 中执行)
ssh-keygen -t rsa -b 4096 -C "your-email@example.com"
# 连续回车使用默认路径即可
# 2. 查看公钥内容(复制整段输出)
# Git Bash:
cat ~/.ssh/id_rsa.pub
# PowerShell:
Get-Content ~/.ssh/id_rsa.pub
# CMD:
type %USERPROFILE%\\.ssh\\id_rsa.pub
# 3. 添加到 GitHub/Gitee
# GitHub: Settings → SSH and GPG keys → New SSH key → 粘贴公钥
# Gitee: 设置 → SSH公钥 → 粘贴公钥
# 4. 测试连接
ssh -T git@github.com
# 输出: Hi username! You've successfully authenticated…
三、本地仓库操作
1. 初始化与克隆
# 初始化一个新的 Git 仓库
git init
# 克隆远程仓库到本地
git clone https://github.com/user/repo.git
# 克隆指定分支
git clone -b develop https://github.com/user/repo.git
# 克隆到指定目录
git clone https://github.com/user/repo.git my-folder
2. 日常三板曲:add → commit → push
# 查看当前状态(最常用的命令)
git status
# 添加文件到暂存区
git add index.html # 添加单个文件
git add src/ # 添加整个目录
git add . # 添加所有变更
# 提交到本地仓库
git commit -m "feat: 添加用户登录功能"
# 推送到远程仓库
git push origin main
3. 提交规范(Conventional Commits)
好的提交信息能让团队协作更高效,推荐使用 Angular 团队的提交规范:
| feat | 新功能 | feat: 添加用户注册功能 |
| fix | 修复 Bug | fix: 修复登录页面空指针异常 |
| docs | 文档变更 | docs: 更新 README 安装步骤 |
| style | 代码格式(不影响逻辑) | style: 格式化 Login.cs 缩进 |
| refactor | 重构 | refactor: 提取公共验证逻辑 |
| test | 测试相关 | test: 添加 UserService 单元测试 |
| chore | 构建/工具变动 | chore: 升级 NuGet 包版本 |
4. 查看历史与差异
# 查看提交历史
git log
git log –oneline # 简洁模式(一行一条)
git log –graph –oneline –all # 图形化显示所有分支
git log -5 # 只看最近 5 条
# 查看文件修改详情
git log -p src/Program.cs # 某文件的修改历史
# 查看谁修改了每一行
git blame src/Program.cs
# 查看差异
git diff # 工作区 vs 暂存区
git diff –cached # 暂存区 vs 最新提交
git diff HEAD # 工作区 vs 最新提交
git diff main..feature # 两个分支顶端的差异(双点)
git diff main…feature # feature 相对于分叉点的变化(三点,更常用)
5. 撤销与回退
| git restore <file> | 撤销工作区修改 | 工作区 |
| git restore –staged <file> | 取消暂存 | 暂存区 |
| git reset –soft HEAD~1 | 回退提交,保留修改在暂存区 | 暂存区 + 仓库 |
| git reset –mixed HEAD~1 | 回退提交,取消暂存(工作区修改保留) | 暂存区 + 仓库(工作区不变) |
| git reset –hard HEAD~1 | 回退提交,丢弃所有修改 ⚠️ | 全部丢弃 |
| git revert <hash> | 反转某次提交(生成新提交) | 仓库(安全) |
# 撤销工作区的修改(未 add 时)
git restore src/Program.cs
# 取消暂存(已 add 但未 commit 时)
git restore –staged src/Program.cs
# 修改最后一次提交的信息
git commit –amend -m "fix: 修正提交信息"
# 安全回退(推荐,不丢失历史)
git revert abc1234
⚠️ git reset –hard 会丢失未提交的修改,慎用! 如果误操作,可用 git reflog 找回。
6. 暂存工作(Stash)
开发到一半需要紧急切分支修 Bug?用 stash 临时保存:
git stash # 暂存当前工作
git stash push -m "登录功能写一半" # 带描述的暂存(推荐,Git 2.16+)
git stash save "登录功能写一半" # 带描述的暂存(旧写法,仍可用但已不推荐)
git stash list # 查看暂存列表
git stash pop # 恢复最近一次暂存并删除
git stash apply # 恢复但不删除暂存记录
git stash drop # 删除最近一次暂存
git stash clear # 清空所有暂存
四、分支管理
1. 分支基本操作
# 查看分支
git branch # 本地分支
git branch -a # 所有分支(含远程)
git branch -v # 各分支最后一次提交
# 创建与切换
git branch feature-login # 创建分支
git switch feature-login # 切换分支(Git 2.23+)
git switch -c feature-login # 创建并切换(推荐)
# 合并分支
git switch main # 先切到目标分支
git merge feature-login # 合并功能分支
# 删除分支
git branch -d feature-login # 删除已合并的分支
git branch -D feature-login # 强制删除
git push origin –delete feature-login # 删除远程分支
2. Merge vs Rebase
这是 Git 中最经典的对比:
| 原理 | 创建合并提交,保留分支拓扑 | 重放提交到目标分支顶端 |
| 历史 | 非线性,呈网状 | 线性,更干净 |
| 冲突 | 最多解决一次 | 每个被重放的提交都可能冲突 |
| 安全 | 不改写历史 | 改写提交 hash |
| 适用 | 公共分支、保留协作记录 | 个人分支、整理提交历史 |
# Merge 方式
git switch main
git merge feature # 产生一个 merge commit
# Rebase 方式
git switch feature
git rebase main # 将 feature 的提交"接"到 main 最新节点之后
推荐工作流:
# 1. 在 feature 分支开发完成
# 2. 先 rebase 到最新 main
git switch feature
git rebase main
# 3. 解决冲突(如有),然后 fast-forward merge
git switch main
git merge feature # 此时无冲突,线性历史
⚠️ 黄金法则:永远不要 rebase 已推送到公共仓库的提交! Rebase 会改写 commit hash,影响其他协作者。
3. 冲突解决
当两个分支修改了同一文件的同一区域,合并时会产生冲突:
# 冲突文件中会出现标记
<<<<<<< HEAD
当前分支的内容
=======
要合并进来的分支的内容
>>>>>>> feature
# 解决步骤:
# 1. 手动编辑文件,保留正确内容,删除冲突标记
# 2. 添加到暂存区
git add src/Program.cs
# 3. 完成合并(二选一)
git merge –continue # 推荐,自动使用合并信息
# 或
git commit -m "merge: 解决 Program.cs 冲突" # 手动指定提交信息
# 如果是 rebase 冲突,解决后用:
git rebase –continue
4. Gitflow 分支策略
适合大型项目和多版本并行维护的团队:
| 主分支 | main / master | 永久 | 生产环境代码 |
| 开发分支 | develop | 永久 | 最新开发进度集成 |
| 功能分支 | feature/* | 临时 | 新功能开发 |
| 发布分支 | release/* | 临时 | 版本发布准备 |
| 热修复分支 | hotfix/* | 临时 | 生产环境紧急修复 |
# 典型 Gitflow 流程
git switch -c feature/user-login develop # 从 develop 创建功能分支
# …开发完成后
git switch develop
git merge –no-ff feature/user-login # 合并回 develop
git branch -d feature/user-login
# 发布
git switch -c release/1.0.0 develop
# …测试修复完成后
git switch main
git merge –no-ff release/1.0.0
git tag -a v1.0.0 -m "版本 1.0.0"
git push origin v1.0.0 # 推送标签到远程
git switch develop
git merge –no-ff release/1.0.0
💡 小团队/快速迭代项目推荐使用更简单的 GitHub Flow:只有 main + 功能分支,通过 Pull Request 合并。
五、远程仓库协作
1. 远程仓库管理
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
# 修改远程地址
git remote set-url origin https://github.com/user/new-repo.git
# 拉取远程更新(不自动合并)
git fetch origin
# 拉取并合并(= fetch + merge)
git pull origin main
# 推送到远程
git push origin main
2. Push 之前先 Pull
多人协作的核心习惯——下班前推送代码时,一定先同步远程:
# 正确流程
git pull origin main # 1. 先拉取远程最新代码
# 如有冲突,解决冲突
git push origin main # 2. 再推送自己的代码
3. Fork + Pull Request 工作流
这是开源项目和跨团队协作的标准流程:
1. Fork 他人仓库 → 你的 GitHub 账号下出现一份副本
2. Clone 你 Fork 的仓库到本地
3. 创建功能分支,进行开发
4. Push 到你的远程仓库
5. 向原仓库发起 Pull Request(PR)
6. 原仓库维护者 Review → 合并
# Fork 后克隆
git clone https://github.com/your-username/repo.git
cd repo
# 添加原仓库为 upstream
git remote add upstream https://github.com/original-owner/repo.git
# 同步原仓库更新
git fetch upstream
git merge upstream/main
git push origin main # 同步到自己 Fork 的远程仓库
# 开发新功能
git switch -c feature/my-feature
# …提交推送后,在 GitHub 上发起 PR
4. 远程仓库平台
| GitHub | https://github.com | 全球最大开源社区,微软旗下 |
| Gitee(码云) | https://gitee.com | 国内平台,访问速度快 |
| GitLab | https://gitlab.com | 支持自建,CI/CD 集成强 |
| Bitbucket | https://bitbucket.org | Atlassian 生态,私有仓库免费 |
六、Visual Studio 中使用 Git
1. 创建项目并推送到 GitHub
# 步骤:
# 1. 打开 Visual Studio,登录微软账号(使用与 GitHub 相同的邮箱)
# 2. 创建新项目
# 3. 在「Git 菜单」→「创建 Git 存储库」
# 4. 选择 GitHub,填写仓库名,点击「创建并推送」
2. 克隆远程项目到 VS
# 步骤:
# 1. 打开 Visual Studio → 选中「克隆存储库」
# 2. 输入远程仓库地址,如 https://github.com/user/repo.git
# 3. 选择本地存储路径,点击「克隆」
# 4. 等待加载完成
# 5. 右键解决方案 → 还原 NuGet 包
⚠️ 克隆后如果出现程序集缺失,右键解决方案 → 还原 NuGet 包即可。
3. VS 中 Git 常用操作
| 查看更改 | Git 菜单 → 更改 |
| 暂存并提交 | 更改页面 → 输入消息 → 全部提交 |
| 推送 | Git 菜单 → 推送 |
| 拉取 | Git 菜单 → 拉取 |
| 创建分支 | Git 菜单 → 新建分支 |
| 合并分支 | Git 菜单 → 管理分支 → 右键合并 |
| 查看历史 | Git 菜单 → 查看 Git 历史 |
七、GitHub 加速与常见问题
1. GitHub 打不开 / 访问缓慢
国内访问 GitHub 经常不稳定,推荐使用 Watt Toolkit 加速:
# 步骤:
# 1. 打开微软商店,搜索「Watt Toolkit」并安装
# 2. 打开软件 → 点击「网络加速」
# 3. 勾选 GitHub
# 4. 点击「一键加速」
2. 常见错误排查
错误1:fatal: not a git repository
-
现象:执行 Git 命令报错 not a git repository
-
原因:当前目录不是 Git 仓库
-
解决:
# 进入已有的 Git 仓库目录
cd C:\\Projects\\your-repo
# 或者初始化一个新仓库
git init
错误2:error: failed to push some refs
-
现象:push 被拒绝
-
原因:远程有本地没有的提交(别人先 push 了)
-
解决:
# 先拉取远程更新
git pull origin main
# 解决冲突后重新推送
git push origin main
错误3:合并冲突标记残留
-
现象:代码中出现 <<<<<<< / ======= / >>>>>>>
-
原因:冲突未正确解决就提交了
-
解决:
# 搜索冲突标记
grep -rn "<<<<<<" src/
# 手动编辑,保留正确内容,删除冲突标记
# 重新提交
git add .
git commit -m "fix: 清理冲突标记"
错误4:误删分支
-
现象:git branch -D 删除了还有用的分支
-
解决:
# 查看所有操作记录
git reflog
# 找到删除前的 commit hash
git switch -c recovered-branch abc1234
错误5:提交了不该提交的文件(如 .env、bin/)
-
现象:密码、编译产物被提交到仓库
-
解决:
# 1. 从暂存区移除(不删除本地文件)
git rm –cached .env
git rm -r –cached bin/
# 2. 添加到 .gitignore
echo ".env" >> .gitignore
echo "bin/" >> .gitignore
# 3. 提交
git add .gitignore
git commit -m "chore: 移除敏感文件并添加 .gitignore"
八、.gitignore 配置
项目根目录创建 .gitignore 文件,告诉 Git 哪些文件不需要追踪:
# 编译产物
bin/
obj/
*.exe
*.dll
*.pdb
*.cache
# IDE 配置
.vs/
.vscode/
*.user
*.suo
# 环境变量 / 敏感信息
.env
appsettings.Development.json
# 系统文件
Thumbs.db
.DS_Store
# NuGet 包
packages/
*.nupkg
# 测试
TestResults/
# 日志
*.log
💡 已经被追踪的文件不会被 .gitignore 忽略,需要先 git rm –cached 移除追踪。
九、常用命令速查表
| 初始化仓库 | git init |
| 克隆仓库 | git clone <url> |
| 查看状态 | git status |
| 添加到暂存区 | git add . |
| 提交 | git commit -m "消息" |
| 推送 | git push origin <branch> |
| 拉取 | git pull origin <branch> |
| 创建分支 | git switch -c <name> |
| 切换分支 | git switch <name> |
| 合并分支 | git merge <name> |
| 查看日志 | git log –oneline –graph –all |
| 撤销修改 | git restore <file> |
| 取消暂存 | git restore –staged <file> |
| 回退提交 | git revert <hash> |
| 暂存工作 | git stash / git stash pop |
| 查看差异 | git diff |
| 查看远程 | git remote -v |
| 创建标签 | git tag -a v1.0 -m "版本1.0" |
| 推送标签 | git push origin v1.0 / git push origin –tags |
| 查看操作记录 | git reflog |
总结
-
Git 是分布式版本控制,每个开发者都拥有完整的仓库副本,可离线工作
-
日常开发核心流程:add → commit → push,推送前先 pull 同步远程
-
分支是 Git 的灵魂,功能分支开发 + PR 合并是现代协作的标准模式
-
Merge 保留历史、Rebase 保持线性,公共分支用 merge,个人分支用 rebase
-
遵循提交规范(Conventional Commits)让项目历史清晰可读
-
遇到问题不要慌,git reflog 是最后的救命稻草
相关资源
-
Git 官方文档
-
菜鸟教程 Git 教程


