Git 如何删除已推送到原点的合并分支

Git 如何删除已推送到原点的合并分支,git,merge,gitlab,Git,Merge,Gitlab,例如,我有一个缺陷问题,开发人员创建了新的分支,并在分支名称“fix#1_后院_数据显示”中修复了它。然后,我将其合并到分支“beta”中进行测试。过了一会儿,另一个测试人员将另一个分支(如“fix_2”和“fix_3”)合并到“fix_20”中,并对其进行测试。在那之后,我发现我的第一个合并的“fix#1#u backward_data_display”分支有缺陷,使我们的应用程序不稳定 现在,如何删除已推送到原点的合并分支,而不干扰“fix_2”和“fix_3”到“fix_20”?简短回答

例如,我有一个缺陷问题,开发人员创建了新的分支,并在分支名称“fix#1_后院_数据显示”中修复了它。然后,我将其合并到分支“beta”中进行测试。过了一会儿,另一个测试人员将另一个分支(如“fix_2”和“fix_3”)合并到“fix_20”中,并对其进行测试。在那之后,我发现我的第一个合并的“fix#1#u backward_data_display”分支有缺陷,使我们的应用程序不稳定

现在,如何删除已推送到原点的合并分支,而不干扰“fix_2”和“fix_3”到“fix_20”?

简短回答 在
beta
分支中:

  • 查找与合并对应的提交的SHA1
  • 运行
    git revert-m1
  • 有一个警告:Git仍会认为此功能分支已合并到
    beta
    分支中,要再次合并此分支,您需要在合并之前还原(再次)此
    Git revert
    引入的提交

    较长版本 Git中撤销提交的命令是
    revert
    。对于合并提交,需要使用
    -m
    开关指定“主线”分支。在您的情况下,它可能应该是1:

    通常无法还原合并,因为您不知道合并的哪一侧应被视为 主线。此选项指定主线的父编号(从1开始),并允许还原到 反转相对于指定父项的更改

    还原合并提交声明您永远不会希望合并带来的树更改。作为一个 结果,以后的合并只会带来由提交引入的树更改,而这些提交不是合并的祖先 以前还原的合并。这可能不是你想要的

    有关更多详细信息,请参阅revert-a-Faulture-merge How To[1]

    (来源:
    git帮助还原

    下面的
    sh
    脚本演示了这一点。第一个
    revert
    命令还原合并
    fix1
    分支的提交,在这种情况下,它是倒数第二个提交,即
    HEAD^
    。还原后,在再次合并
    fix1
    分支之前,需要使用另一个
    revert
    命令撤消还原:

    #!/bin/sh
    
    git init test
    cd test
    
    touch a
    git add a
    git commit -m a
    
    git checkout -b fix1
    touch b
    git add b
    git commit -m b
    
    git checkout -b fix2 master
    touch c
    git add c
    git commit -m c
    
    git checkout master
    git merge --no-ff --no-edit fix1
    git merge --no-ff --no-edit fix2
    
    git revert --no-edit HEAD^ -m 1
    
    git checkout fix1
    echo "fix b" > b
    git add b
    git commit -m bb
    
    git checkout master
    # git merge fix1 # this will give an error!
    
    # revert changes introduced by revert before merging
    git revert --no-edit HEAD
    git merge --no-ff --no-edit fix1
    

    我在这里找到了解决方案:

    branch_to_revert="fix1"; git log --all --pretty=format:"%H %s" | grep -i "Merge branch '$branch_to_revert'" | grep -v "Revert" | awk '{print $1}' | xargs git revert -m 1
    

    你说“删除合并的分支”是什么意思?从远程删除它,或者恢复您在此分支中所做的承诺?对于误解,很抱歉,我在这里找到了解决方案:#branch=“fix1”;git log--all--pretty=format:“%H%s”| grep-i“Merge branch'$branch'”| grep-v“Revert”| awk'{print$1}'| xargs git Revert-m1