重新设置单个提交的基准,而不重播后续提交

时间:2019-11-20 10:36:37

标签: git rebase

在以下设置中,我有两个分支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有一个不错的解决方案。)

2 个答案:

答案 0 :(得分:2)

您只需要做:

git checkout B1
git rebase c1

rebase将重新提交来自提交c1和分支B1之间的最后一个共同祖先的所有提交,即来自d1(最后一个共同祖先)的B1中的所有提交。

在您的情况下,d2和d3。

答案 1 :(得分:1)

简短答案

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

第二阶段

-o-o-d1-d2-d3 <<< B1
      \
       c1 <<< B3
         \
          c2-c3 <<< B2

然后您恢复d2d3

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的回忆历史。)