是否可以选择在交互式变基中恢复提交?

is there an option to revert a commit in an interactive rebase?

我们的 git 分支管道是

dev -> test -> uat -> master

其中 testuatmaster 是受保护的分支。

我在 uat 之前完成了一些错误的合并。我想还原它们。我尝试使用 rebase 而不是 revert 因为我无法在 HEAD~{n} uptil 中找到 n 我可以还原我所有的提交和合并。

git revert HEAD~n

所以我尝试改用 rebasse。我找到了对开发的良好承诺,直到一切正常。我用了

git rebase -i good_commit_sha

我看到了所有提交的列表(大部分是错误的),我放弃了所有提交并选择了 2 个好的。但是当我看到合并请求时,我只会看到我选择的那些(自然地)。所以我意识到我想恢复而不是下降。这可能吗?

我知道这不是一个好的做法,但愿意接受建议,我认为这是一种常见的情况。

一个值得记住的好短语:Rebase locally, merge remotely

意思是只要它还没有被推送,就可以随意使用(交互式)变基并修复你需要的一切。这可能涉及删除提交、压缩它们,以及任何有助于了解您的提交历史记录的内容。

一旦它被推送,你应该使用 merge,否则你将不得不 force-push 稍后你的 rebased 更改,你应该始终避免,因为有人可能已经检查了你要做什么更改(在这里谈论提交历史)。

话虽如此,您的做法是一种可能性。稍后恢复错误的提交是另一种方法。
期望错误的提交已经在您的遥控器上,后一种方法应该是首选。

I have some faulty merges done uptil uat. I would like to revert them. I tried using rebase instead of revert because I was not able to find the n in HEAD~{n} uptil which i can revert all my commits and merges.

git revert HEAD~n

这是您的实际问题,我们会尽力给出解决方案。

要在合并后 git 恢复,您必须指定一些选项,如 Linus 本人在 docs and as explained in this answer. You'll have to specify the side of the merge to revert to, otherwise the statement would be umbiguous. This tutorial 中所述将有所帮助。

您的语法应如下所示:

git revert -m 1 <SHA of the commit to revert to>

记住,-m 从 1 开始计数,您可能想在本地运行几次,然后提交并推送“好的”那个。

我设法从另一个关于 SO 的问题中找到了答案。 (查找 link)

git reset --hard good_ocmmit_sha

HEAD 现在处于 good_ocmmit_sha 修复单元测试

git reset --soft @{1}

git commit -m "Reverted to stable"

[revert_branch ] 恢复稳定