使当前的 git 工作副本等同于过去的提交

问题描述

给定一个简单的 git repo,我的分支当前设置为提交 C

A--B--C

我想将暂存/未暂存更改的本地副本索引“重置”为与 A 相同。

但是,这是关键,我不想更改签出的分支指针。我不想重置回 A。我希望当前未提交的更改和/或下一次提交 D 等效于 A,同时保留以前的提交历史记录。

A--B--C--D
         ^ same as A

因此本地索引应该在 C 之上显示差异,以将 repo 更改回 A 状态。如果我随后提交该更改,它应该创建一个新的提交 D,它等效于 A

如何使用 git 完成此操作?

如果这已经被问到,请提醒我重复。我搜索这种行为的能力让我失望。

解决方法

有一种使用 Git 所谓的管道命令之一的快捷方法:git read-tree。在适当的时间运行 git read-tree -u hash-or-other-commit-specifier,您现在在 Git 的索引和工作树中拥有来自指定提交哈希的文件的“干净”副本。

上面“适当的时间”这句话的意思是:当你有未完成的工作时不要这样做。如果 git statusnothing to commit,working tree clean,您的身体状况良好。

,

有很多方法可以给这只猫剥皮。这是一种相当简单的方法:

git reset --hard A # (A)
git reset --soft C # (A-B-C) but with the reverse of B and C staged
git commit -m "Revert back to A" # (A-B-C-D)

现在比较 A 和 D 应该不会产生任何变化。

,
# revert back to commit A
git revert -n/--no-commit HEAD^^...HEAD

# make a commit D that is same as commit A
git commit -m 'revert to A'