Git rebase工作流程 - 将错误修正添加到“稳定”分支

时间:2013-11-22 17:27:56

标签: git

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

git checkout master
git merge feature

我们还有一个stable分支,它基本上是master的前沿副本。在master的更改经过其他人的全面测试后,有人会:

git checkout stable
git merge master

我遇到的问题是以下情况:

    master相比,
  1. stable有许多新提交,因为刚刚推出了一项新功能进行测试。
  2. master中的提交根本无法合并到stable
  3. stable中发现了一个错误,需要立即修复。
  4. 我不能简单地将错误修正添加到stable,然后在其上重新设置master,因为其他人已经检出master。我无法将错误修正添加到master,然后将其合并到stable,因为master包含完全没有准备好使用的提交。最后,我不想只将bug修正添加到stablemaster的末尾,因为这会使下一个git checkout stable && git merge master中断。

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

    目前,由于这种情况不会经常出现,我只需将master重新定位到stable并确保已签出的所有其他人都知道。不过,我想知道是否有更简洁的方法来实现这一目标。

2 个答案:

答案 0 :(得分:5)

将错误修复为stable,然后将其合并到stablemaster

git checkout -b bugfix stable
# Make and commit changes
git checkout stable
git merge bugfix
git checkout master
git merge bugfix

这样,只有一个提交(或一组提交)中包含错误修复,因此在以后将master合并到stable时不会发生冲突。

答案 1 :(得分:2)

这是一种简单的方法,或者我希望在经过一些研究后看起来很容易避免合并提交。

从文字和评论中我看到你正在用masterstable进行行军蚂蚁技巧,其中任何一个允许的唯一操作(至少通常)是快进合并:

...--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的修复程序。这看起来像一团糟,但

注意真正 的快进合并是什么。什么时候赶上主人,你可以用

中的任何一个正确地完成
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修复,或者你可以让你的feature-branch devs rebase到X'并丢弃他们自己的X''s


Git有分支的'description'配置项。这是一个有用的东西放在一个post-checkout钩子:

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匹配的音符消失。