将 master 带回特定的提交

Bring master to a particular commit back

我从 master 创建了一个 feature 分支并提交了更改。在我合并到 master 之前,其他人合并了 he/her 分支,但它没有通过声纳质量检查。然后,我也将我的 feature 分支合并到 master 分支上,但合并后我意识到声纳质量检查失败,这是因为 master 甚至在我的分支合并之前就已经被污染了(我做了合并前不要注意构建失败状态)。所以,现在我想将 master 设置为质量检查成功的提交(我知道)。但是由于权限原因,我不能直接在master上进行任何推送,我需要为它提出拉取请求。

但是在将我的 feature 分支合并到 master 之前,我又做了一件蠢事。我合并了另一个质量检查失败的分支的更改。我不知道什么是声纳质量检查,并认为既然 maven 构建成功,X2 也可以合并,但我让事情变得更糟。

            Another branch : X2 --- 
                                   \
Feature branch :  -- A -> B -> C -> X2 ->D -> E
                /                              \
Mater branch : A --->X1-------------------------- Merge commit ->

现在,我希望再次将 master 设置为所有质量都通过的 A。请告诉我在这里能做什么。 仅供参考,声纳报告中的问题也来自 A 之前的提交。 Sonar 似乎以某种方式将旧更改视为新更改并对其进行检查。

好吧,回去有点很容易,即使考虑到您必须保留当前的历史记录:

git checkout the-revision-you-like
git reset --soft master
git commit -m "Let's go back to the-revision-you-like"

现在您在 master 之上有了一个修订,使项目返回到您喜欢的修订的内容

git checkout -b XXXX-revertToGoodSonar # create a new branch for this
git push origin @ # push the branch into remote
# now create the PR and merge

现在棘手的部分是已经合并但不应该合并的功能分支。对于它们中的每一个,您都需要这样做,以便 git 认为 它们从未被合并过(否则它们会在您需要时让您头疼再次合并它们)。假设一个特性分支由 5 个直接修订组成:

git checkout the-feature-branch~5 # checkout the exact revision where it was started from
git cherry-pick HEAD..the-feature-branch # reapply all revisions
git branch -f the-feature-branch # reset branch pointer to new revision

现在,分支 完全相同 除了它由 git 认为[=27= 的修订组成] 从未被合并。所以当你想将它们合并到 fixed master 分支时,它不会对应该合并什么感到困惑。