我如何使用Git作为一个提交进行rebase

时间:2015-05-12 17:28:21

标签: git rebase squash

我的历史看起来有点像这样但是时间10:

                i - j - e'- k - h'- l - m  feature-branch
              /
    a - b - c - d - e - f - g - h  master

(撇号意思是樱桃选秀权) 我想改变这个:

                                  i - j - k - l - m  feature-branch
                                 / 
    a - b - c - d - e - f - g - h  master

我不介意该功能是否被压缩为1次提交。常规rebase的主要问题是它一次尝试重新设置一个提交,我必须一遍又一遍地修复和重新修复类似的冲突。

我想要的只是取决于我的分支的尖端和主人的尖端之间的差异,并将其应用于主人之上。

2 个答案:

答案 0 :(得分:6)

实际上这很容易。

  1. master合并到feature-branch。您将立即解决所有合并冲突。 (我强烈建议停在这里。)

                i - j - e'- k - h'- l - m - n    feature-branch
              /                           /
    a - b - c - d - e - f - g - h --------       master
    
  2. 然后,git reset --soft master。这将使feature-branch指向master,但它会将所有更改保留在索引中,随时可以提交。

                i - j - e'- k - h'- l - m - n    (orphaned)
              /                           /
    a - b - c - d - e - f - g - h --------       master, feature-branch
                                  \
                                    (index)
    
  3. git commit

                i - j - e'- k - h'- l - m - n    (orphaned)
              /                           /
    a - b - c - d - e - f - g - h --------       master
                                  \
                                    n'           feature-branch
    
  4. #2和#3的唯一目的是破坏feature-branch的历史。如果你确定你永远不会需要那段历史,那很好。但是,为了删除实际发生的事情的准确记录,去除所有这些额外的麻烦似乎是浪费。

答案 1 :(得分:3)

我假设e'h'分别是eh的挑选。我还假设当Git尝试应用e'h'时会出现冲突,但不会出现任何其他提交。如果我错了,请纠正我。

您有几个选择:

  • git rebase出现提示无法应用e'h'时,请运行git rebase --skip告诉Git跳过该提交。< / p>

    一旦rebase完成,如果你想将提交压缩成一个:

    git reset --soft master
    git commit
    
  • 做一个互动的rebase并告诉Git不要申请e'h'

    git checkout feature-branch
    git rebase -i master
    # Git will launch an editor containing an interactive rebase recipe:
    #   1. Delete the e' and h' lines.
    #   2. Optionally change the j through m lines to 'squash' if you
    #      want to squash all of those commits into one.
    #   3. Save the recipe and exit.
    
  • git rebase是一种更简单的方法来执行一系列git cherry-pick命令。您可以自己手动执行这些命令:

    git checkout -b temp-branch master
    git cherry-pick i j k l m
    # optionally, if you want to squash i through m into a single commit:
    #   git reset --soft master
    #   git commit
    git checkout feature-branch
    git reset --hard temp-branch
    git branch -D temp-branch