解决合并冲突

了解为什么会产生冲突,以及如何正确地解决它们。

这是一个交互式课程,需要在 GitHub 上实际操作来完成学习。本页面为静态预览,仅方便您一次性阅读所有步骤内容。

前往 GitHub 开始学习 →

📖课程概览

English | 中文

本课程翻译自 Github Skills,全部课程请点击 这里查看

解决合并冲突

了解为什么会产生冲突,以及如何正确地解决它们。

Welcome

当两个人在 GitHub 上修改同一份文件时,就有可能出现 合并冲突 问题。这在多人协同开发中非常常见。虽然解决冲突有时需要沟通和协调,但其实并没有想象中那么复杂。

本课程将带你一步步学习如何定位并解决合并冲突,让团队开发工作顺利进行。

  • 目标人群:初学者、GitHub 新用户、Git 新手、学生、管理者及团队成员。
  • 学习内容:什么是合并冲突、如何解决冲突、以及怎样减少冲突的发生。
  • 您将完成:在课程中,我们将一起操作一个简短的 Markdown 简历文件。
  • 先决条件:建议先学习 GitHub 入门课程
  • 课程时长:大约 30 分钟内即可完成。

在本课程中,你将完成以下内容:

  1. 创建一个 Pull Request
  2. 解决一次合并冲突
  3. 人为制造一个合并冲突
  4. 合并你的 Pull Request

如何开始课程

start-course

  1. 右键点击 Start course,在新标签页中打开链接。
  2. 在新页面中根据系统提示新建一个仓库。
    • 仓库名称、描述这些字段系统已经帮我们自动填充好了,您可以按需修改。
    • 建议选择公开仓库,因为私有仓库有GitHub Actions 分钟数限制
    • 最后点击 Create repository 按钮
  3. 仓库创建完毕后,等待大约 20 秒(等待Action执行),然后刷新页面。注意是刷新您仓库的页面,不是本课程的页面。如果页面没有变化,请继续等待。然后按照 README 中的步骤一步步进行。

🎯课程步骤

GitHub

Step 1: 创建 Pull Request

欢迎来到 "Managing Merge Conflicts" 课程! 👋

什么是 合并冲突(merge conflict) ?: 当两个不同分支中,对同一个文件的同一部分进行了修改时,就会产生 合并冲突。 通常,我们会在创建 Pull Request 时发现这些冲突,所以接下来就先从创建一个 Pull Request 开始吧。

⌨️ 实操环节: 创建 Pull Request

  1. 打开一个新的浏览器标签页,方便一边操作一边阅读本教程。
  2. 我们已经在仓库的 my-resume 分支中做了一点修改。
  3. 创建一个 Pull Request,将 my-resume 设为 head 分支main 设为 base 分支。Pull Request 的标题和内容可以填写为 Resolving merge conflicts
  4. 等待大约 20 秒后,刷新本页面。GitHub Actions 会自动检测进度并进入下一步。
GitHub

Step 2: 解决合并冲突

现在我们来深入看看合并冲突是怎么回事吧! 🔍

第一次看到合并冲突时可能会令人生畏,但不用担心,Git 在处理冲突时比你想象的聪明。它只是在某些情况下需要人工干预,告诉它该保留哪些内容、该舍弃哪些。 有时我们需要将两个分支的内容都合并在一起,有时候你可能需要完全重写一个版本。这就是为什么需要人来查看冲突内容,并做出正确修改。

⌨️ 实操环节: 解决合并冲突

  1. 打开你刚刚创建的 Pull Request,我们已经为你准备好了一个冲突示例。别慌,这正是练习的重点!

  2. 在页面底部的提示区域中,找到 “This branch has conflicts that must be resolved” 字样,然后点击 Resolve conflicts 按钮。

  3. 你会看到一些高亮的标记区域,冲突部分会以 <<<<<<< my-resume 开头,以 >>>>>>> main 结尾。这些标记是 Git 自动加上的,用来告诉你两边的代码哪里有冲突。

  4. 删除 main 分支中的修改内容,也就是删除 ======= 下面、>>>>>>> main 上面的所有内容。

  5. 接着,把下面几行合并标记也删掉:

    <<<<<<< my-resume
    =======
    >>>>>>> main
    
  6. 删除完冲突标记后,点击 Mark as resolved

  7. 最后,点击 Commit merge

  8. 等待大约 20 秒后,刷新当前页面。GitHub Actions 会自动识别进度并进入下一步。

GitHub

Step 3: 动手创建一个合并冲突

太棒了!你已经成功解决了一次合并冲突! 🎉

不过在 GitHub 上,解决冲突后并不会自动完成合并。 GitHub 会把你的修改保存成一次 合并提交(merge commit)

当我们解决冲突时,GitHub 实际上执行的是一种叫 反向合并(reverse merge) 的操作。 也就是说,它会把 main 分支的改动合并进你的 my-resume 分支,而不是反过来。 这样只有 my-resume 分支会更新,你可以先在自己的分支上测试修改,确认没问题后再合并回 main

现在,让我们来点 “挑战性的” 练习吧。

⌨️ 实操环节

为了方便练习,我们将人为的制造一次合并冲突。我们已经在 main 分支中新增了一个文件 references.md,并推送到了远程仓库,但还没有同步到你的 my-resume 分支。

  1. 切换到 my-resume 分支。
  2. 点击 Add file 下拉菜单,选择 Create new file
  3. 创建一个名为 references.md 的文件。
  4. references.md 文件中输入一些与 main 分支中不同的内容(这样才能产生冲突)。
  5. 滚动到页面底部,为本次修改输入提交信息(commit message)。
  6. 点击 Commit new file 按钮,确保选中 “Commit directly to the my-resume branch”。
  7. 等待大约 20 秒后,刷新当前页面。GitHub Actions 会自动检测进度并跳转到下一步。
GitHub

Step 4: 合并你的 Pull Request

快完成啦! ❤️

现在,你已经可以合并(merge)你的 Pull Request 了!

⌨️ 实操环节: 合并你的 Pull Request

  1. 首先,确保 Pull Request 中的所有冲突都已经解决。

    如果不确定怎么做,可以回顾第一步的操作说明。

  2. 点击 Merge pull request 按钮,执行合并操作。
  3. (可选)删除分支 my-resume
  4. 等待大约 20 秒后,刷新当前页面。GitHub Actions 会自动检测进度,并进入下一步。
GitHub

完成

恭喜你!你已经顺利完成了本课程!

celebrate

下面是你在本课程中完成的内容回顾:

  • 了解了合并冲突产生的原因。
  • 学会了解决一次简单的合并冲突。
  • 自己动手创建了一个冲突,并成功解决它!

接下来可以做什么?

关于 GitHub Skills

GitHub Skills 是 GitHub 官方提供的交互式学习平台。 原始课程需要在 GitHub 上执行操作,通过 GitHub Actions 自动检测进度。

本页面将所有步骤展示在一个页面中,方便您一次性阅读全部内容。

前往 GitHub 实操练习