对于我正在处理的这个项目,我们使用了相当标准的 git rebase 工作流程。也就是说,我们将在 feature
分支中完成所有工作。在一个功能准备好进行测试后,其他人将:
git checkout master
git merge feature
我们还有一个
stable
分支,它基本上是 master
的一个不那么前沿的副本。在 master
中的更改经过其他人的彻底测试后,有人会:git checkout stable
git merge master
我遇到的问题是以下情况:
master
与 stable
相比有许多新的提交,因为一个新特性刚刚被推出进行测试。 master
中的提交还没有准备好 merge 到 stable
中。 stable
中发现了一个错误,需要立即修复。 我不能简单地将错误修正添加到
stable
,然后在其上重新设置 master
,因为其他人已经检查了 master
。我无法将错误修正添加到 master
,然后将其 merge 到 stable
中,因为 master
包含根本无法使用的提交。最后,我不想只在 stable
和 master
的末尾添加错误修正,因为这会使下一个 git checkout stable && git merge master
中断。如何调整我的工作流程以适应这种情况?我想避免重复提交(即
stable
以两次“相同提交”结束,具有不同的提交哈希)或 merge 提交。目前,由于这种情况并不经常出现,我只是将
master
重新绑定(bind)到 stable
上,并确保其他检查过它的人都知道。但是,我想知道是否有更干净的方法来实现这一目标。 最佳答案
这是一个简单的方法,或者我希望经过一些研究后它看起来很容易,可以避免 merge 提交。
从文本和评论中,我看到您正在使用 master
和 stable
进行行军 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/