变基单个提交而不重放后续提交
Rebase single commit without replaying subsequent commits
在以下设置中我有两个分支,B1 和 B2
[B1]
-o-o-d1-d2-d3
\
c1-c2-c3
[B2]
我想将提交 c1 切换到 B1 以实现以下设置
-o-o-d1-c1-d2-d3
\
c2-c3
我知道我可以将 c1 挑选到第一个分支上。但是如果我只在分支 B1 上更改 c1,我的历史就会更清晰。 (我承认,这个问题可以看作是一个美学问题......但我希望 git 有一个很好的解决方案。)
简答
git checkout c1
git cherry-pick d2 d3
git branch -f B1 [HEAD]
逐步过程(为清楚起见,使用临时分支)
初始情况
-o-o-d1-d2-d3 <<< B1
\
c1-c2-c3 <<< B2
首先将临时分支指向 c1
git checkout -b B3 c1
阶段 2
-o-o-d1-d2-d3 <<< B1
\
c1 <<< B3
\
c2-c3 <<< B2
然后你恢复 d2
和 d3
git cherry-pick d2 d3
阶段 3
-o-o-d1-d2-d3 <<< B1
\
c1-d2'-d3' <<< B3
\
c2-c3 <<< B2
您最终必须移动 B1
以指向我们的新结构 (B3
)
git checkout -B B1 B3
# and destroy the temp branch
git branch -d B3
(当然这是重写了B1
的历史)
您只需要做:
git checkout B1
git rebase c1
rebase 将把来自提交 c1 和分支 B1 之间的最后一个共同祖先的所有提交重新应用到 c1,即来自 d1(最后一个共同祖先)的 B1 中的所有提交。
在你的例子中,d2 和 d3。
在以下设置中我有两个分支,B1 和 B2
[B1]
-o-o-d1-d2-d3
\
c1-c2-c3
[B2]
我想将提交 c1 切换到 B1 以实现以下设置
-o-o-d1-c1-d2-d3
\
c2-c3
我知道我可以将 c1 挑选到第一个分支上。但是如果我只在分支 B1 上更改 c1,我的历史就会更清晰。 (我承认,这个问题可以看作是一个美学问题......但我希望 git 有一个很好的解决方案。)
简答
git checkout c1
git cherry-pick d2 d3
git branch -f B1 [HEAD]
逐步过程(为清楚起见,使用临时分支)
初始情况
-o-o-d1-d2-d3 <<< B1
\
c1-c2-c3 <<< B2
首先将临时分支指向 c1
git checkout -b B3 c1
阶段 2
-o-o-d1-d2-d3 <<< B1
\
c1 <<< B3
\
c2-c3 <<< B2
然后你恢复 d2
和 d3
git cherry-pick d2 d3
阶段 3
-o-o-d1-d2-d3 <<< B1
\
c1-d2'-d3' <<< B3
\
c2-c3 <<< B2
您最终必须移动 B1
以指向我们的新结构 (B3
)
git checkout -B B1 B3
# and destroy the temp branch
git branch -d B3
(当然这是重写了B1
的历史)
您只需要做:
git checkout B1
git rebase c1
rebase 将把来自提交 c1 和分支 B1 之间的最后一个共同祖先的所有提交重新应用到 c1,即来自 d1(最后一个共同祖先)的 B1 中的所有提交。
在你的例子中,d2 和 d3。