Git 使用指南笔记:从入门到团队协作

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 pushgit 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 statusgit 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 "说明"

最值得记住的工作习惯

  1. 操作前先执行 git status
  2. 提交前检查 git diffgit diff --cached
  3. 一次提交只完成一个相对独立的任务。
  4. 提交信息要说明"做了什么",必要时补充"为什么"。
  5. 新功能和问题修复尽量使用独立分支。
  6. 推送前先同步远程更新,并完成测试。
  7. 谨慎使用 reset --hardbranch -D 和强制推送。
  8. 已经共享的历史优先使用 revert 撤销,不轻易改写。
  9. .env、密钥、密码和个人配置应写入 .gitignore,不要提交到仓库。
  10. 遇到误操作先不要继续执行清理命令,可通过 git reflog 寻找恢复机会。
相关推荐
炸膛坦客16 小时前
Git 和 GitHub:(十三)改分支名
git·github
铁锚20 小时前
Git设置自动推送到同名远端分支
git
起个破名想半天了1 天前
Git 本地项目关联远程仓库教程
git·github·git教程
lazy H1 天前
Git worktree 怎么用?同时开发多个分支完整教程
大数据·git·后端·学习·搜索引擎·github
重生的黑客1 天前
Git 本地版本管理与分支管理:从零理解工作区、回退、冲突与开发流程
数据库·git·elasticsearch
Cx330_FCQ2 天前
Tmux使用
服务器·git·算法
xxwl5852 天前
Git 完整学习笔记:从入门到团队协作
笔记·git·学习
John_ToDebug2 天前
Git 工作区、暂存区、仓库、远端同步完全指南:从 restore、reset 到 fetch、pull 的正确使用姿势
git·源代码管理
炸膛坦客2 天前
Git 和 GitHub:(九)修改本地仓库内容并推送到远程仓库(关联/克隆)
git·github