目录
Git 基础概念
Git 是一个分布式版本控制系统,它跟踪文件随时间的变化,并允许多人协作开发。
核心区域
flowchart LR
A[工作区 Working Directory] --> B[暂存区 Staging Area]
B --> C[本地仓库 Local Repository]
C --> D[远程仓库 Remote Repository]
文件状态
flowchart LR
U[未跟踪 Untracked] -->|git add| S[已暂存 Staged]
S -->|git commit| C[已提交 Committed]
C -->|修改文件| M[已修改 Modified]
M -->|git add| S
Git 工作流程
基本工作流程包括:
克隆/初始化仓库
创建/切换分支
修改文件
暂存更改
提交更改
推送到远程
拉取远程更新
常用命令
BASH
# 初始化仓库git init
# 克隆仓库git clone <repository-url>
# 查看状态git status
# 添加文件到暂存区git add <file>git add . # 添加所有更改
# 提交更改git commit -m "提交信息"
# 查看提交历史git log
git log --graph --oneline --all # 图形化展示所有分支
# 创建分支git branch <branch-name>
# 切换分支git checkout <branch-name># 或使用新命令(Git 2.23+)git switch <branch-name>
# 创建并切换分支git checkout -b <branch-name># 或使用新命令git switch -c <branch-name>
# 推送到远程git push origin <branch-name>
# 拉取远程更新git pull origin <branch-name>Git Pull 与合并处理详解
git pull 实际上是 git fetch 和 git merge 的组合操作。
sequenceDiagram
participant L as 本地仓库
participant R as 远程仓库
L->>R: git fetch 获取远程更新
R-->>L: 返回远程分支信息
L->>L: git merge 合并到本地分支
Pull 的不同方式
普通合并 (默认)
BASH
git pull origin master
# 等同于git fetch origin master
git merge origin/master
使用 rebase 方式
BASH
git pull --rebase origin master
# 等同于git fetch origin master
git rebase origin/master
Pull 策略选择
flowchart TD
A[git pull] --> B{是否需要线性历史?}
B -->|是| C[git pull --rebase]
C --> D{是否有冲突?}
D -->|否| E[完成]
D -->|是| F[解决冲突后 git rebase --continue]
F --> E
B -->|否| G[git pull / git merge]
G --> H{是否有冲突?}
H -->|否| E
H -->|是| I[解决冲突后 git commit]
I --> E
合并冲突解决方案
当 git pull 或 git merge 遇到冲突时,需要手动解决。
冲突解决流程
flowchart TD
A[合并出现冲突] --> B[查看冲突文件]
B --> C[手动编辑解决冲突]
C --> D[git add 已解决文件]
D --> E{当前是 rebase?}
E -->|是| F[git rebase --continue]
E -->|否| G[git commit]
F --> H[完成]
G --> H
解决冲突的详细步骤
识别冲突文件
BASH
git pull
# 如果有冲突,会显示类似信息# CONFLICT (content): Merge conflict in <filename># Automatic merge failed; fix conflicts and then commit the result.
# 查看冲突文件git status
理解冲突标记
冲突文件中会包含类似标记:
PLAINTEXT
<<<<<<< HEAD
本地修改的内容
=======
远程修改的内容
>>>>>>> branch-name
解决冲突方法
a. 手动编辑:直接编辑冲突文件,删除冲突标记,保留需要的内容
b. 使用合并工具:
BASHgit mergetoolc. 选择其中一个版本:
BASH# 使用当前分支(HEAD)的版本git checkout --ours <filename> # 使用合并进来的分支版本git checkout --theirs <filename>标记为已解决并提交
BASH
# 标记文件冲突已解决git add <filename>
# 完成合并提交git commit
# 此时会自动生成合并提交信息,可以修改或直接保存高级合并策略
BASH
# 在合并时指定策略git pull -s recursive -X ours # 冲突时优先保留本地修改git pull -s recursive -X theirs # 冲突时优先保留远程修改git pull -s recursive -X patience # 使用patience算法,更智能地处理代码移动
# 放弃合并git merge --abort
使用 Rebase 处理冲突
BASH
# 拉取并使用rebase方式合并git pull --rebase
# 当遇到冲突时# 1. 解决冲突# 2. 标记为已解决git add <conflicted-files>
# 3. 继续rebasegit rebase --continue
# 放弃rebasegit rebase --abort
Git 分支策略
Gitflow 工作流
推荐的分支策略
flowchart LR
M[main] --> HF[hotfix]
D[develop] --> F1[feature]
D --> F2[feature]
F1 -->|完成后 git merge| D
F2 -->|完成后 git merge| D
D -->|准备发布 git checkout -b| R[release]
R -->|完成后 git merge| M
HF -->|完成后 git merge| M
高级技巧
交互式变基
BASH
# 对最近的 3 个提交进行重新整理git rebase -i HEAD~3
常用选项:
pick:保留该提交reword:修改提交信息edit:修改该提交squash:将该提交融合到前一个提交fixup:将该提交融合到前一个提交,丢弃提交信息drop:删除该提交
暂存工作区
BASH
# 暂存当前工作git stash save "工作描述"
# 查看暂存列表git stash list
# 应用最近的暂存git stash apply
# 应用指定暂存git stash apply stash@{1}
# 应用并删除暂存git stash pop
# 删除所有暂存git stash clear精确查找
BASH
# 查找引入特定代码的提交git log -S "代码片段"
# 查找某行代码的修改历史git blame <file>
# 查找特定作者的提交git log --author="作者名"撤销操作
BASH
# 撤销工作区修改git checkout -- <file># 或使用新命令git restore <file>
# 撤销暂存区修改git reset HEAD <file># 或使用新命令git restore --staged <file>
# 修改最近的提交git commit --amend
# 撤销提交(生成新提交)git revert <commit-hash>
# 重置到指定提交git reset --soft <commit-hash> # 保留修改在暂存区git reset --mixed <commit-hash> # 保留修改在工作区git reset --hard <commit-hash> # 丢弃所有修改Git 内部原理
Git 的核心是一个简单的键值存储数据库,对象存储在 .git/objects 目录中。
Git 对象类型
classDiagram
class Blob {
+文件内容
}
class Tree {
+指向 Blob 或子 Tree
+文件名 / 目录名
+文件模式
}
class Commit {
+指向 Tree
+父提交
+作者信息
+提交说明
}
Commit --> Tree
Tree --> Blob
Tree --> Tree
分支与引用
分支本质上是指向某个提交对象的可移动指针,存储在 .git/refs/heads/ 目录中。
上图中:
main分支指针移动到合并提交 C5feature分支指针仍然指向 C4
合并原理
快进合并(Fast-forward):
快进合并只是简单地将当前分支指针向前移动到目标分支的最新提交。
三方合并(3-way merge):
三方合并会生成一个新的合并提交,它有两个父提交。
Rebase 原理
Rebase 会找到共同祖先(B),然后依次应用 feature 分支上的更改(C、D)到 main 分支的最新提交(E)之上,生成新的提交(C’、D’)。
Git Pull 完整流程
flowchart TD
A[工作区] --> B[本地仓库]
B --> C[远程仓库]
C -->|git fetch 获取远程引用和对象| B
B --> D{能否快进?}
D -->|是| E[快进合并]
E --> F[更新工作区文件]
D -->|否,merge| G[创建合并提交]
G --> H{有冲突?}
H -->|是| I[标记冲突文件]
I --> J[解决冲突并提交]
D -->|否,rebase| K[暂存本地提交]
K --> L[应用远程提交]
L --> M[重放本地提交]
M --> N{有冲突?}
N -->|是| O[标记冲突文件]
O --> P[解决冲突并继续 rebase]
实战技巧
处理大型合并冲突
当面临大型项目合并时:
提前同步:定期从主分支拉取更新
BASH# 在特性分支上定期执行git fetch origin master git merge origin/master # 或git rebase origin/master分块合并:复杂功能分多个小分支开发
BASH# 创建子功能分支git checkout -b feature/part1 git checkout -b feature/part2 # 逐个合并到开发分支git checkout develop git merge feature/part1 git merge feature/part2使用合并工具:配置好的合并工具能极大提高效率
BASH# 配置合并工具git config --global merge.tool vscode git config --global mergetool.vscode.cmd 'code --wait $MERGED' # 使用git mergetool
Git Pull 冲突处理流程图
flowchart TD
A[git pull 遇到冲突] --> B{冲突类型?}
B -->|文件内容冲突| C[打开冲突文件编辑]
B -->|文件删除或修改冲突| D[选择保留或删除]
C --> E[git add]
D --> E
E --> F{当前是 rebase?}
F -->|是| G[git rebase --continue]
F -->|否| H[git commit]
高效处理合并冲突的最佳实践
提前了解变更范围:
BASH# 查看将要合并的分支有哪些变更git log --oneline master..feature # 查看具体文件变更git diff master...feature预先检查潜在冲突:
BASH# 模拟合并,不实际提交git merge --no-commit --no-ff feature # 检查后取消git merge --abort合并前先清理工作区:
BASH# 检查工作区状态git status # 暂存当前工作git stash # 合并后恢复git stash pop使用特定合并策略:
BASH# 冲突时优先采用本地版本git merge -X ours feature # 冲突时优先采用合入版本git merge -X theirs feature大型项目合并建议:
BASH# 先创建临时分支进行合并测试git checkout -b temp_merge git merge feature # 测试成功后再合并到主分支
总结
Git 是一个功能强大的版本控制系统,掌握合并冲突处理是高效使用 Git 的关键技能。通过理解 Git 的内部原理,采用合适的分支策略,使用正确的合并方法,可以大大提高团队协作效率,减少合并冲突带来的麻烦。

