如何使用 Git 作为一次提交变基

How can I rebase as one commit using Git

我的历史看起来有点像这样,但是乘以 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 次提交。常规变基的主要问题是它试图一次变基一个提交,我必须一遍又一遍地修复和重新修复类似的冲突。

我只想获取我的分支的提示和大师的提示之间的差异,并将它们应用到大师之上。

这其实很简单。

  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
    

#2 和#3 的唯一目的是摧毁 feature-branch 的历史。如果你确定你永远不需要那段历史,那很好。但是,为了删除实际发生的事情的准确记录而花费所有这些额外的麻烦似乎是一种浪费。

我假设 e'h' 分别是 eh 的精选。我还假设当 Git 尝试应用 e'h' 而不是任何其他提交时会出现冲突。如有不妥请指正

您有几个选择:

  • git rebase 掉落到一个提示说它不能应用 e'h' 时,运行 git rebase --skip告诉 Git 跳过该提交。

    rebase 完成后,如果您想要将提交压缩为一个:

    git reset --soft master
    git commit
    
  • 进行交互式变基并告诉 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