外观
Git 笔记
约 2279 字大约 8 分钟
2025-08-16
一、Git 简介
1.1 什么是 Git?
Git 是一个分布式版本控制系统,由 Linux 之父 Linus Torvalds 创建。它用于跟踪文件的变化,协调多个开发者之间的工作,记录项目的历史版本,是现代软件开发中不可或缺的工具。
1.2 Git 核心特点
- 分布式:每个开发者的电脑都是一个完整的版本库,无需联网也能提交历史
- 速度快:本地操作无需网络,提交、分支等操作极快
- 完整性:使用 SHA-1 哈希算法确保代码完整性
- 分支模型强大:创建、合并分支极其高效
- 开源免费:完全开源,被广泛采用和支持
1.3 版本控制系统对比
| 类型 | 代表 | 特点 | 局限性 |
|---|---|---|---|
| 本地版本控制 | RCS | 简单记录文件修改 | 仅适合个人,无协作能力 |
| 集中式版本控制 | SVN, CVS | 统一管理,权限控制好 | 依赖服务器,离线无法工作 |
| 分布式版本控制 | Git | 本地完整仓库,离线工作 | 学习曲线较陡 |
Git 的优势:
- 可以直接看到更新了哪些代码和文件
- 本地完整仓库,无需联网也能提交历史
- 分支操作极其高效,鼓励频繁使用分支
- 完整的历史记录,可以轻松回溯到任何版本
二、环境搭建
2.1 安装 Git
Windows:
- 访问 Git 官网 下载安装程序
- 按向导安装,推荐使用默认设置
- 安装完成后,可通过 Git Bash 或命令提示符使用 Git
Mac:
# 使用 Homebrew 安装
brew install gitLinux (Ubuntu):
sudo apt update
sudo apt install git2.2 基本配置
首次使用 Git 需要配置用户名和邮箱:
# 配置全局用户名(必填)
git config --global user.name "Your Name"
# 配置全局邮箱(必填)
git config --global user.email "your.email@example.com"
# 查看配置
git config --list常用配置项:
# 设置默认文本编辑器
git config --global core.editor "code --wait" # VS Code
# 设置默认分支名称
git config --global init.defaultBranch main
# 启用颜色显示
git config --global color.ui true2.3 常用命令速查
# 查看 Git 版本
git --version
# 查看命令帮助
git help <command>
git <command> --help三、Git 核心概念
3.1 工作流程
Git 有三个主要工作区域:
- 工作目录 (Working Directory):你实际编辑文件的地方
- 暂存区 (Staging Area/Index):临时存储即将提交的更改
- 仓库 (Repository):存储项目的完整历史记录

3.2 文件状态
- 未跟踪 (Untracked):新文件,不在 Git 仓库中
- 已修改 (Modified):已跟踪的文件被修改但未暂存
- 已暂存 (Staged):修改已放入暂存区,等待提交
- 已提交 (Committed):修改已提交到仓库
3.3 提交历史
- 每次提交都会生成一个唯一的 SHA-1 哈希值
- 提交包含:作者、时间戳、提交信息、文件快照
- 提交历史形成一个有向无环图 (DAG)
四、基础操作
4.1 初始化仓库
# 在当前目录创建 Git 仓库
git init
# 从远程仓库克隆
git clone https://github.com/user/repo.git4.2 文件操作
# 查看文件状态
git status
# 添加文件到暂存区
git add file.txt # 添加单个文件
git add . # 添加所有修改和新文件
git add -u # 添加所有修改(不包括新文件)
git add -A # 添加所有修改和新文件(等同于 git add .)
# 提交到仓库
git commit -m "提交信息" # 提交暂存区的更改
git commit -a -m "提交信息" # 跳过暂存区,直接提交所有修改
# 查看提交历史
git log # 查看完整历史
git log --oneline # 简洁显示
git log -p # 显示每次提交的差异
git log --graph # 以图形化方式显示分支4.3 撤销操作
# 撤销工作区修改(未添加到暂存区)
git checkout -- file.txt
# 从暂存区移除文件(保留工作区修改)
git reset HEAD file.txt
# 修改最后一次提交
git commit --amend
# 重置到特定提交
git reset --hard HEAD~1 # 回退到上一个提交
git reset --soft HEAD~1 # 保留修改,只重置提交五、分支管理
5.1 分支操作
# 查看分支
git branch # 列出本地分支
git branch -r # 列出远程分支
git branch -a # 列出所有分支
# 创建分支
git branch new-branch # 创建分支但不切换
git checkout -b new-branch # 创建并切换到新分支
# 切换分支
git checkout main # 切换到 main 分支
# 合并分支
git merge feature-branch # 将 feature-branch 合并到当前分支
# 删除分支
git branch -d branch-name # 安全删除(已合并)
git branch -D branch-name # 强制删除(未合并)5.2 分支策略
主流分支策略:
- Git Flow:适合有明确发布周期的项目
- GitHub Flow:适合持续交付的项目
- GitLab Flow:结合环境分支的策略
推荐简单工作流:
- 从 main 分支创建功能分支
- 在功能分支上开发
- 完成后提交 Pull Request (PR)
- 代码审查通过后合并到 main 分支
5.3 解决冲突
当合并分支时出现冲突:
- Git 会标记冲突文件
- 手动编辑文件解决冲突
- 标记冲突已解决:
git add file.txt - 完成合并:
git commit
冲突标记示例:
<<<<<<< HEAD
这是当前分支的代码
=======
这是要合并分支的代码
>>>>>>> feature-branch六、远程仓库
6.1 远程仓库操作
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
# 从远程仓库获取更新
git fetch origin # 获取所有分支的更新
git pull origin main # 获取并合并指定分支
# 推送本地更改到远程
git push -u origin main # 第一次推送需指定上游分支
git push # 后续推送6.2 分支跟踪
# 设置本地分支跟踪远程分支
git branch --set-upstream-to=origin/main main
# 简化命令(Git 2.0+)
git push -u origin main # 第一次推送时设置跟踪6.3 标签管理
# 创建标签
git tag v1.0.0 # 轻量标签
git tag -a v1.0.0 -m "版本1.0.0" # 附注标签
# 推送标签到远程
git push origin v1.0.0
git push origin --tags # 推送所有标签七、常用技巧
7.1 忽略文件
创建 .gitignore 文件,指定不需要跟踪的文件:
# 忽略所有 .log 文件
*.log
# 但保留 important.log
!important.log
# 忽略 build 目录
build/
# 忽略根目录下的 temp 文件
/temp
# 忽略所有 .tmp 文件,除了 lib.tmp
*.tmp
!lib.tmp常用忽略模式:
*:匹配任意字符?:匹配单个字符[abc]:匹配 a、b 或 c!:表示例外
7.2 暂存更改
# 暂存部分更改
git add -p # 交互式暂存
# 临时保存工作区更改
git stash # 保存当前工作
git stash pop # 恢复最近一次暂存
git stash list # 查看所有暂存
git stash apply stash@{1} # 应用特定暂存7.3 查看差异
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与最新提交的差异
git diff --cached
# 查看工作区与指定提交的差异
git diff commit-id
# 查看两个分支的差异
git diff main..feature-branch7.4 搜索历史
# 按内容搜索提交
git log -S "search term"
# 按文件名搜索
git log -- path/to/file
# 组合搜索
git log -p -S "functionName" -- src/八、最佳实践
8.1 提交规范
提交信息格式:
<type>(<scope>): <subject>
<body>
<footer>常用类型 (type):
feat:新功能fix:bug 修复docs:文档变更style:代码格式调整refactor:代码重构test:测试相关chore:构建或辅助工具变更
示例:
feat(user): add profile editing
- Add profile edit form
- Implement save functionality
- Add validation rules
Closes #1238.2 工作流程建议
- 频繁提交:小步快跑,每次提交只做一件事
- 原子提交:每个提交应包含一个完整的逻辑变更
- 及时拉取:经常从远程仓库拉取最新更改
- 分支策略:采用适合团队的分支管理策略
- 代码审查:通过 PR 进行代码审查
- 忽略生成文件:确保 .gitignore 完整
8.3 团队协作技巧
- 同步频率:每天至少同步一次远程仓库
- 分支命名:采用统一的分支命名规范(如 feature/xxx, bugfix/xxx)
- PR 规范:明确 PR 描述、关联 issue、测试结果
- 解决冲突:尽早解决冲突,避免大规模合并问题
- 版本标签:重要里程碑打上版本标签
九、常见问题解决
9.1 误提交大文件
# 从历史中移除大文件
git filter-repo --force --blob-callback '
if "path/to/large/file" in blob.path:
blob.skip() # 移除文件
'
# 强制推送到远程
git push origin --force --all
git push origin --force --tags9.2 修复错误的提交
# 修改最近一次提交
git add fixed-file.txt
git commit --amend
git push -f origin branch-name
# 修改更早的提交
git rebase -i HEAD~5 # 交互式 rebase
# 将要修改的提交前的 pick 改为 edit
# 修复问题后 git add && git commit --amend
# 完成 rebase: git rebase --continue9.3 恢复误删分支
# 查找分支的最后一次提交
git reflog
# 根据 reflog 中的提交 ID 恢复分支
git branch recovered-branch <commit-id>