问题描述
给定一个简单的 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 status
说 nothing 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'