第一部分:核心理念与基础
1.1 什么是Git?为什么它如此重要?
定义:Git是一个分布式版本控制系统。它像一台"时光机",能记录你项目文件的每一次变更(谁、在什么时候、改了什么内容),并让你能随时回到任何一个历史版本。
核心价值:
版本回溯:轻松找回误删的代码或回退到稳定版本。
团队协作:多人并行开发同一项目,高效合并彼此的工作成果。
实验安全:创建独立的"实验分支"尝试新功能,失败了也不影响主线代码。
1.2 三个核心区域(理解此模型是掌握Git的关键)
想象一下你的工作区有三个区域:
1.工作区:你电脑里能看到的项目文件夹,你在这里直接编辑文件。
2.暂存区:一个临时区域,用于准备下一次要提交的修改。你可以有选择性地将工作区的改动加入这里。
3.本地仓库:保存项目完整历史记录和所有分支的地方。当你"提交"时,暂存区的快照就被永久保存到这个仓库里。
流程:工作区 -> git add -> 暂存区 -> git commit -> 本地仓库
1.3 初始化与配置
bash
# 全局配置(只需做一次)
git config --global user.name "你的姓名" # 提交时显示的名字
git config --global user.email "你的邮箱" # 提交时显示的邮箱
# 初始化一个新仓库
cd /你的项目目录
git init # 在当前目录创建.git隐藏文件夹,开始Git管理
第二部分:日常基础操作
2.1 获取项目与状态查看
bash
# 克隆一个已有的远程仓库到本地
git clone <远程仓库URL>
# 查看仓库状态(最常用命令之一!)
git status
# 查看简洁状态
git status -s
# ?? 新文件(未跟踪)
# A 新文件已暂存
# M 文件被修改(红色在工作区,绿色在暂存区)
2.2 添加与提交
bash
# 添加单个文件到暂存区
git add <文件名>
# 添加当前目录下所有改动的文件(新文件、修改、删除)到暂存区
git add .
# 提交暂存区的快照到本地仓库,并附上描述信息
git commit -m "提交信息:清晰地描述你做了什么"
# 好的提交信息示例:"修复用户登录时的空指针异常"
# 差的提交信息示例:"更新"
2.3 查看历史与差异
bash
# 查看提交历史
git log
git log --oneline --graph --all # 图形化简洁视图,非常推荐!
# 查看工作区与最后一次提交的差异(未暂存的修改)
git diff
# 查看暂存区与最后一次提交的差异(已暂存,将要提交的修改)
git diff --staged
第三部分:分支与合并(团队协作的核心)
分支是Git最强大的功能,它允许你从主线上分离出来,进行独立开发。
3.1 分支操作
bash
# 列出所有本地分支,当前分支前有*号
git branch
# 创建一个新分支
git branch <分支名>
# 切换到另一个分支
git checkout <分支名>
# 或使用更新的命令
git switch <分支名>
# 创建并立即切换到新分支(最常用)
git checkout -b <分支名>
# 或
git switch -c <分支名>
# 删除一个已合并的分支
git branch -d <分支名>
3.2 合并分支
假设你在 feature-login 分支开发完毕,需要合并回 main 分支:
bash
# 1. 先切换到目标分支(main)
git checkout main
# 2. 将 feature-login 分支合并到当前分支(main)
git merge feature-login
# 3. (可选) 删除已合并的功能分支
git branch -d feature-login
3.3 解决合并冲突
当Git无法自动合并时(比如两个分支修改了同一文件的同一部分),会产生冲突。
1.Git会标记冲突文件,用 git status 查看。
2.打开冲突文件,你会看到类似这样的标记:
bash
<<<<<<< HEAD
// 当前分支(main)的代码
=======
// incoming change(feature-login)分支的代码
>>>>>>> feature-login
3.手动编辑 文件,选择保留哪部分代码,或进行整合,然后删除所有冲突标记(<<<<<<<, =======, >>>>>>>)。
4.git add <冲突文件> 将解决后的文件标记为已解决。
5.git commit 完成合并提交。
第四部分:远程仓库协作
4.1 连接远程仓库**
bash
# 查看已配置的远程仓库
git remote -v
# 添加一个新的远程仓库(通常命名为 origin)
git remote add origin <远程仓库URL>
# 从远程仓库获取最新数据(但不合并)
git fetch origin
# 拉取远程分支并与当前本地分支合并(= fetch + merge)
git pull origin main
# 在团队协作中,开始工作前先 pull 通常是个好习惯。
4.2 推送与拉取
bash
# 将本地分支的提交推送到远程仓库
git push origin main # 推送本地main分支到远程origin仓库
# 推送并设置上游分支(之后可以直接用 git push)
git push -u origin main
# 从远程仓库拉取并尝试自动合并(如果基于该分支开发)
git pull origin main
4.3 团队协作流程(基于Git Flow简化版)
1.克隆:git clone <主仓库URL>
2.更新:git pull origin main (确保你的 main 分支是最新)
3.开新分支:git checkout -b feature/your-feature-name (从最新的 main 创建)
4.开发与提交:在你的分支上反复进行 修改 -> git add -> git commit
5.保持同步:定期 git pull origin main 到你的功能分支,解决可能的冲突。
6.推送分支:git push origin feature/your-feature-name
7.发起合并请求:在GitHub/GitLab等平台上,创建一个 Pull Request / Merge Request,请求将你的功能分支合并回 main。
8.代码审查与合并:团队成员评审你的代码,通过后由管理员合并到 main 分支。
第五部分:高级技巧与撤销操作
5.1 撤销与回退("后悔药")
bash
# 1. 撤销工作区的修改(危险!会丢失未暂存的修改)
git checkout -- <文件名>
# 2. 将文件从暂存区撤回至工作区(保留修改)
git restore --staged <文件名>
# 或旧命令:git reset HEAD <文件名>
# 3. 修改最后一次提交(刚提交完发现有错误)
git commit --amend -m "新的提交信息" # 修改提交信息
# 或 git add 遗漏的文件后,执行 git commit --amend
# 4. 回退到历史版本(危险操作!会改变历史)
git log --oneline # 找到你想回退到的版本号(前7位)
git reset --hard <版本号> # 强制回退到该版本,丢弃之后的所有提交
# 谨慎使用!如果已经推送到了远程,需要强制推送:git push -f origin main
5.2 临时保存工作现场
bash
# 当你正在一个分支上工作,突然需要切换分支处理紧急任务,但不想提交半成品代码:
git stash # 临时保存当前工作区的修改
# 切换到其他分支处理完任务后,切回原分支:
git stash pop # 恢复最近一次的临时保存
5.3 标签
用于标记重要的提交点,如版本发布(v1.0, v2.0)。
bash
git tag -a v1.0 -m "版本1.0发布" # 创建带注释的标签
git tag # 列出所有标签
git push origin v1.0 # 推送特定标签到远程
第六部分:最佳实践与工作流
1.提交频率:小步快跑。完成一个逻辑上的小改动就提交一次,便于回溯和理解历史。
2.提交信息:清晰、简洁、有意义。第一行是摘要(50字符内),空一行后写详细说明。
3.分支策略:
main:始终保持稳定、可部署。
feature/:用于开发新功能。
hotfix/ :用于紧急修复线上bug。
4.在推送前:先 git pull --rebase origin main,将你的提交变基到最新主干上,保持历史线性整洁。
5.不要提交什么:使用 .gitignore 文件排除不需要版本控制的文件,如:
bash
# .gitignore 示例
node_modules/
.env
*.log
.DS_Store
速查表
场景 命令
开始 git clone, git init
日常 git status, git add ., git commit -m "...", git push
同步 git pull, git fetch
分支 git branch, git checkout -b, git merge
查看 git log --oneline --graph, git diff
撤销 git restore, git commit --amend, git reset --hard
临时 git stash, git stash pop