Git 使用指南:从入门到团队协作
摘要:Git 是团队协作与个人开发中不可或缺的版本控制工具。本文从 Git 的核心概念讲起,涵盖安装配置、日常提交、分支管理、远程协作、冲突解决、撤销恢复等高频场景,并附上常用命令速查表与最值得记住的工作习惯,帮助你快速上手并在实战中避开常见陷阱。
1. Git 是什么
Git 是一种分布式版本控制系统,用于记录文件变化、保存项目历史,并支持多人并行开发。每位开发者本地通常都拥有完整的仓库副本和提交历史,因此许多操作可以在本地完成。
Git 的核心工作流程可以理解为:
sql
工作区(Working Directory)
↓ git add
暂存区(Staging Area / Index)
↓ git commit
本地仓库(Local Repository)
↓ git push
远程仓库(Remote Repository)
- 工作区:正在编辑的项目文件。
- 暂存区:准备放入下一次提交的内容。
- 本地仓库 :保存在
.git目录中的提交历史。 - 远程仓库:GitHub、GitLab、Gitee 等服务器上的共享仓库。
git add 并不只是"开始跟踪文件",而是把文件当前的内容快照 放入暂存区;之后再次修改该文件,需要重新执行 git add,新修改才会进入下一次提交。
2. 安装与初始配置
2.1 检查 Git
css
git --version
2.2 配置提交身份
第一次使用 Git 时,应设置用户名和邮箱,它们会被记录在提交信息中。
arduino
git config --global user.name "你的名字"
git config --global user.email "your_email@example.com"
查看配置:
lua
git config --list
git config --global --list
可以设置默认分支名和编辑器:
css
git config --global init.defaultBranch main
git config --global core.editor "code --wait"
其中,--global 表示配置作用于当前用户;如果去掉它并在某个仓库中执行,则配置只作用于该仓库。
3. 创建或获取仓库
3.1 初始化一个新项目
perl
mkdir my-project
cd my-project
git init
git init 会在当前目录中创建 .git 隐藏目录,用来保存对象、引用、配置和版本历史。
第一次提交:
sql
git status
git add .
git commit -m "chore: 初始化项目"
3.2 克隆已有项目
bash
git clone https://github.com/username/repository.git
使用 SSH 地址:
bash
git clone git@github.com:username/repository.git
克隆到指定目录:
xml
git clone <仓库地址> <本地目录名>
git clone 会获取项目文件及其版本历史,并自动配置名为 origin 的远程仓库。
4. 日常开发工作流
4.1 查看状态
lua
git status
git status -s
建议在添加、提交、拉取或切换分支之前先执行 git status,确认当前分支和文件状态。
4.2 查看修改内容
bash
# 工作区与暂存区之间的差异
git diff
# 暂存区与当前提交之间的差异
git diff --cached
# 工作区与当前提交之间的全部差异
git diff HEAD
git diff --cached 显示下一次提交将包含的内容,而普通的 git diff 显示尚未加入暂存区的修改。
4.3 添加到暂存区
csharp
# 添加一个文件
git add README.md
# 添加多个文件
git add src/app.js src/index.js
# 添加当前目录下的全部变化
git add .
# 交互式选择部分修改
git add -p
不建议在未检查状态时机械地执行 git add .。更稳妥的做法是只添加与当前任务有关的文件,使一次提交只解决一个相对独立的问题。
4.4 提交修改
sql
git commit -m "feat: 添加用户登录功能"
提交信息建议使用简短标题概括修改;如果需要详细说明,可以在标题后空一行,再写正文。Git 官方教程建议标题保持简短,通常不超过约 50 个字符。
常见提交类型:
makefile
feat: 新功能
fix: 修复问题
docs: 文档修改
style: 格式调整,不改变程序逻辑
refactor: 代码重构
test: 测试相关
chore: 构建、依赖或工具调整
示例:
sql
git commit -m "fix: 修复登录状态失效问题"
git commit -m "docs: 补充项目部署说明"
git commit -m "refactor: 拆分用户认证模块"
4.5 git commit -a 的限制
sql
git commit -am "fix: 更新页面样式"
git commit -a 会自动暂存并提交已经被 Git 跟踪的修改或删除文件 ,但不会自动包含新创建的未跟踪文件;新文件仍须先执行 git add。
5. 查看历史与定位问题
5.1 查看提交历史
lua
git log
git log --oneline
git log --oneline --graph --decorate --all
git log --stat
git log -p
--oneline:每个提交显示一行。--graph:显示分支图。--decorate:显示分支、标签和 HEAD。--stat:显示修改文件及行数统计。-p:显示每次提交的具体差异。
Git 官方文档也推荐通过 git log -p 查看完整差异,或通过 git log --stat --summary 快速了解修改概况。
5.2 查看某次提交
sql
git show <commit-id>
查看某次提交中的特定文件:
ruby
git show <commit-id>:path/to/file
5.3 查看某行由谁修改
bash
git blame path/to/file
6. 分支管理
分支代表一条独立的开发线,可以在不影响主分支的情况下开发功能或修复问题。
6.1 查看、创建和切换分支
bash
# 查看本地分支
git branch
# 查看本地与远程分支
git branch -a
# 创建分支
git branch feature/login
# 切换分支
git switch feature/login
# 创建并切换
git switch -c feature/login
旧版本 Git 也可使用:
bash
git checkout feature/login
git checkout -b feature/login
git switch 的语义更明确;git checkout 是传统命令,同时还承担恢复文件等其他功能。
6.2 推荐分支命名
bash
feature/login 新功能
fix/login-timeout 普通问题修复
hotfix/security 紧急线上修复
release/v1.2.0 发布准备
6.3 合并分支
功能开发完成后:
arduino
git switch main
git merge feature/login
删除已经合并的分支:
bash
git branch -d feature/login
强制删除未合并分支:
bash
git branch -D feature/login
如果当前分支没有产生新的分叉提交,Git 可能执行 Fast-forward ,即直接向前移动分支指针,不创建额外的合并提交;使用 git merge --no-ff 可以强制生成合并提交。
7. 远程仓库与团队协作
7.1 管理远程仓库
csharp
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin <仓库地址>
# 查看远程仓库详细信息
git remote show origin
7.2 推送分支
第一次推送:
css
git push -u origin main
后续可以简写:
perl
git push
推送功能分支:
bash
git push -u origin feature/login
-u 会建立本地分支与远程分支的上游关联,以后可直接使用 git push 和 git pull。
7.3 获取远程更新
bash
# 获取远程信息,但不立即合并
git fetch origin
# 将远程 main 合并到当前分支
git merge origin/main
也可以直接执行:
css
git pull origin main
git fetch 只获取远程更新,便于检查后再决定如何整合;git pull 会获取更新并继续执行合并等整合操作,因此团队协作中分步使用 fetch 通常更容易观察变化。
7.4 常见 Pull Request 流程
markdown
1. 更新本地主分支
2. 从主分支创建功能分支
3. 开发、测试并提交
4. 将功能分支推送到远程
5. 创建 Pull Request
6. 进行代码审查
7. 合并到主分支
8. 删除已完成的功能分支
功能分支工作流可以隔离不同任务,Pull Request 则用于审查、讨论和合并修改。
8. 冲突解决
当不同分支修改了同一文件的同一区域时,Git 可能无法自动决定保留哪一份内容,需要手动解决。
冲突文件通常包含:
markdown
<<<<<<< HEAD
当前分支的内容
=======
待合并分支的内容
>>>>>>> feature/login
解决步骤:
bash
# 1. 查看冲突文件
git status
# 2. 手动编辑文件,删除冲突标记并保留正确内容
# 3. 标记冲突已解决
git add path/to/conflicted-file
# 4. 完成合并
git commit
冲突的基本处理方式是:编辑冲突文件、删除标记、执行 git add,然后提交合并结果。
如果想放弃当前合并:
sql
git merge --abort
如果冲突发生在变基过程中:
csharp
git add <已解决的文件>
git rebase --continue
放弃变基:
c
git rebase --abort
9. 撤销、恢复与临时保存
这一部分操作风险较高,执行前应先运行 git status 和 git log --oneline。
9.1 取消暂存
css
git restore --staged README.md
这只会把文件移出暂存区,不会删除工作区中的修改。较旧的写法是:
perl
git reset HEAD README.md
9.2 放弃未提交修改
git restore README.md
放弃全部未提交修改:
erlang
git restore .
这些操作会覆盖工作区内容,应确认修改确实不再需要。
9.3 修改最后一次提交
只修改提交信息:
sql
git commit --amend -m "新的提交信息"
把遗漏文件加入最后一次提交:
sql
git add forgotten-file
git commit --amend --no-edit
如果该提交已经推送并被其他人使用,不宜随意 amend,因为它会改写提交历史。
9.4 撤销最近一次提交
保留修改和暂存状态:
css
git reset --soft HEAD~1
保留工作区修改,但取消暂存:
perl
git reset HEAD~1
删除提交及其修改:
css
git reset --hard HEAD~1
--hard 会重置提交、暂存区和工作区,可能导致未保存的修改丢失;--soft 则撤销提交但保留修改。
9.5 撤销已经公开的提交
python
git revert <commit-id>
revert 会创建一个新的反向提交,不直接删除原历史,通常更适合撤销已经推送到共享仓库的提交。
9.6 临时保存未完成工作
perl
git stash
git stash push -m "正在开发登录页面"
git stash list
git stash pop
区别:
perl
git stash apply # 恢复,但保留 stash 记录
git stash pop # 恢复,并删除对应 stash 记录
git stash drop stash@{0}
git stash clear
stash 适合在当前任务未完成、但需要临时切换分支时保存工作现场。
9.7 找回误删的提交
git reflog
找到目标提交后,可以创建恢复分支:
r
git switch -c recovery-branch <commit-id>
git reflog 会记录本地引用的移动情况,可用于寻找因 reset、rebase 或误删分支而暂时不可见的提交。
10. 标签与发布
标签通常用于标记版本或重要里程碑。
10.1 创建标签
轻量标签:
git tag v1.0.0
附注标签:
arduino
git tag -a v1.0.0 -m "正式发布 v1.0.0"
附注标签会保存标签者、日期和说明,更适合正式发布;轻量标签只是指向某个提交的引用。
10.2 查看和推送标签
perl
git tag
git show v1.0.0
# 推送一个标签
git push origin v1.0.0
# 推送全部标签
git push origin --tags
10.3 删除标签
删除本地标签:
git tag -d v1.0.0
删除远程标签:
perl
git push origin --delete v1.0.0
常用命令速查表
| 场景 | 命令 |
|---|---|
| 初始化仓库 | git init |
| 克隆仓库 | git clone <url> |
| 查看状态 | git status |
| 查看未暂存差异 | git diff |
| 查看已暂存差异 | git diff --cached |
| 暂存文件 | git add <file> |
| 提交修改 | git commit -m "message" |
| 查看历史 | git log --oneline --graph --all |
| 创建并切换分支 | git switch -c <branch> |
| 合并分支 | git merge <branch> |
| 获取远程更新 | git fetch origin |
| 拉取并整合 | git pull |
| 推送分支 | git push -u origin <branch> |
| 取消暂存 | git restore --staged <file> |
| 放弃工作区修改 | git restore <file> |
| 临时保存修改 | git stash |
| 恢复临时修改 | git stash pop |
| 撤销公开提交 | git revert <commit> |
| 查找丢失提交 | git reflog |
| 创建版本标签 | git tag -a v1.0.0 -m "说明" |
最值得记住的工作习惯
- 操作前先执行
git status。 - 提交前检查
git diff和git diff --cached。 - 一次提交只完成一个相对独立的任务。
- 提交信息要说明"做了什么",必要时补充"为什么"。
- 新功能和问题修复尽量使用独立分支。
- 推送前先同步远程更新,并完成测试。
- 谨慎使用
reset --hard、branch -D和强制推送。 - 已经共享的历史优先使用
revert撤销,不轻易改写。 .env、密钥、密码和个人配置应写入.gitignore,不要提交到仓库。- 遇到误操作先不要继续执行清理命令,可通过
git reflog寻找恢复机会。