对于我正在处理的这个项目,我们使用了相当标准的 git rebase 工作流程。也就是说,我们将在 feature 分支中完成所有工作。在一个功能准备好进行测试后,其他人将:

git checkout master
git merge feature

我们还有一个 stable 分支,它基本上是 master 的一个不那么前沿的副本。在 master 中的更改经过其他人的彻底测试后,有人会:
git checkout stable
git merge master

我遇到的问题是以下情况:
  • masterstable 相比有许多新的提交,因为一个新特性刚刚被推出进行测试。
  • master 中的提交还没有准备好 merge 到 stable 中。
  • stable 中发现了一个错误,需要立即修复。

  • 我不能简单地将错误修正添加到 stable ,然后在其上重新设置 master ,因为其他人已经检查了 master 。我无法将错误修正添加到 master ,然后将其 merge 到 stable 中,因为 master 包含根本无法使用的提交。最后,我不想只在 stablemaster 的末尾添加错误修正,因为这会使下一个 git checkout stable && git merge master 中断。

    如何调整我的工作流程以适应这种情况?我想避免重复提交(即 stable 以两次“相同提交”结束,具有不同的提交哈希)或 merge 提交。

    目前,由于这种情况并不经常出现,我只是将 master 重新绑定(bind)到 stable 上,并确保其他检查过它的人都知道。但是,我想知道是否有更干净的方法来实现这一目标。

    最佳答案

    这是一个简单的方法,或者我希望经过一些研究后它看起来很容易,可以避免 merge 提交。

    从文本和评论中,我看到您正在使用 masterstable 进行行军 Ant 的技巧,其中允许对它们中的任何一个进行的唯一操作(至少通常)是快进 merge :

    ...--X--...S                        stable
                \
                 m--...--M              master
                          \
                           f--...--F    feature
    

    我的建议如下,当你看到第一部分的丑陋结果时,请耐心等待:
    git checkout master  -B m-temp   # let's do this with nonce names at first
    git revert X
    # (maybe **amend** the commit to what X should have been here)
    
    git checkout stable  -B s-temp
    git cherry-pick m-temp
    
    git checkout feature -B f-temp
    git cherry-pick m-temp
    

    生产:
    ...--X--...S---X''                         s-temp
                \
                 m--...--M---X'                m-temp
                          \
                           f--...--F---X'''    f-temp
    

    并且您的所有分支机构都对 X 进行了唯一的修复。这看起来一团糟,但

    注意 真正的快进 merge 是 。当需要稳定到掌握时,您可以使用以下任一方法正确地做到这一点
    git checkout s-temp            # the slow way
    git reset --hard @{1}          # . (reset one commit from s-temp, i.e. to S)
    git merge m-temp               # .
    

    或获得完全相同的效果:
    git checkout -B s-temp m-temp  # exactly the same, without the rube goldberg
    

    每个生产:
                 X''  <-- discarded cherry-pick of X'
                /
    ...--X--...S---m--...--M---X'               m-temp s-temp
                            \
                             f--...--F---X'''   f-temp
    

    ...而且你的分支仍然有一个针对 X 的修复。当快进大师的时候也一样,让 X' 也被丢弃,而 X''' 是你历史上唯一的 X 修复,或者你可以拥有你的功能分支开发人员重新基于 X' 并丢弃他们自己的 X'''s

    Git 有一个用于分支的“描述”配置项。这里有一些有用的东西可以放在结帐后 Hook 中:
    cat >>.git/hooks/post-checkout <<\EOF
    #!/bin/sh
    #
    #    if there's a stored note about this checkout, show it:
    
    # $3 = 1 for a full branch checkout
    if branch=`git symbolic-ref --short -q HEAD` && test $3 = 1; then
            git config --get-all branch.$branch.description
    fi
    EOF
    chmod +x .git/hooks/post-checkout
    

    然后当你想提醒自己某事时
    git config --add branch.stable.description \
         "reset to commit c0ffee before merging master"
    

    这使得挑选您想要的任何主修复尽可能容易。当你想要笔记消失时,
    git config --unset branch.stable.description c0ffee
    

    使所有与正则表达式 c0ffee 匹配的笔记消失。

    关于Git rebase 工作流程 - 向 "stable"分支添加错误修正,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20150915/

    10-13 05:16