Đoạn xem trước bài giảng

代码合并冲突:不慌张,理解与解决之道

合并冲突常常让新手感到害怕,但学完本讲后你将能从容应对。我们将深入探讨冲突产生的原因(Git 无法读心,它不知道哪个修改更重要),如何解读冲突标记,以及如何选择正确的解决方案。课程将演示两种方法:手动解决和使用合并工具。

合并冲突 冲突标记 冲突解决
Bạn sẽ học gì trong bài giảng này
  • 理解合并冲突的本质,不再对其感到恐惧——它们将变得可预测。
  • 能够通过正确解读 Git 冲突标记,独立完成手动解决冲突。
  • 学会在编辑器中配置合并工具,实现可视化冲突解决。

Phần đầu bài giảng

三种合并冲突类型

  • 内容冲突:同一行代码的修改
  • 重命名冲突:文件被修改并重命名
  • 删除冲突:文件在一个分支被删除,在另一个分支被修改
  • 重命名冲突对Git来说最棘手
  • 遇到可疑冲突时请检查文件历史记录

想象你正在处理一个重要的项目,突然Git报告有冲突。解决问题的第一步是理解冲突类型。内容冲突发生在不同分支修改了同一行代码时。重命名冲突更复杂:一个开发者修改了文件名,而另一个开发者同时编辑了文件内容。第三种是删除冲突,即文件在一个分支被删除,但在另一个分支仍然存在。重命名冲突通常最棘手,因为Git在文件更名后并不总能正确跟踪文件历史。因此,遇到可疑冲突时,请务必检查文件的历史变更记录。

复杂冲突剖析

  • <<<<<<< 标记显示你的更改
  • ======= 分隔你的版本和他人的版本
  • >>>>>>> 标记冲突块的结束
  • git status 显示所有问题文件
  • git diff 提供详细的更改比较

假设你要将feature分支合并到main分支,这时看到了冲突提示。打开问题文件,你会看到特殊的标记符号。在<<<<<<< HEAD和=======之间是你的更改。在=======和>>>>>>> feature之间是要合并分支的更改。使用git status可以查看所有冲突文件,使用git diff可以详细查看差异。记住:这些标记不是错误,而是提示你需要做出决策的位置。

#!/bin/bash
# 冲突分析脚本

echo "创建测试仓库"
mkdir conflict-demo && cd conflict-demo
git init

echo "在main分支创建文件并首次提交"
echo '第一行' > file.txt
echo '第二行' >> file.txt
git add . && git commit -m '初始提交'

echo "创建feature分支并修改第一行"
git checkout -b feature
sed -i 's/第一行/在feature分支中修改的第一行/' file.txt
git commit -am '在feature分支中修改第一行'

echo "返回main分支并修改同一行"
git checkout main
sed -i 's/第一行/在main分支中修改的第一行/' file.txt
git commit -am '在main分支中修改第一行'

echo "尝试合并分支"
git merge feature || echo '发现冲突!'

echo "\n查看状态:"
git status --short

echo "\n显示冲突文件内容:"
cat file.txt

解决冲突的策略

  • 手动编辑:移除冲突标记,保留所需内容
  • GUI工具:使用Meld、KDiff3进行可视化比较
  • --ours/--theirs:选择保留自己或他人的版本
  • rebase时需为每个提交单独解决冲突
  • 解决后记得执行git add和git commit

当发现冲突时,您有几种解决方式。可以手动打开文件进行编辑,移除冲突标记并保留所需代码。对于视觉型学习者,推荐使用Meld或KDiff3等工具,它们可以同时显示文件的三个版本。如果确定要保留自己的修改,可以使用git checkout --ours;要保留他人的修改则使用--theirs。在rebase时要格外小心:每个被变基的提交都可能产生冲突。

#!/bin/bash
# resolve_strategies.sh

echo "方法一:手动解决"
echo '编辑文件,移除冲突标记'
echo '然后执行:git add file.txt'

echo "\n方法二:接受我们的版本"
git checkout --ours file.txt

echo "\n方法三:接受他们的版本"
git checkout --theirs file.txt

echo "\n方法四:使用合并工具"
echo 'git mergetool --tool=meld'

echo "\n选择方法后完成合并:"
echo 'git commit -m "解决合并冲突"'

Bài giảng đầy đủ dành cho thuê bao

Còn 34 slide nữa trong phiên bản đầy đủ.

Video, toàn bộ slide, ghi chú, bài kiểm tra, gia sư AI và phỏng vấn sẽ mở sau khi đăng nhập và đăng ký thuê bao.

Đăng nhập hoặc đăng ký Đăng ký thuê bao

Nội dung bài giảng

  1. 三种合并冲突类型
  2. 复杂冲突剖析
  3. 解决冲突的策略
  4. 预防措施与最佳实践
  5. 如何阅读Git中的多行冲突
  6. 上下文标记详解
  7. 嵌套冲突:解决策略
  8. 自动化与高级工具
  9. 策略选择:HEAD 还是分支?
  10. 最小意外原则
  11. 语义冲突:看不见的敌人
  12. 工具与自动化
  13. 工具选择:何时使用何种工具
  14. VS Code:配置与高级功能
  15. 超越比较:复杂冲突处理方案
  16. Git Flow集成与自动化
  17. 通过.gitattributes实现自动合并
  18. 编写自定义合并驱动程序
  19. Git rerere — 您的个人助理
  20. 高级自动化策略
  21. 为大型团队设计工作流程
  22. 代码审查作为预防冲突的工具
  23. 处理长期功能分支的策略
  24. 冲突解决工具与自动化
  25. 盲目接受更改的风险
  26. 安全的冲突解决策略
  27. 合并后测试:需要检查的内容
  28. CI/CD 集成与预防措施
  29. rebase 冲突与 merge 冲突的区别
  30. 使用 --rebase-merges 进行工作
  31. 解决连续冲突的策略
  32. 高级技巧和 rebase 调试
  33. CI/CD作为质量保障系统
  34. GitHub Actions:冲突检查
  35. Danger-JS:智能自动化检查
  36. CI/CD中的自动冲突解决
  37. 从恐慌到自信:掌握冲突解决

Bài viết liên quan đến bài học này

Tất cả bài giảng của khóa học

  1. 从零开始:成为自信的Git开发者
  2. 为什么必须掌握Git——不懂Git就找不到工作的原因
  3. 安装与配置:准备首次使用Git
  4. 第一个仓库:init、add、commit 和索引的魔力
  5. 版本控制历史解读:log、diff、show 与历史记录导航
  6. Git分支:代码的平行宇宙
  7. 撤销操作详解:restore、reset、revert的正确使用与风险
  8. GitHub与远程仓库:将代码存入云端
  9. 团队协作:Fork、功能分支和拉取请求
  10. 代码合并冲突:不慌张,理解与解决之道
  11. 真实团队中的Git流程:如何选择适合的工作流
  12. 高级 Git 工具:rebase、stash、cherry-pick 和标签
  13. 期末项目:模拟真实团队开发