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

Make current git working copy equivalent to past commit

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

A--B--C

我想“重置”staged/unstaged 的本地副本索引更改为与 A 相同。

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

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

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

如何使用 git 完成此操作?

如果有人问过这个问题,请提醒我注意重复问题。我无法搜索此行为。

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

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'

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

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