问题描述
李四和王五同时下载了dev分支代码,main.cpp代码为:
#include <stdio.h>
void main(void) {printf("hello");
}
李四修改代码后提交并push,李四修改的代码
#include <stdio.h>
void main(void) {printf("hello 李四");
}
同时王五也修改了代码
#include <stdio.h>
void main(void) {printf("hello 王五");
}
王五修改提交后也push,但是push报错,代码冲突了
当多个开发者同时对同一分支的同一文件进行修改并提交时,常常会出现代码冲突。李四和王五的情况就是如此,他们都修改了 main.cpp
文件并尝试 push 到 dev 分支。李四的修改已经成功 push,而王五的 push 由于代码冲突而失败。
解决冲突的方法
-
手动解决冲突
- 王五 pull 最新的 dev 分支代码:
git pull origin dev
- Git 会提示冲突,并将冲突的部分标记在文件中。编辑
main.cpp
文件,可以看到类似下面的内容:<<<<<<< HEAD #include <stdio.h> void main(void) {printf("hello 李四"); } ======= #include <stdio.h> void main(void) {printf("hello 王五"); } >>>>>>> dev
- 手动修改冲突部分的代码,例如:
#include <stdio.h> void main(void) {printf("hello 李四和王五"); }
- 保存文件,添加并提交解决后的代码:
git add main.cpp git commit -m "Resolved merge conflict between 李四 and 王五" git push origin dev
- 王五 pull 最新的 dev 分支代码:
-
使用 git merge 工具
- 王五 pull 最新的 dev 分支代码:
git pull origin dev
- 使用 Git 提供的合并工具(如
git mergetool
)来解决冲突:git mergetool
- 解决冲突后,保存并关闭合并工具,添加并提交解决后的代码:
git add main.cpp git commit -m "Resolved merge conflict using mergetool" git push origin dev
- 王五 pull 最新的 dev 分支代码:
-
重新基于最新代码修改并提交
- 王五 stash 他的更改:
git stash
- pull 最新的 dev 分支代码:
git pull origin dev
- 应用 stash 的更改:
git stash pop
- 解决任何潜在的冲突,并确认更改:
git add main.cpp git commit -m "王五的更改重新基于最新代码" git push origin dev
- 王五 stash 他的更改:
-
创建新的分支并进行变基操作
- 王五创建一个新的分支:
git checkout -b new-branch
- pull 最新的 dev 分支代码:
git pull origin dev
- 在新分支上进行变基操作:
git rebase dev
- 解决冲突,添加并提交解决后的代码:
git add main.cpp git rebase --continue
- 将新分支的代码合并回 dev 分支:
git checkout dev git merge new-branch git push origin dev
- 王五创建一个新的分支:
每种方法都有其优点,具体选择哪种方法可以根据实际情况和团队的工作流程决定。通常情况下,手动解决冲突是最常用和最灵活的方法。