blob: 0200343fc641f20bc3c15c6a3c3818f637618f75 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
# 冲突处理详解
## 识别冲突
当 Git 无法自动合并时,会标记冲突:
```
<<<<<<< HEAD
// 当前分支的代码
const name = '张三'
=======
// 要合并的分支的代码
const name = '李四'
>>>>>>> feature/user-management
```
## 解决冲突步骤
### 1. 查看冲突文件
```bash
git status
```
### 2. 手动编辑文件,解决冲突
打开冲突文件,找到冲突标记(`<<<<<<<`、`=======`、`>>>>>>>`),手动编辑选择保留的内容或合并两者。
### 3. 标记已解决
```bash
git add <file>
```
### 4. 完成合并
```bash
# 对于 merge 冲突
git commit
# 对于 rebase 冲突
git rebase --continue
```
## 冲突处理策略
### 保留当前分支版本
```bash
git checkout --ours <file>
git add <file>
```
### 保留传入分支版本
```bash
git checkout --theirs <file>
git add <file>
```
### 放弃合并
```bash
# 放弃 merge
git merge --abort
# 放弃 rebase
git rebase --abort
```
## 预防冲突的最佳实践
1. **及时同步代码** - 每天开始工作前拉取最新代码
2. **小步提交** - 频繁提交小的改动
3. **功能模块化** - 不同功能在不同文件中实现
4. **沟通协作** - 避免同时修改同一文件
## 常见冲突场景
### 场景1:同一文件不同位置修改
这种情况 Git 通常能自动合并,无需人工干预。
### 场景2:同一行不同修改
需要手动决定保留哪个版本或合并两者。
### 场景3:文件重命名
Git 通常能智能识别,但如果一个分支重命名而另一个分支修改内容,可能需要手动处理。
### 场景4:二进制文件冲突
对于图片、PDF 等二进制文件,需要决定保留哪个版本:
```bash
# 保留当前分支的版本
git checkout --ours image.png
# 或保留传入分支的版本
git checkout --theirs image.png
```
## 冲突解决工具
### 使用 merge 工具
```bash
# 配置合并工具
git config --global merge.tool vimdiff
git config --global mergetool.prompt false
# 使用合并工具
git mergetool
```
### 使用 diff 工具
```bash
# 查看详细差异
git diff --ours
git diff --theirs
git diff --base
```
## Rebase 冲突特殊处理
Rebase 时冲突会逐个提交出现,处理方式:
```bash
git rebase develop
# 冲突1 -> 解决 -> git add -> git rebase --continue
# 冲突2 -> 解决 -> git add -> git rebase --continue
# ...
# 直到完成
```
如果某一步想跳过:
```bash
git rebase --skip
```
如果整体想放弃:
```bash
git rebase --abort
```
|