Git中修复破损分支的最佳实践是什么?

3
假设“master”分支必须始终稳定,如果不小心将某个功能合并到“master”后导致其破坏,而且已经推送到远程,那么修复“master”的最佳实践是什么?
我曾经尝试过重置到以前的稳定提交,然后在该提交上对“master”进行push --force,但我认为这种方法有点太粗暴了,因为它涉及重写历史。
我们可以通过一项或多项还原提交来解决问题,具体建议如下: How to do emergency fixes on master in git? 但是,如果您不小心合并了一个包含5个以上提交的功能(据我所知,您只能一次还原一个提交),那么这种方法也有点繁琐。
您还有其他关于修复破损分支的建议吗?

1
你是唯一在那个代码库上工作的人吗?你已经将破损的“master”分支公开了吗(换句话说,你已经将其推送到某个具有共享访问权限的远程仓库中了)?此外,添加一个代表你最近历史记录的ASCII图表将有助于你获得明确的答案;在Git中,最佳操作方式通常取决于你面临的特定情况。 - jub0bs
2个回答

2
如果断点是由于错误的合并导致的,那么您可以使用以下命令撤销合并提交本身:git revert <merge_commit_hash>
git revert -m 1 $merge_sha

假设 ^1 是主分支。

这将还原合并提交引入的所有更改,无论是来自1次提交还是500次提交。

在将来,为了“了解”还原,您需要还原已还原的SHA。

另请参阅Revert Faulty Merge HowTo


-m 代表主线,也就是你想要保留的历史记录。对于典型情况下的 git checkout master 然后 git merge feature,其中创建了一个新的合并提交,那么使用 -m 1 应该是正确的。但还有其他情况不适用这个方法。 - Andrew C

1
如果你使用git revert撤销合并操作,你的历史记录会变成这样。
     o--o--o
    /       \
o--o------o--o----------------o

             ^                ^
             |                |
           merge           merge reverted

如果您进行强制推送,则会像这样。
     o--o--o
    /       
o--o------o

如果没有其他开发人员已经拉取合并,则最好进行强制推送,因为历史记录会更清晰。
例如,分支是否真正合并?
     o--o--o
    /       \
o--o------o--o--------------------o

             ^                    ^
             |                    |
Seems to be merged here, but reverted here.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接