使用git v1.7.1,我正在尝试同时使用
我的主分支(rebase的目标)很无聊:
但是实际上我得到的是:
在变基之前,我会得到以下内容:
请注意,在Y'和postZ'之间缺少Z'。
--preserve-merges
和--onto
功能进行rebase。最终结果似乎没有合并提交,因此呈线性状态。我更愿意保留合并提交,出于与人们通常使用--preserve-merges
相同的原因(更容易看到在其自己的分支中逻辑上分离的一组提交)。我的主分支(rebase的目标)很无聊:
A-B-C
我想要从中获取的特性分支有一个已合并到其中的子特性分支。像这样: X - Y
/ \
V-W ------ Z
在这里,Z是要获取的特性分支的合并提交的主分支,而X和Y位于子功能分支上。
我使用命令: git rebase --preserve-merges --onto C V Z
最终我想得到的结果是:
X - Y
/ \
A-B-C-W ------ Z
但是实际上我得到的是:
A-B-C-W-X-Y
由于Z是一个无冲突的合并,代码的最终状态是正确的,但历史记录不如我所希望的那么表达。
有没有办法得到我想要的?
编辑以回答@Bombe:: 我编写了一个bash脚本来构建我的示例。在我的系统上(RHEL 6.2和git 1.7.1),这展示了我的问题。
#! /bin/bash
# start a new empty repo
git init
# make some commits on the master branch
git checkout master
touch A.txt; git add A.txt; git commit -m "add A.txt"; git tag Atag
touch B.txt; git add B.txt; git commit -m "add B.txt"; git tag Btag
touch C.txt; git add C.txt; git commit -m "add C.txt"; git tag Ctag
# now build the feature branch
# start at Btag (more or less arbitrary; point is it's before C)
git checkout Btag
git checkout -b feature
touch V.txt; git add V.txt; git commit -m "add V.txt"; git tag Vtag
touch W.txt; git add W.txt; git commit -m "add W.txt"; git tag Wtag
# now a subfeature
git checkout -b subfeature
touch X.txt; git add X.txt; git commit -m "add X.txt"; git tag Xtag
touch Y.txt; git add Y.txt; git commit -m "add Y.txt"; git tag Ytag
# merge the subfeature into the feature
# preserves branch history with --no-ff
git checkout feature
git merge --no-ff subfeature
# the merge commit is our Z
git tag Ztag
# one more commit so that merge isn't the tip (for better illustration of Z missing later)
touch postZ.txt; git add postZ.txt; git commit -m "add postZ.txt"; git tag postZtag
# now do the rebase
git rebase --preserve-merges --onto Ctag Vtag
# optionally move the master branch forward to the top of feature branch
git checkout master
git merge feature
在变基之前,我会得到以下内容:
X-Y
/ \
V-W-----Z-postZ
/
A-B-C
在合并之后,我得到了:
X-Y
/ \
V-W-----Z-postZ
/
A-B-C-W'-X'-Y'-postZ'
请注意,在Y'和postZ'之间缺少Z'。