git merge PR 之前还原的提交(但不是所有还原的提交)

Posted

技术标签:

【中文标题】git merge PR 之前还原的提交(但不是所有还原的提交)【英文标题】:git merge PR of previously reverted commits (but not all the reverted commits) 【发布时间】:2021-11-02 03:54:02 【问题描述】:

我查看了多个对我的情况不起作用的类似问题和回复。

最近,"Github does not recognize…" 2017 年

我有这样的情况

分支 A -> B B(添加 100 次提交) B -> C(添加 1 个提交) B(添加另外 100 个提交) 意外:B 通过 PR 合并到 A(w/200 次提交) 补救措施:恢复该 PR(1 次提交) 愿望:将 C 合并到 A

想法/尝试

PR (C -> A) 没有看到变化 侧边栏:PR (A -> C) 将尝试从 C 恢复相关更改 - 这定义了所需的努力,但相反 创建 C',从 A 变基 C,PR 看不到更改(因为合并/还原不涉及 C) 无法还原还原(above link 中的选项 1),这将包括不需要的 B 内容 我必须挑选樱桃吗? ??? (还原的 PR 不会列出所有提交,只显示 99,然后在“显示全部”时失败)

这是一个解决方案/解决方法吗:

重命名 A -> D; D 之后可能不会被使用 重命名 C -> A 如果是这样,那么 B 会离开哪里,B 的工作最终需要转移到 A 中?

加分问题,跟进上述解决方法

如果您有 Azure git 分支策略,它们属于分支还是分支名称

对于那些需要混凝土的人:

A - master B - develop C - 1.3 发布分支 D - 1.2 发布(目前不作为分支存在,只是标签 1.2.0,...,可能不会使用)

注意:在我们的环境中,公司已将分支机构 A 锁定,因此我无法直接 push -f 访问它,也无法在服务器上 git reset --hard

如果这些是选项,我会立即这样做。

在这件事上搁浅了,下次我会知道(希望永远不会发生)我会立即联系 DevOps 团队,以临时访问所需的分支,并以他们想要的方式使用工具。提交的还原是非常不可取的。

【问题讨论】:

你是如何还原的? 当你说要将 C 合并到 A 时,是否要引入 B 的 100 次提交? 这个问题有更新吗?如果答案能给你一些帮助,请随时告诉我。只是提醒this。 @Schwern 还原是在 Azure 的服务器上完成的;右侧的三点菜单中有一个菜单项可以“恢复” PR。多提交 PR 被单次提交还原。 【参考方案1】:

让我们画出您的存储库,以便我们都在同一个页面上。

分支 A -> B B(添加 100 次提交) B -> C(添加 1 个提交) B(添加另外 100 个提交)

我不会写出 100 次提交,2 次就可以了。

1 - 2 - 3 [A]
         \
          4 - 100 - 5 - 200 [B]
                \
                 7 [C]
意外:B 通过 PR 合并到 A(w/200 次提交)
1 - 2 - 3 ------------------ M [A]
         \                 /
          4 - 100 - 5 - 200 [B]
                \
                 7 [C]
补救措施:恢复该 PR(1 次提交)
1 - 2 - 3 ------------------ M - R [A]
         \                 /
          4 - 100 - 5 - 200 [B]
                \
                 7 [C]

现在问题是你的 A 历史被 B 的所有这些垃圾污染了,然后是一个巨大的回归。这会引起各种头痛。

我建议通过在合并和还原之前将 A 重置为 force pushing 来清理您的历史记录。

git checkout A git reset --hard A~2 git push --force-with-index

A~2 是 A 之前的第二次提交,仅在其第一个父母之后。这将是上图中的提交 3。

做完这些,你又回到了傻瓜之前。

1 - 2 - 3 [A]
         \
          4 - 100 - 5 - 200 [B]
                \
                 7 [C]
愿望:将C合并到A

取决于这意味着什么。

C 是否依赖于它在 B 中的部分?要合并 4 和 100 吗?然后合并 C。合并 C 后,将 B 重新定位到 A。

$ PR(C->A)
$ git checkout A
$ git pull
$ git checkout B
$ git rebase A

1 - 2 - 3 -----------[A]
         \           / \
          4 - 100 - 7   5 - 200 [B]

C 中的那个提交是独立的吗? Cherry 将其拾取到 A 上并合并。

$ git rebase --onto A C~ C
$ git checkout A
$ git merge --no-ff C
          7' [C]
         / \
1 - 2 - 3 -- [A]
         \
          4 - 100 - 5 - 200 [B]

最后一条建议,如果你真的将 200 次提交放在一个分支中,那么你的分支就太大了。把你的工作切成小块。考虑采用Feature Branch 或Gitflow 工作流程。

【讨论】:

是的,200 次提交是夸大其词,但我想指出,那里的工作量不适合挑选(但是由于一些工作,我们确实达到了 100 次提交的限制)应该被压扁但没有);取决于“将 C 合并到 A”的含义:是的,我想要合并 4、100 和 7;你的步骤对我来说很有意义,谢谢 - 我只需要暂时取消对 A 分支的限制(不允许使用git push -f)。 @bshirley Cherry pick 将接受一系列提交,因此提交的数量无关紧要。

以上是关于git merge PR 之前还原的提交(但不是所有还原的提交)的主要内容,如果未能解决你的问题,请参考以下文章

git 开发测试分支失误合并到了master分支,怎么还原?

Git仅还原提交中的一些文件[重复]

git怎样撤销一次分支的合并merge

git使用总结

Git Bisect 提交列表

git merge仓