课程 28 · 恢复
恢复共享历史记录中的更改
通过添加取消它的新提交(而不是删除历史记录)来撤消其他人已经拥有的不良更改,并通过正常推送发布修复程序。
- 级别: 中级
- 阅读 3 分钟
- 4 分钟的视频
- 已更新
- 在这节课之前: 合并具有不同历史记录的分支
进度已保存在此浏览器中。
播放时会加载来自 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
: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
: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)打开调色板。提交上的操作使用该提交的右键单击菜单。
- 构建分支、提交和本地服务器,如下一节所示。保持
shared/dark-regression处于签出状态并保持工作树干净。 - 在图表中,选择错误的提交并读取其详细信息:一个已更改的路径、
styles.css和一个添加的行。 - 右键单击它并选择 Revert Commit。它立即适用于您所在的分行;没有消息编辑器。通知上写着“已恢复”。如果它停止,则横幅“正在共享/暗回归中恢复...”会提供 Resolve、Continue 和 Abort…。
- 选择新的提交。它的主题是
Revert "style: introduce the rehearsal contrast regression",它的父级是错误的提交。错误的提交仍在图表中。 - 打开
styles.css:CSS_RESTORED,没有添加规则。 - 单击工具栏 Push。这是分支向其上游的正常推送;不要选择强制推送(带租赁)...。通知上写着“将共享/暗回归推向排练/共享/暗回归”。
- 检查结果:工作树是干净的,两个提交都在图中,并且服务器分支位于新提交上。
如果右键单击合并提交,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 课结果的单独副本中:
git switch --create shared/dark-regression将 DOC_DARK_BAD 保存为 styles.css,然后:
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现在恢复、发布并读取结果:
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 HEAD0
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… 将分支返回到原来的位置。如果恢复本身在完成后是一个错误,则恢复恢复:这只是另一个提交。
检查你的理解情况
回答每个问题,然后阅读原因。标记为“必填”的问题将有助于完成本课程。
0 个(共 6 个)正确
正确回答所需的问题以完成课程。
在此浏览器中检查。
练习
报告还原的主题、其父级、错误提交是否仍然是祖先以及服务器分支是否等于 HEAD。然后预测如果稍后的提交在您恢复之前更改了同一行,会发生什么。
您自己的确认:该网站无法看到您的计算机。
要完成本课程,请正确回答所需的问题并确认实践练习。
回顾
- 恢复会添加一个取消另一个提交的提交。
- 历史留存;文件返回。
- 正常的推动就足够了。
有关的
术语表介绍
恢复 — 恢复;逆变化—— 逆变化;主线父级 — ??????
视频文字记录
视频的旁白,逐条提示。
显示成绩单
- 撤消其他人已经进行的更改 有。
- Reset 将分支移回原处。恢复添加了一个 新的提交代替。
- 其他人已经有了旧的提交。恢复 保留其副本有效。
- 构建带有错误提交的共享分支, 以及拥有它的本地服务器。
- 该图显示了 M,以及错误的提交 顶部。
- 错误的提交添加了一行,并且文本 变得苍白。
- 写下它的 ID。
- 右键单击它,然后选择“恢复提交”。
- 它立即适用。没有留言 编辑。
- 通知说已恢复。
- 新提交以旧提交命名。
- 它的父级是错误的提交。什么都没有 已删除。
- 文件又恢复原样了。苍白法则 消失了。
- 该图显示了两次提交。的 历史只会增长。
- 只有这根树枝动了。没有什么是 尚未发布。
- 该分支比该分支早了一次提交 服务器。
- 单击“推送”。这是正常的推动。
- 通知中明确了分行名称 服务器。
- 不需要武力。该推送仅添加了一个 提交。
- 在终端中,git revert 不进行编辑 做同样的事情。
- 错误的提交仍然是一个祖先。的 答案是零。
- 主题从恢复开始。
- 推送,然后与服务器的ID进行比较 头。他们是平等的。
- 更改输入:有人编辑了相同的内容 稍后再行。
- 恢复因冲突而停止。解决 并继续,或中止。
- 恢复合并需要父级。 通常是第一个。
- 恢复合并后,合并 再次分支可能什么也不做。
- 练习:报告主题、家长、 祖先检查和服务器 ID。
- 接下来,通过引用日志查找丢失的提交。