跳至内容
GitTree

课程 12 · 日常工作

通过快进、合并或变基拉取

检查分歧后选择明确的拉动政策。使用三个副本和一台独立的本地服务器来比较仅快进拒绝、合并和私有变基。

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

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

英文旁白 · English and Arabic 字幕

打开视频页面在 YouTube 上观看

你将学到什么

  • 将提取与拉取集成分开。
  • 比较三种明确的政策选择。
  • 将仅限 ff 的拒绝视为政策结果。
  • 查看上游和持久应用程序策略设置。

开始之前

从第 11 课留下的课程项目开始,将 main 带到 Leo 的获取提交;将该提交称为 M。然后,您将拥有一个分歧的三个普通副本:具有一个提交 S 的私有主题,以及具有一个不同提交 N 的服务器分支更新主分支,两者都位于 M 上。私有主题是最新且干净的。每个仅将 origin 指向包含 update-main/N 的新裸服务器,并跟踪 origin/updated-main;旧发布的定价/主要遥控器未发生变化。

该视频是在Ubuntu 24.04上使用Git 2.52.0和GitTree 2.0录制的:在终端中构建了分歧、救援分支和新服务器;三个拉取、结果视图、策略文件和拉取模式恢复均在应用程序中完成;结果在终端中检查。 macOS 或 Windows 上没有运行任何内容,并且 Ubuntu 是唯一记录的 Linux 系统。 GitTree 的源 Git 版本是 2.39.0。

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

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

概念和状态效应

Pull 是 fetch,然后是所选的集成策略;它不是刷新的同义词。即使 ff-only 稍后拒绝移动本地分支,获取阶段也可能会更新跟踪引用。

对于分歧的私有 S/N,ff-only 会拒绝,合并会保留两条路径,并且 rebase 会在获取的基础上重放私有提交。不要默默地改变模式来让拒绝消失。

调色板拉模式命令更新general.pullMode,这是一种应用程序范围的首选项,而不是一次性的 Git 标志。录制/恢复录制应用程序中的先前设置。下面的本机显式拉取标志不会更改该应用程序设置。

每次拉取都会获取其沙箱来源。仅 FF 将主题/索引/工作留在 S; merge 和 rebase 只更新自己的主题和文件。没有推送服务器分支。选择调色板策略还会更改应用程序范围的首选项,直到恢复为止。

准备准确的项目状态

从第 11 课留下的清洁课程项目的单独普通副本开始。原始的 gittree-features 仍然保留;不要在原始或源结帐中运行此场景。 (课程的早期计划从后来的合并课程的结果开始本课程;该课程尚未录制,因此视频使用第 11 课的项目和相同的步骤。)然后执行下面的精确准备。存储库本地演示签名已关闭,除非明确指定团队成员,否则 GitTree Demo <demo@example.com> 是身份。

完整的文件输入

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

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>
    <section aria-labelledby="signup-title">
      <h2 id="signup-title">Try the demo form</h2>
      <form id="signup-form" novalidate>
        <label for="demo-email">Demo email</label>
        <input id="demo-email" name="email" type="email" autocomplete="off" aria-describedby="signup-hint">
        <p id="signup-hint">Use a fictional example.com address. Nothing is sent.</p>
        <button type="submit">Check the address locally</button>
        <p id="signup-result" role="status"></p>
      </form>
    </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>

docs/integration-note.md — DOC_MERGE

输出
# Integration review

This note was written on main while signup work was private.

文档/pull-policy.md — DOC_PULL

输出
# Pull policy

Fetch first and inspect ancestry.
Use fast-forward only when no integration decision is needed.
Merge preserves existing commit identities; rebase recreates private commits.
Never rewrite someone else's published work without coordination.

在GitTree

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

  1. 下面准备三个实际的隔离副本及其自己的服务器/上游;在选择策略之前记录之前的general.pullMode。
  2. 在FF复制中,调色板拉:仅快进,然后工具栏Pull按钮;等待真正的分歧拒绝。该应用程序的通知显示“功能/注册表单无法快进”,表示双方均已提交另一方未提交的内容,没有任何更改,并提供 Resolve… 进行合并、变基或重置。它会一直保留到您将其关闭为止,因此请在下一个副本之前将其关闭。
  3. 即使获取的 origin/updated-main 是最新的,检查主题提示/工作是否不变;不要按强力推...。
  4. 在未触及的合并副本中,选择“拉动:如果可能则快进”,“否则合并”,然后选择工具栏“拉动”按钮;检查实际的双亲结果。
  5. 在未触及的 Rebase 副本中,选择 Pull:Rebase,然后 Pull;当前主题是私有的,不需要自动存储。
  6. 验证在 N 上重新创建的 S',合并父树和相等的完整树。独立保存每个结果。
  7. 仅在保留比较快照后,将完整的 DOC_PULL 保存为练习副本中的 docs/pull-policy.md;在这里不做任何承诺。
  8. 显式恢复录音应用之前的 Pull 模式;验证没有发生自动推送或原始主更改。

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

在航站楼

在项目的单独干净副本中,首先将 main 引入 Leo 的获取提交(即 M),然后创建私有主题:

Command · bash
git merge --ff-only --quiet origin/main
git switch --create feature/signup-form

将保存的 SIGNUP 文件放在 index.html 上(视频将课程文件保存在 ~/Downloads 中并使用 cp ~/Downloads/SIGNUP.html index.html),然后:

Command · bash
git add -- index.html
git commit --quiet -m "feat: add the local signup demonstration"
git branch rescue/signup-before-rebase
BASE_SHA="$(git rev-parse HEAD~1)"
git switch --quiet --create updated-main "$BASE_SHA"

在 Updated-main 上将 DOC_MERGE 放在 docs/integration-note.md (cp ~/Downloads/DOC_MERGE.md docs/integration-note.md) 中,然后:

Command · bash
git add -- docs/integration-note.md
git commit --quiet -m "docs: add the integration review"
git switch --quiet feature/signup-form

BASE_SHA 是私有注册提交之前测量的 M 父级。 topic 和 update-main 现在都有一个独立的提交; rescue/signup-before-rebase 保留了旧主题。该主题的任何内容均未发布。

从该预变基副本中,准备一个仅包含 N 的 new 服务器:

Command · bash
git clone --quiet --bare --single-branch --branch updated-main --no-local . ../gittree-pull-origin.git

当没有 Git/app 操作处于活动状态时,使用 cp -R <source-demo-copy> <new-copy> 制作相同输入的三个普通副本,或保留 .git 的等效验证文件系统副本。在每个副本中,将 origin 替换为该新服务器的测量文件 URL,获取并设置上游主题;永远不要重新定位原始内容:

Command · bash
git remote set-url origin "<measured-file-url>"
git fetch --quiet --prune origin
git branch --set-upstream-to=origin/updated-main feature/signup-form

使用测量的文件 URL 代替占位符。在 FF 副本中:

Command · bash
git pull --quiet --ff-only origin updated-main

测出口128;诊断摘录:

输出
hint: Diverging branches can't be fast-forwarded, you need to either:
hint:
hint: 	git merge --no-ff
hint:
hint: or:
hint:
hint: 	git rebase
hint:
hint: Disable this message with "git config set advice.diverging false"
fatal: Not possible to fast-forward, aborting.

在单独的合并副本中:

Command · bash
git pull --quiet --no-rebase --no-edit origin updated-main

在单独的变基副本中:

Command · bash
git pull --quiet --rebase origin updated-main

两者都成功了;实际的最终树 ID 匹配,合并有两个父级并重放一个。对于每次检查:

Command · bash
git rev-list --parents -n 1 HEAD
git rev-parse 'HEAD^{tree}'
git status --short

SHA 各不相同;在可选策略文件实践之前,状态是干净的。没有命令推送分支。

结果

Where you end: 仅 FF 的副本在获取后拒绝保留在 S 处。合并副本添加了双亲集成;变基副本在 N 上创建 S'。合并/变基树一致;没有推动。仅在比较后将策略文件保留为未提交的实践。

常见错误

  • 假设直图意味着旧的提交 ID 仍然存在。
  • 将替代窗格视为原始检查点。
  • 应用程序成功后重复已完成的突变。

如果出现问题

FF拒绝并不是数据丢失。检查获取的/本地参考并为该副本选择经过审查的策略。如果合并/变基停止,则解决/继续或显式中止;不要对活动操作运行另一个拉动操作。

检查你的理解情况

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

  1. 第 1 题,共 6 题

    这里拉是什么?

    选择一个答案。

  2. 第 2 题,共 6 题

    仅 ff 拒绝会发生什么?

    选择每个适用的答案。

  3. 第 3 题,共 6 题
    必填

    N 上的私人重播:结果父级?

    选择一个答案。

  4. 第 4 题,共 6 题
    必填

    将当前工作更改为已发布的共享主题:rebase 仍然自动建议吗?

    选择一个答案。

  5. 第 5 题,共 6 题

    调色板策略命令更改只需一拉?

    选择一个答案。

  6. 第 6 题,共 6 题
    必填

    对比证明什么?

    选择每个适用的答案。

0 个(共 6 个)正确

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

在此浏览器中检查。

练习

解释被拒绝的副本中哪个状态发生了变化,比较两个成功的树和父树,然后编写完整的 DOC_PULL 策略。验证录音应用程序的首选项是否已恢复。

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

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

回顾

  • 拉动包括整合政策。
  • 成功获取后可能会拒绝。
  • 政策的持续性需要明确的审查。

术语表介绍

Rebase — 重新设置;重播——重播;救援裁判 — ????????????

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 从确切的检查点开始。
  2. 命名分支、索引 和工作版本。
  3. 仅准备单独的课程副本。
  4. 命名上游和 保留所有三个输入。
  5. 快进只会拒绝这种分歧。
  6. 成功获取后可能会出现拒绝。
  7. 合并策略保留了两个历史记录。
  8. 仅重播私人主题。
  9. 比较父母和 分别完整的树。
  10. 之后写下经过审查的拉取政策。
  11. 恢复之前的应用程序范围策略。
  12. 这里拉是什么?
  13. Pull 有一个传输阶段,并且 政策主导的地方阶段。
  14. 仅 ff 拒绝会发生什么?
  15. 获取可以在之前完成 整合拒绝分歧。
  16. N 上的私人重播:结果父级?
  17. 与合并 K 不同,Rebase 在 N 上创建 S'。
  18. 将当前工作更改为已发布共享 主题:rebase 仍然自动建议吗?
  19. 仅限私人的假设不再成立。
  20. 调色板策略命令 只改变一拉?
  21. 源码中写的是general.pullMode 直到另一个选择恢复它。
  22. 对比证明什么?
  23. 而是比较实际状态 而不是命令沉默。
  24. 验证实际结果, 不仅仅是一条消息。
  25. 在行动之前预测改变的输入。
  26. 在恢复之前保留有用的工作。
  27. 在继续之前证明检查点。
  28. 保留验证结果 以便下一步。