如何在Git中回退到某个特定的提交版本,但保留我所做的所有提交记录。

4
假设我有提交A-B-C-D-E-F。请注意,所有提交都已推送到上游。
我想要还原到提交D,但也想在分支中保留提交E和F。
所以我想做的是创建一个提交G,它将与D具有相同的内容。最终我的分支将看起来像A-B-C-D-E-F-G,其中D=G。
我该如何做到这一点?

你可以使用 git revert E F,但它会创建两个提交来撤销 E 和 F。 - choroba
@choroba 这个序列只是为了说明。实际上,还有很多提交包含 E 和 F,所以这不是一个解决方案,很遗憾。 - Filipe Aleixo
1
如果您有超过2个提交,不确定为什么这不是解决方案。您可以压缩所有新提交,对吧? - Scratte
这个回答解决了你的问题吗?在公共仓库中回滚到旧的Git提交记录 - Joe
1个回答

4

您只需获取D的确切内容,并使用该内容创建一个提交:

# choose a. or b. :
# a. 'git restore' was added for this purpose in version 2.25,
#    and has options which are more explanatory (readable at least) :
git restore --source D --staged --worktree -- .

# b. for older gits, or for people enjoying more obscure commands, there is 'git read-tree' :
git read-tree D

# after that :
# confirm that the content you expect is staged, and commit :
git status
git commit

一个小心的提醒:使用带有 --worktree 选项的 git restore 命令可能会删除文件并放弃尚未存储在 git 中的文件修改,就像 git reset --hard 命令一样。

建议您在清洁的工作目录上使用此命令,或者至少检查您是否可以扔掉当前的修改。


2
当提到解释性和可读性时,--source-s更易读。 - choroba
1
另一种具有相同原则的方法:git checkout D; git reset --soft F; git commit -m "Reverting E and F"。随意设置一个分支,以便您在该点上停留。 - eftshift0
需要将 git restore 加入我的工具箱。 - eftshift0
你确定吗?我不这么认为。git reset --soft 只会将分支指针移动到 F,但工作树和索引仍然保留着 D 中的内容。如果在此之后立即提交,你最终得到的是跟随 FG,其内容与 D 相同。 - eftshift0
没问题! - eftshift0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接