从功能分支合并后回滚主Git分支,而不会丢失功能工作

x33g5p2x  于 2023-02-07  发布在  Git
关注(0)|答案(2)|浏览(150)

场景,使用Azure DevOps Git作为远程:
1.已从遥控器提取最新的main
1.从main创建feature并将其 checkout 。
1.在feature中进行开发工作。
1.提交它(提交A)并将feature推送到远程。
1.已创建将feature合并到远程设备上的main的拉入请求。
1.拉取请求已完成,添加了提交A和新的合并提交B。
1.拉取请求的完成触发了构建和部署--但失败了(可能是因为我忘记在推送之前尝试在本地构建它,也可能是其他原因)。
现在我想恢复远程main的状态以消除障碍,这样其他人就可以继续使用它,而我则在本地工作以解决我的问题,但是我找不到在不丢失我已经完成的工作的情况下实现这一点的方法。
首先,我如何在远程分支上执行revert?Revert,正如我所理解的,是将 one commit的修改反向,但是我有提交A和B。(奇怪的是,当我在遥控器上分别查看它们时,A中所做的所有更改也显示为B中所做的更改。我原本以为B(技术性)不包括任何更改。)我想到进行重置,但Azure DevOps不提供这个功能。我猜了一下,还原了A。现在有一个提交C。
其次,我不能继续在本地feature分支上工作,并期望稍后能够推送它并将其合并到远程master中,我会期望远程会抱怨feature不是最新的,因为它缺少提交B和C。
预料到这一点,我把远程的master拉到我的本地,这样我的本地master现在有提交A,B和C。然后我把本地master合并到我的本地feature分支。结果是我的特性工作被 * 删除 *。feature分支的头现在就像我没有做过第一个工作一样。
如何恢复特性工作,以便能够从中断的地方继续,以及我应该如何在第一时间处理回滚?

nfzehxib

nfzehxib1#

您的选择包括:

  • resetmain分支到合并提交之前,这会擦除合并提交(但没有别的,你仍然会有你的A提交)并重写历史(这是不好的)。
  • 或者,将main分支上的merge提交(可能通过另一个PR,如eftshift0所建议的)合并到revert,这是相当安全的,但是,尽管你仍然有你的A提交,你将不能在将来合并它-你将不得不将你的feature分支 * rebase * 到新的main上。
2fjabf4q

2fjabf4q2#

不要想太多。创建一个新的特性分支来逆转main。然后逆转commitA,解释你是因为废话才逆转的,并将其作为一个新的PR推送,这样它就可以合并并纠正分支。[1]
然后你需要确保你的分支可以再次“合并”到main中,这样你就可以纠正任何混乱的地方了。所以, checkout 你的feature分支,然后“重新提交”和“重定基,”这样就可以git那些从未被合并过的东西,并且不会抱怨:

git checkout my-branch
git commit --amend --no-edit # it's a single commit, right?
git rebase main

现在您可以继续工作,就像什么都没发生过一样。
[1]你也可以恢复合并提交,但是你必须传递另一个参数来告诉git你想从哪个分支看到合并,这样你才能从 * 另一个分支 * 恢复修改,对吧?嗯,过一段时间就有意义了...但是如果你有压力,最好放松下来,恢复真实的的提交,而不是合并提交,即使结果是相同的。

相关问题