跳至内容
GitTree

课程 18 · 历史与融合

合并具有不同历史记录的分支

将已发布的工作流程卡功能与 main 的独立可访问性和页脚更改相结合。验证真正的双父合并和完整的结果页面。

进度已保存在此浏览器中。

播放时会加载来自 YouTube 的视频(隐私增强模式)。

英文旁白 · English and Arabic 字幕

打开视频页面在 YouTube 上观看

你将学到什么

  • 认识到与祖先的分歧。
  • 选择显式合并记录模式。
  • 验证父项和合并内容。
  • 将本地合并与服务器发布分开。

开始之前

从第 17 课结束的地方开始:主要是 Maya 的 README 提交,干净;已发布的功能/定价卡仍然是 F1,是 H5 的分支。您保存并提交 MAIN_ACCESSIBLE 作为准备,以便 main 和功能各自具有独立的提交。

该视频是在 Ubuntu 24.04 上使用 Git 2.52.0 和 GitTree 2.0 录制的:页面、其提交和合并均在应用程序中完成;之前的状态、被拒绝的快进在单独的副本中以及在终端中运行的检查(包括项目自己的 lint、测试和构建)。 macOS 或 Windows 上没有运行任何内容,并且 Ubuntu 是唯一记录的 Linux 系统。 GitTree 的源 Git 版本是 2.39.0。

GitTree 要求您登录;免费计划涵盖了这里的每一步。不需要提供商帐户、专业版/试用版、API 凭证或互联网服务。本地裸源不是 GitLab 或 CI。所有身份均使用 example.com;切勿在源代码检查中运行本课程。

通过 GitTree 或本地路径以相同的输入进行突变,而不是连续进行。只读验证可以遵循其中任何一个。任何被描述为终端工作的准备工作都被标记为本机准备,而不是发明的应用程序功能。

概念和状态效应

发散意味着两个分支都不是另一个分支可以快进到的后代。 Git 找到一个共同的祖先并组合与其相关的更改。仅凭分支名称无法告诉您是否需要合并提交。

合并提交按顺序记录两个父级。第一个父级是签出分支的先前提示;第二个是合并的一面。现有的功能提交保留其身份;一个新的合并提交连接了他们的祖先。

没有文本冲突并不能证明语义正确性。验证完整文件中的可聚焦主体、工作流程部分以及Leo的提醒;运行现有检查。本地合并不会更新源,直到单独的授权推送为止。

准备和合并移动本地 main/HEAD 并更新索引/工作。功能参考仍然是 F1。 origin 分支和 v0.1.0 都保留了之前的提示。

准备准确的项目状态

在主保存 MAIN_ACCESSIBLE 上,仅暂存 index.html 并提交修复:使主要地标可聚焦。这使得本机/应用程序合并输入明确;合并之前不要提交已合并的 MERGED 文件。

完整的文件输入

仅在下面指定的阶段保存。这些是完整的 UTF-8/LF 正文,最后有换行符;永远不要粘贴 Markdown 栅栏。未更改的可运行文件继承命名输入。单独变体中的版本不得覆盖原始版本。

index.html — MAIN_ACCESSIBLE

文件摘录 · html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>GitTree Features — course demo</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <header class="site-header">
    <a href="#main">GitTree Features</a>
  </header>
  <main id="main" tabindex="-1">
    <section class="hero" aria-labelledby="hero-title">
      <p class="eyebrow">GitTree Learn demo project</p>
      <h1 id="hero-title">See your work clearly.</h1>
      <p id="hero-copy">Choose one change, then check what Git saved.</p>
    </section>
    <section class="features" aria-labelledby="features-title">
      <h2 id="features-title">Follow your work</h2>
      <div class="cards">
        <article class="feature-card">
          <h3>History</h3>
          <p>Read commits and branches together.</p>
        </article>
        <article class="feature-card">
          <h3>Changes</h3>
          <p>Review the exact content selected for a commit.</p>
        </article>
        <article class="feature-card">
          <h3>Recovery</h3>
          <p>Inspect the scope of a recovery point before using it.</p>
        </article>
      </div>
    </section>
  </main>
  <footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
  <script type="module" src="site.js"></script>
</body>
</html>

index.html — 合并

文件摘录 · html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>GitTree Features — course demo</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <header class="site-header">
    <a href="#main">GitTree Features</a>
  </header>
  <main id="main" tabindex="-1">
    <section class="hero" aria-labelledby="hero-title">
      <p class="eyebrow">GitTree Learn demo project</p>
      <h1 id="hero-title">See your work clearly.</h1>
      <p id="hero-copy">Choose one change, then check what Git saved.</p>
    </section>
    <section class="features" aria-labelledby="features-title">
      <h2 id="features-title">Follow your work</h2>
      <div class="cards">
        <article class="feature-card">
          <h3>History</h3>
          <p>Read commits and branches together.</p>
        </article>
        <article class="feature-card">
          <h3>Changes</h3>
          <p>Review the exact content selected for a commit.</p>
        </article>
        <article class="feature-card">
          <h3>Recovery</h3>
          <p>Inspect the scope of a recovery point before using it.</p>
        </article>
      </div>
    </section>
    <section aria-labelledby="plans-title">
      <h2 id="plans-title">Choose the workflow you need</h2>
      <div class="cards">
        <article class="feature-card">
          <h3>Local Git</h3>
          <p>Local Git workflows work without signing in.</p>
        </article>
        <article class="feature-card">
          <h3>Connected workflows</h3>
          <p>Provider integrations and Nour require Pro or an applicable trial.</p>
        </article>
      </div>
    </section>
  </main>
  <footer><p>Built by a fictional team for GitTree Learn. Review one change at a time.</p></footer>
  <script type="module" src="site.js"></script>
</body>
</html>

在GitTree

调色板:Command+Shift+P(在 Ubuntu 上为 Ctrl+Shift+P);输入确切命名的命令并选择它。命名引用操作使用该行的上下文菜单,而不是无参数的调色板快捷方式。

  1. 通过Show Files→index.html→Save保存MAIN_ACCESSIBLE;仅审查 tabindex 添加。
  2. 显示工作变化;阶段文件index.html;提交修复:使主要地标在普通选项关闭的情况下可聚焦。
  3. 检查主要卡和功能/定价卡图谱;保持主要检查。
  4. 在本地下打开 feature 文件夹,右键单击 pricing-cards → Merge feature/pricing-cards into main。该对话框后面带有 Record it as。
  5. 在 Record it as 中,如果可能的话,选择是快进,否则合并提交; Always a merge commit;仅快进;并压缩为分阶段更改(无提交)。选择始终合并提交。如果实际预览显示意外路径或冲突,请取消。
  6. 选择合并一次并等待实际完成。不要用壁球代替分阶段的改变。
  7. 检查生成的提交的两个父级并将完整的index.html 与MERGED 进行比较;验证所有三个独立的更改。
  8. 运行本地检查和干净状态查询;将 main 保留在本地合并中,提交后不推送。该应用程序自己的合并主题是“合并分支'feature/pricing-cards'”;它不必与下面的本机消息匹配。

对于每个普通提交:Summary 是规定的主题;描述为空;修改先前的提交、跳过挂钩、添加签署者、不同的作者、提交后推送以及允许空提交;没有共同作者。仅暂存指定的文件,然后将更改提交到 N 个文件一次(文件为一个),或者使用 Command+Enter 作为替代方案。等待真正的结果。明确修改的课程仅更改所述选项。

在航站楼

保存MAIN_ACCESSIBLE后,本机准备并合并:

Command · bash
git add -- index.html
git commit --quiet -m "fix: make the main landmark focusable"
git branch course-before-merge
git merge --quiet --no-ff feature/pricing-cards --message "merge: combine workflow cards with accessibility"
git log -1 --format=%s
git rev-list --parents -n 1 HEAD
git status --short

实际主题:

输出
merge: combine workflow cards with accessibility

父查询发出实际的合并 SHA,后跟两个父 SHA; ID 不同。完整合并的index.html与fixture中的MERGED逐字节匹配;状态为空。显式本机主题不需要与应用程序生成的主题匹配:如果祖先/内容一致,则接受实际的应用程序消息,切勿覆盖虚假的本机消息。

Command · bash
npm run --silent lint
npm test -- --test-reporter=tap
npm run --silent build

针对合并的检查点运行这些;源文本和父计数本身并不能证明检查。夹具套件有六项测试。对发散输入的单独 ff-only 尝试必须拒绝,而不是默默地选择此合并模式。

结果

Where you end: 将 M 与第一个父级(准备好的主要提示)和第二个父级 F1 合并的要点;完整的合并页面包含工作流程卡、Leo 页脚和可聚焦的主页面。索引/工作清洁;没有远程推送。

常见错误

  • 合并方向错误。
  • 将南瓜称为双亲合并。
  • 信任无冲突预览作为语义证明。

如果出现问题

如果真正的合并停止,则保持其操作状态并使用稍后教授的冲突/中止工作流程;不要发出不相关的重置。在完成本机合并之前,course-before-merge 仅保留旧的提交提示,而不保留任意工作字节。

检查你的理解情况

回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。

  1. 第 1 题,共 6 题

    是什么让合并提交与众不同?

    选择一个答案。

  2. 第 2 题,共 6 题

    需要哪些证据?

    选择每个适用的答案。

  3. 第 3 题,共 6 题
    必填

    F1的身份会发生什么变化?

    选择一个答案。

  4. 第 4 题,共 6 题
    必填

    在此分歧输入上选择 ff-only:结果?

    选择一个答案。

  5. 第 5 题,共 6 题

    没有文本冲突意味着不需要测试?

    选择一个答案。

  6. 第 6 题,共 6 题
    必填

    最终的范围是什么?

    选择每个适用的答案。

0 个(共 6 个)正确

正确回答所需的问题以完成课程。

在此浏览器中检查。

练习

验证确切的合并字节和两个实际父级,F1 不变。预测仅对原始发散输入拒绝快进;仅在单独的副本中进行测试。

您自己的确认:该网站无法看到您的计算机。

要完成本课程,请正确回答所需的问题并确认实践练习。

回顾

  • 分歧是一种血统关系。
  • 合并保留旧的提交身份。
  • 内容和家长检查都是必需的。

术语表介绍

合并——合并提交 — ?????????????????????共同祖先 — การรรรร第一个父母 - ?????????

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 从确切的检查点开始。
  2. 命名分支、索引 和工作版本。
  3. 仅准备单独的课程副本。
  4. 准备独立 可访问性变化。
  5. 仅记录预期的主要更改。
  6. 检查实际的分歧血统。
  7. 将该功能合并到当前的 main 中。
  8. 刻意选择录制模式。
  9. 等待真正的合并结果。
  10. 验证父项和合并内容。
  11. 将此合并保留在本地,直到经过审核。
  12. 是什么让合并提交与众不同?
  13. 血统是由父母定义的 ID,而不是消息或颜色。
  14. 需要哪些证据?
  15. 结构上有效的合并 仍然可能有错误的内容。
  16. F1的身份会发生什么变化?
  17. 合并连接现有提交 而不是重播它们。
  18. 在此选择 ff-only 分歧输入:结果?
  19. 这两个提示都不是必需的 简单快进的后代。
  20. 没有文字冲突 意味着不需要测试?
  21. 语义正确性需求 内容审查和测试。
  22. 最终的范围是什么?
  23. 本地合并中没有推送。
  24. 验证实际结果, 不仅仅是一条消息。
  25. 在行动之前预测改变的输入。
  26. 在恢复之前保留有用的工作。
  27. 在继续之前证明检查点。
  28. 保留验证结果 以便下一步。