课程 20 · 历史与融合
将未发表的作品重新建立到新的基础上
在独立更新的基础上重播一个未发布的注册提交。保留旧提示并验证新身份、新家长和未更改的预期注册内容。
- 级别: 中级
- 阅读 3 分钟
- 5 分钟的视频
- 已更新
- 在这节课之前: 合并具有不同历史记录的分支
进度已保存在此浏览器中。
播放时会加载来自 YouTube 的视频(隐私增强模式)。
你将学到什么
- 确定确切的私人重播范围。
- 在重播之前保护旧的提交历史记录。
- 识别重新创建的提交身份。
- 验证父树和完整的结果树。
开始之前
从第 18 课结果的单独副本开始(main 是合并 M,干净):私有主题 feature/signup-form 保存一个提交 S,updated-main 保存一个不同的提交 N,两者都在 M 上,rescue/signup-before-rebase 也指向 S。该主题已签出、干净且未发布。
该视频是在 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 或本地路径以相同的输入进行突变,而不是连续进行。只读验证可以遵循其中任何一个。任何被描述为终端工作的准备工作都被标记为本机准备,而不是发明的应用程序功能。
概念和状态效应
变基选择对当前主题唯一的提交,并将其更改重播到新的基础上。它不会移动旧的承诺本身;它会使用新的父级和通常是新的 ID 创建新的提交。
源分支必须是预期的当前分支。在此装置中,S 添加注册,N 添加不同的文档,因此重播是无冲突的,但这并不能使任意变基安全。
出版的历史是一个协调边界。这些提交是故意保密的;不要仅仅为了使图表变得直观而重新调整已发布的定价功能。救援引用保护已承诺的祖先,而不是未保存的文本。
特征和HEAD前进S→S′;索引/工作成为组合树。 N/updated-main、rescue S 和原始 main/M 保持不变。没有服务器突变或自动推送。
准备准确的项目状态
从第 18 课留下的项目的单独普通副本开始(主要是合并 M)。原始的 gittree-features 仍然保留;不要在原始或源结帐中运行此场景。然后执行下面的具体准备工作。存储库本地演示签名已关闭,身份为 GitTree Demo <demo@example.com>。
完整的文件输入
仅在下面指定的阶段保存。这些是完整的 UTF-8/LF 正文,最后有换行符;永远不要粘贴 Markdown 栅栏。未更改的可运行文件继承命名输入。单独变体中的版本不得覆盖原始版本。
index.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.在GitTree
调色板:Command+Shift+P(在 Ubuntu 上为 Ctrl+Shift+P);输入确切命名的命令并选择它。命名引用操作使用该行的上下文菜单,而不是无参数的调色板快捷方式。
- 使用下面标记的本机设置准备准确的分歧和救援分支;没有发布的分支被重写。
- 在应用程序中确认功能/注册表单已签出、干净且未发布;检查S和N。
- 右键单击图表中的 updated-main → Rebase feature/signup-form onto updated-main;该对话框命名当前分支和目标。
- 阅读Options for this rebase。将 Stash local changes and put them back 和 Move the branches that point into these commits 关闭。该对话框显示旧功能/注册表单保存在 refs/ogt/trash 下。
- 选择Rebase feature/signup-form一次;等待rebase完成的通知。如果停止,则保持其运行状态,不要再次点击。
- 检查 S' 父母 N 和受试者。比较实际的旧/新 ID,而不是作为终端输出的模型标签。
- 检查生成的树中的完整 SIGNUP 和 DOC_MERGE;救援分支仍然指向老S。
- 验证干净状态并且没有变基操作;保留原来的 main/M 和所有服务器引用。
对于每个普通提交:Summary 是规定的主题;描述为空;修改先前的提交、跳过挂钩、添加签署者、不同的作者、提交后推送以及允许空提交;没有共同作者。仅暂存指定的文件,然后将更改提交到 N 个文件一次(文件为一个),或者使用 Command+Enter 作为替代方案。等待真正的结果。明确修改的课程仅更改所述选项。
在航站楼
在单独的干净课程 18/M 副本中,创建私有主题:
git switch --create feature/signup-form将保存的 SIGNUP 文件放在 index.html 上(视频将课程文件保存在 ~/Downloads 中并使用 cp ~/Downloads/SIGNUP.html index.html),然后:
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) 中,然后:
git add -- docs/integration-note.md
git commit --quiet -m "docs: add the integration review"
git switch --quiet feature/signup-formBASE_SHA 是私有注册提交之前测量的 M 父级。 topic 和 update-main 现在都有一个独立的提交; rescue/signup-before-rebase 保留了旧主题。该主题的任何内容均未发布。
本机重播替代方案:
git rebase --quiet --no-autostash --no-update-refs --no-autosquash updated-main
git log -1 --format=%s
git rev-parse HEAD HEAD^ updated-main rescue/signup-before-rebase
git status --short观察对象:
feat: add the local signup demonstration实际的 HEAD 与获救的 S 不同; HEAD^ 等于更新主/N。独立文件和确切的注册正文均保留;短暂的状态是沉默。停止意外的已发布/脏输入,而不是添加强制选项。对于冲突变体,请参阅第 23 课;不要将停止的变基视为已经完成。
结果
Where you end: 特征/注册表单点 S′,父 N,带有注册表加上 DOC_MERGE;老S在救援/重新定位前注册中幸存下来。无主动操作,干净; main/M 和服务器不变。
常见错误
- 假设直图意味着旧的提交 ID 仍然存在。
- 将替代窗格视为原始检查点。
- 应用程序成功后重复已完成的突变。
如果出现问题
在重放之前,救援分支保留 S。如果操作停止,请检查横幅并解决或显式中止;已完成的 rebase 不会被 rebase --abort 中止。切勿假设本机重放写入了 GitTree 日志。
检查你的理解情况
回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。
0 个(共 6 个)正确
正确回答所需的问题以完成课程。
在此浏览器中检查。
练习
证明新的 HEAD 与救援不同,其父级等于 N 并且完整的注册/文档字节一致。在单独的第 23 课副本中,如果双方更改相同的英雄线,则预测冲突。
您自己的确认:该网站无法看到您的计算机。
要完成本课程,请正确回答所需的问题并确认实践练习。
回顾
- Rebase 重新创建提交。
- 明确选择当前分支和目标。
- 私人历史和恢复范围很重要。
有关的
术语表介绍
Rebase — 重新设置;重播——重播;救援裁判 — ????????????
视频文字记录
视频的旁白,逐条提示。
显示成绩单
- 从确切的检查点开始。
- 命名分支、索引 和工作版本。
- 仅准备单独的课程副本。
- 准备私人 分歧和救援参考。
- 检查哪个分支实际上是当前的。
- 选择想要的新基地。
- 关闭不相关的重播选项。
- 等待实际回放结果。
- 新父母的意思是 新的提交身份。
- 验证完整的组合内容。
- 保留旧的提示 无需发布它。
- 重播的内容是什么?
- 选定的提交范围是 在新的基地上重新创建。
- 必须检查什么?
- 范围决定了 提交和裁判可能会移动。
- S在N上重播:家长?
- 新提交 S' 的父级为 N。
- 更改输入:相同英雄 两边的线都变了。
- 重播可以停止;分辨率 和延续是明确的。
- 可以 --abort 撤消 已经完成变基了吗?
- Abort需要主动操作;已完成 恢复需要保留证据。
- 什么证明了这个结果呢?
- 消息可以保持不变 当身份发生变化时。
- 验证实际结果, 不仅仅是一条消息。
- 在行动之前预测改变的输入。
- 在恢复之前保留有用的工作。
- 在继续之前证明检查点。
- 保留验证结果 以便下一步。