在合并到主机之前,删除Git分支中的几个提交

在合并到主机之前,删除Git分支中的几个提交,git,version-control,git-merge,merge-conflict-resolution,Git,Version Control,Git Merge,Merge Conflict Resolution,我们有三个主要分支机构开发、uat和掌握。我们正处于当前sprint的最后一周。已经决定将一个特性推迟到下一个版本。该功能已在uat环境中。所以团队希望将其保留在uat分支中。因此,在合并到master之前,我必须删除具有3次提交的功能 我可以从uat创建一个发布分支,还原这3个提交并合并到主版本中。但下一次冲突可能发生在主分支中,因为通常将UAT合并到master。除此之外,发布分支是将为此场景创建的临时分支,它将在合并后删除 我不想和布兰奇大师搞砸。请建议是否有更好的方法来处理这种情况 您正

我们有三个主要分支机构开发uat掌握。我们正处于当前sprint的最后一周。已经决定将一个特性推迟到下一个版本。该功能已在uat环境中。所以团队希望将其保留在uat分支中。因此,在合并到master之前,我必须删除具有3次提交的功能

我可以从uat创建一个发布分支,还原这3个提交并合并到主版本中。但下一次冲突可能发生在主分支中,因为通常将UAT合并到master。除此之外,发布分支是将为此场景创建的临时分支,它将在合并后删除


我不想和布兰奇大师搞砸。请建议是否有更好的方法来处理这种情况

您正在使用的工作流似乎是:为
uat
分支持续构建/部署,然后将
uat
分支合并到
master
中以获得新版本

因此,我建议备份当前
uat
分支,删除
uat
分支上的三个提交。将
uat
分支合并到
master
后,恢复/重新应用
uat
分支上的三个提交,以供下一版本使用

您有两种情况需要更改和恢复/重新应用
uat
分支。您可以遵循以下情况之一

情景1:这三次提交是uat分支上最近的三次提交 假设提交历史记录如下所示,并且提交
D
E
F
是您决定推迟到下一版本的功能的提交

…---A---B            master
…---C---D---E---F   uat
您可以使用以下命令备份当前
uat
分支,然后删除
uat
分支上的三个提交:

git checkout -b temp uat
git checkout uat
git reset --hard HEAD~3
然后提交历史记录如下所示:

…---A---B         master
…---C             uat
     \
      D---E---F   temp
…---A---B------I   master
              /
…---C---G'---H'   uat
     \
      D---E---F---G---H   temp
现在,您可以将新版本的
uat
合并到
master
,因此提交历史记录将为:

…---A---B---G           master
           /
…---------C             uat
           \
            D---E---F   temp
…---A---B         master
…---C---G'---H'   uat
         \
          D---E---F---G---H   temp
…---A---B------I    master
              /
…---C---G'---H'---D'---E'---F'   uat
然后,您可以通过以下方式恢复
uat
分支作为原始分支

git checkout uat
git merge temp
git branch -D temp
然后提交历史如下所示,当下次将
uat
合并到
master
中时,三次提交
D
E
F
将应用于下一版本

…---A---B---G             master
           /
…---------C---D---E---F   uat
情形2:三次提交不是最新的提交,在三次提交之后还有其他提交 假设提交历史记录如下所示,并且提交
D
E
F
是要删除的提交。在三次提交之后,有提交
G
H

…---A---B    master
…---C---D---E---F---G---H   uat
要备份当前
uat
并删除
uat
分支上的三个提交,可以使用以下命令:

git checkout -b temp uat
git checkout uat
git rebase --onto uat~5 uat~2 uat
git checkout temp
git reset --hard HEAD~2
git rebase uat temp
git checkout uat
git merge temp
git branch -D temp
提交历史记录将是:

…---A---B---G           master
           /
…---------C             uat
           \
            D---E---F   temp
…---A---B         master
…---C---G'---H'   uat
         \
          D---E---F---G---H   temp
…---A---B------I    master
              /
…---C---G'---H'---D'---E'---F'   uat
uat
合并到
master
后,提交历史记录如下所示:

…---A---B         master
…---C             uat
     \
      D---E---F   temp
…---A---B------I   master
              /
…---C---G'---H'   uat
     \
      D---E---F---G---H   temp
然后,您可以通过以下命令在
uat
分支上重新应用三个提交
D
E
F

git checkout -b temp uat
git checkout uat
git rebase --onto uat~5 uat~2 uat
git checkout temp
git reset --hard HEAD~2
git rebase uat temp
git checkout uat
git merge temp
git branch -D temp
然后提交历史记录将为:

…---A---B---G           master
           /
…---------C             uat
           \
            D---E---F   temp
…---A---B         master
…---C---G'---H'   uat
         \
          D---E---F---G---H   temp
…---A---B------I    master
              /
…---C---G'---H'---D'---E'---F'   uat

三个提交
D'
E'
F'
可以在下次发布。

使用uat的发布分支,您可以在将其重新合并到主版本之前修复该发布分支上的任何合并冲突。我认为你的第一个想法似乎是合理的。谢谢@Martin,问题是发布分支是一个临时分支,将为此场景创建。它将在当前版本完成后消失。我们总是从UAT合并到master中。@Ela:这是您原始问题中应该包含的关键信息(您现在可以编辑它)。请注意,如果删除分支名称,它保留的提交可能会被垃圾收集,这似乎与发布点相反。感谢@torek,实际上我们在分支策略中没有发布分支。这是一个临时分支,就像在需要时创建一个错误修复分支一样。@t如果合并了分支,您可以安全地删除分支名称(不会丢失任何历史记录)。只有当分支没有在任何地方合并时,这些提交才有可能被丢弃。
…---A---B---G             master
           /
…---------C---D---E---F   uat