对于我正在研究的这个项目,我们正在使用一个相当标准的git rebase工作流程。也就是说,我们将在feature
分支中完成所有工作。功能准备好测试后,其他人将:
git checkout master
git merge feature
我们还有一个stable
分支,它基本上是master
的前沿副本。在master
的更改经过其他人的全面测试后,有人会:
git checkout stable
git merge master
我遇到的问题是以下情况:
master
相比,stable
有许多新提交,因为刚刚推出了一项新功能进行测试。master
中的提交根本无法合并到stable
。stable
中发现了一个错误,需要立即修复。我不能简单地将错误修正添加到stable
,然后在其上重新设置master
,因为其他人已经检出master
。我无法将错误修正添加到master
,然后将其合并到stable
,因为master
包含完全没有准备好使用的提交。最后,我不想只将bug修正添加到stable
和master
的末尾,因为这会使下一个git checkout stable && git merge master
中断。
如何调整工作流程以适应这种情况?我想避免重复提交(即,stable
以“相同提交”结束两次,使用不同的提交哈希值)或合并提交。
目前,由于这种情况不会经常出现,我只需将master
重新定位到stable
并确保已签出的所有其他人都知道。不过,我想知道是否有更简洁的方法来实现这一目标。
答案 0 :(得分:5)
将错误修复为stable
,然后将其合并到stable
和master
。
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)
这是一种简单的方法,或者我希望在经过一些研究后看起来很容易避免合并提交。
从文字和评论中我看到你正在用master
和stable
进行行军蚂蚁技巧,其中任何一个允许的唯一操作(至少通常)是快进合并:
...--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
匹配的音符消失。