跳至内容
GitTree

课程 28 · 恢复

恢复共享历史记录中的更改

通过添加取消它的新提交(而不是删除历史记录)来撤消其他人已经拥有的不良更改,并通过正常推送发布修复程序。

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

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

英文旁白 · English and Arabic 字幕

打开视频页面在 YouTube 上观看

你将学到什么

  • 解释一下恢复作为反向提交,以及为什么它适合其他人的历史。
  • 预测新提交的父提交及其留下的文件。
  • 处理冲突的恢复,并了解为什么恢复合并需要父级。
  • 无需强制发布修复程序。

开始之前

您现在位于 shared/dark-regression,这是第 18 课结果 M 的一个分支。它的最后一次提交“样式:引入排练对比度回归”向 styles.css、body { color: #f7f8fa; } 添加了一个规则,该规则将页面文本变成与背景相同的浅色。该提交已位于您为本课程设置的本地服务器上,因此队友可能拥有它。您希望文本再次可读,而不重写其他人已有的任何内容。

一切都是本地的并且采用免费套餐(GitTree 要求您登录):没有托管帐户、没有提供商、没有互联网。服务器是本地裸存储库,而不是 GitHub。每个身份都是虚构的(example.com)。切勿在实际项目中运行本课程。

在 GitTree 中或使用本机 Git 命令进行更改,而不是在同一副本中进行更改。读取结果总是安全的。菜单标签来自 GitTree 2.0 自己的字符串,本机命令使用 Git 2.43 在一次性副本中运行。 GitTree 步骤未在 macOS、Windows 或 Linux 上运行。

概念和状态效应

恢复会查看一次提交更改的内容,并添加一个应用相反更改的 new commit。错误的提交会留在历史中,它发生的证据也会保留在历史中。 Reset 的作用相反:它将分支移回并保留提交,这对于只有您拥有的工作来说很好,但它迫使每个已经拥有提交的人修复他们的副本。

这里新提交的父级是错误的提交,并且文件最终与之前完全相同。分支向前移动一次提交,服务器通过普通推送接受它,因为它只会添加到现有内容中。

反向变化取决于周围的环境。如果有人在错误提交后更改了相同的行,则恢复会因冲突而停止,并且您可以像其他任何问题一样解决它(第 23 课),或者中止。恢复 merge 提交会要求您选择衡量更改的父级:通常是第一个,即合并到的分支。恢复合并还告诉 Git 其更改已被处理,因此稍后合并同一分支可能不会报告任何要合并的内容。本课将恢复普通提交并仅显示该对话框。

只有当前分支才能提交。在你推动之前,没有其他东西会移动。

准备准确的项目状态

从第 18 课结果 M 的单独普通副本开始,并保持原件不变。创建分支,将 DOC_DARK_BAD 保存在 styles.css 上并提交,在副本旁边创建一个新的空裸存储库,将其添加为名为 rehearsal 的远程,并将分支推送到其上游。 CSS_RESTORED 是文件恢复后的样子。

完整的文件输入

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

styles.css — DOC_DARK_BAD

文件摘录 · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --link: #154ab5;
  --line: #bac4d0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font: 1rem/1.6 system-ui, sans-serif;
}

a {
  color: var(--link);
}

.site-header,
main,
footer {
  width: min(68rem, 100% - 2rem);
  margin-inline: auto;
}

.site-header {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 1rem;
}

.hero {
  max-width: 48rem;
  padding-block: 3rem;
}

h1 {
  font-size: clamp(2rem, 5vw, 3.5rem);
  line-height: 1.2;
}

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: 1rem;
}

.feature-card {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: 0.75rem;
  background: var(--surface);
}

section {
  margin-block-end: 2rem;
}

button,
input {
  font: inherit;
}

button,
input {
  padding: 0.5rem 0.75rem;
}

:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

form {
  display: grid;
  max-width: 28rem;
  gap: 0.5rem;
}

body { color: #f7f8fa; }

styles.css — CSS_RESTORED

文件摘录 · css
:root {
  color-scheme: light;
  --page: #f7f8fa;
  --surface: #ffffff;
  --text: #17212e;
  --link: #154ab5;
  --line: #bac4d0;
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  background: var(--page);
  color: var(--text);
  font: 1rem/1.6 system-ui, sans-serif;
}

a {
  color: var(--link);
}

.site-header,
main,
footer {
  width: min(68rem, 100% - 2rem);
  margin-inline: auto;
}

.site-header {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 1rem;
  padding-block: 1rem;
}

.hero {
  max-width: 48rem;
  padding-block: 3rem;
}

h1 {
  font-size: clamp(2rem, 5vw, 3.5rem);
  line-height: 1.2;
}

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
  gap: 1rem;
}

.feature-card {
  padding: 1rem;
  border: 1px solid var(--line);
  border-radius: 0.75rem;
  background: var(--surface);
}

section {
  margin-block-end: 2rem;
}

button,
input {
  font: inherit;
}

button,
input {
  padding: 0.5rem 0.75rem;
}

:focus-visible {
  outline: 3px solid var(--link);
  outline-offset: 3px;
}

form {
  display: grid;
  max-width: 28rem;
  gap: 0.5rem;
}

在GitTree

使用 Command+Shift+P(在 Ubuntu 上为 Ctrl+Shift+P)打开调色板。提交上的操作使用该提交的右键单击菜单。

  1. 构建分支、提交和本地服务器,如下一节所示。保持 shared/dark-regression 处于签出状态并保持工作树干净。
  2. 在图表中,选择错误的提交并读取其详细信息:一个已更改的路径、styles.css 和一个添加的行。
  3. 右键单击它并选择 Revert Commit。它立即适用于您所在的分行;没有消息编辑器。通知上写着“已恢复”。如果它停止,则横幅“正在共享/暗回归中恢复...”会提供 Resolve、Continue 和 Abort…。
  4. 选择新的提交。它的主题是 Revert "style: introduce the rehearsal contrast regression",它的父级是错误的提交。错误的提交仍在图表中。
  5. 打开styles.css:CSS_RESTORED,没有添加规则。
  6. 单击工具栏 Push。这是分支向其上游的正常推送;不要选择强制推送(带租赁)...。通知上写着“将共享/暗回归推向排练/共享/暗回归”。
  7. 检查结果:工作树是干净的,两个提交都在图中,并且服务器分支位于新提交上。

如果右键单击合并提交,Revert Commit 将使用 First parent (the branch merged into) 和 Second parent (the branch merged in) 打开“恢复合并...”。不要在这里运行它。

对于课程中的每个普通提交:Summary 是规定的主题,Description 为空,并且选项 Amend Previous Commit、Skip Hooks、Add Signed-off-by、Different Author、Push After Commit 和 Allow Empty Commit 保持关闭状态。

在航站楼

在第 18 课结果的单独副本中:

Command · bash
git switch --create shared/dark-regression

将 DOC_DARK_BAD 保存为 styles.css,然后:

Command · bash
git add -- styles.css
git commit --quiet -m "style: introduce the rehearsal contrast regression"
BAD_SHA="$(git rev-parse HEAD)"
git init --quiet --bare --initial-branch=main ../gittree-revert-origin.git
git remote add rehearsal ../gittree-revert-origin.git
git push --quiet --set-upstream rehearsal shared/dark-regression

现在恢复、发布并读取结果:

Command · bash
git revert --no-edit "$BAD_SHA"
git merge-base --is-ancestor "$BAD_SHA" HEAD; echo $?
git log -1 --format=%s
git push --quiet rehearsal shared/dark-regression
git status --short
git ls-remote --heads rehearsal refs/heads/shared/dark-regression
git rev-parse HEAD
输出
0
Revert "style: introduce the rehearsal contrast regression"

祖先检查打印 0:错误的提交仍然位于 HEAD 之后。 styles.css 为 CSS_RESTORED,状态为空,并且 ls-remote 和 rev-parse 的两个 ID 相等。不涉及强制选项。在稍后提交编辑同一行的单独副本中,git revert 以“冲突(内容)”和提示 git revert --continue 和 git revert --abort 停止。并且合并提交上的 git revert 拒绝并显示“是合并但没有给出 -m 选项”; -m 1 选择第一个父级。

结果

Where you end: shared/dark-regression 有一项新的提交,该提交取消了错误的提交。该页面使用CSS_RESTORED,错误的提交仍在历史记录中,服务器分支位于新的提交上,工作树是干净的,没有任何强制。

常见错误

  • 使用重置和强制推送来“删除”其他人已经拥有的提交。
  • 期望错误的提交从日志中消失。
  • 恢复合并而不故意选择其父级。
  • 在查看恢复留下的文件之前推动。

如果出现问题

如果恢复因冲突而停止,请阅读横幅。 Resolve 和 Continue 按照第 23 课的方法完成; Abort… 将分支返回到原来的位置。如果恢复本身在完成后是一个错误,则恢复恢复:这只是另一个提交。

检查你的理解情况

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

  1. 第 1 题,共 6 题

    恢复对错误的提交有什么作用?

    选择一个答案。

  2. 第 2 题,共 6 题

    恢复后,哪些是真实的?

    选择每个适用的答案。

  3. 第 3 题,共 6 题
    必填

    您恢复错误的提交并正常推送。之后的服务器分支在哪里?

    选择一个答案。

  4. 第 4 题,共 6 题

    更改输入:稍后的提交会编辑错误提交添加的同一行,然后恢复错误提交。会发生什么?

    选择一个答案。

  5. 第 5 题,共 6 题
    必填

    您尝试恢复合并提交,Git 说“是合并,但没有给出 -m 选项”。发生了什么事,你会做什么?

    选择一个答案。

  6. 第 6 题,共 6 题
    必填

    恢复和推送后,哪些回读表明它按照课程所述进行了操作?

    选择每个适用的答案。

0 个(共 6 个)正确

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

在此浏览器中检查。

练习

报告还原的主题、其父级、错误提交是否仍然是祖先以及服务器分支是否等于 HEAD。然后预测如果稍后的提交在您恢复之前更改了同一行,会发生什么。

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

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

回顾

  • 恢复会添加一个取消另一个提交的提交。
  • 历史留存;文件返回。
  • 正常的推动就足够了。

术语表介绍

恢复 — 恢复;逆变化—— 逆变化;主线父级 — ??????

视频文字记录

视频的旁白,逐条提示。

显示成绩单
  1. 撤消其他人已经进行的更改 有。
  2. Reset 将分支移回原处。恢复添加了一个 新的提交代替。
  3. 其他人已经有了旧的提交。恢复 保留其副本有效。
  4. 构建带有错误提交的共享分支, 以及拥有它的本地服务器。
  5. 该图显示了 M,以及错误的提交 顶部。
  6. 错误的提交添加了一行,并且文本 变得苍白。
  7. 写下它的 ID。
  8. 右键单击它,然后选择“恢复提交”。
  9. 它立即适用。没有留言 编辑。
  10. 通知说已恢复。
  11. 新提交以旧提交命名。
  12. 它的父级是错误的提交。什么都没有 已删除。
  13. 文件又恢复原样了。苍白法则 消失了。
  14. 该图显示了两次提交。的 历史只会增长。
  15. 只有这根树枝动了。没有什么是 尚未发布。
  16. 该分支比该分支早了一次提交 服务器。
  17. 单击“推送”。这是正常的推动。
  18. 通知中明确了分行名称 服务器。
  19. 不需要武力。该推送仅添加了一个 提交。
  20. 在终端中,git revert 不进行编辑 做同样的事情。
  21. 错误的提交仍然是一个祖先。的 答案是零。
  22. 主题从恢复开始。
  23. 推送,然后与服务器的ID进行比较 头。他们是平等的。
  24. 更改输入:有人编辑了相同的内容 稍后再行。
  25. 恢复因冲突而停止。解决 并继续,或中止。
  26. 恢复合并需要父级。 通常是第一个。
  27. 恢复合并后,合并 再次分支可能什么也不做。
  28. 练习:报告主题、家长、 祖先检查和服务器 ID。
  29. 接下来,通过引用日志查找丢失的提交。