将一系列提交恢复到包含合并的Git存储库的最佳做法是什么?

c3frrgcw  于 2022-10-23  发布在  Git
关注(0)|答案(1)|浏览(105)

我有一个git repo,它有一系列提交,其中包括合并(来自分支)。
在维护历史记录的同时恢复这些提交的最佳做法是什么?例如:

$ git log --oneline
I (HEAD -> development) Some commit msg
H - Another commit msg
G - Yet another commit msg
F Merged [featurebranch] into development
E - An earlier commit msg
D Merged [earlierfeaturebranch] into development
C - Some other commit msg
B - First commit after initial
A - Initial commit

现在,我想(错误地)如果我想在提交B时恢复到回购状态,我只需要做:

$ git revert -n B..HEAD

这是错误的,因为git会对此感到愤怒:

$ git revert -n B..HEAD
error: commit F is a merge, but no -m option was given.

简单地做

$ git revert -n -m 1 B..HEAD

似乎不起作用,因为随后有关于已删除(自提交B后添加)文件的冲突报告。这听起来不对,因为这不重要,我只想回到提交B的状态,并将其推回到原点。
到底缺少了什么(或被掩盖在这里)?
我想一个便宜的方法是 checkout 提交B,备份它,然后 checkout 开发并用B替换开发内容,然后推送它,但这听起来一点都不正确。

0vvn1miw

0vvn1miw1#

如果要返回提交B中的状态,但保留历史记录,请确保要修改的分支已 checkout 并处于干净状态,然后可以执行以下操作:

git reset --hard B
git reset --soft I
git commit -m "Set state back to commit B"
git push

这将生成一个新的提交(称为J),其状态与提交B相同,但将I作为其父级,而不是A
关于您的想法:
我想一个便宜的方法是 checkout 提交B,备份它,然后 checkout 开发并用B替换开发内容,然后推送它,但这听起来一点都不正确。
从概念上讲,这是正确的,上面的命令基本上就是这样做的,但以一种“gitty”方式,不需要单独的备份。

**旁注:**如果你不关心历史,你只需要使用:

git reset --hard B
git push --force-with-lease

相关问题