如何移动某些提交基于git中的另一个分支?

How to move certain commits to be based on another branch in git?

情况:

  • 大师在X
  • QuickFix1处于x+2提交状态

这样:

1
2
3
o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)

然后我开始使用QuickFix2,但意外地将QuickFix1作为源分支进行复制,而不是主分支。现在QuickFix2位于x+2提交+2相关提交。

1
2
3
4
5
o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

现在,我想使用QuickFix2创建一个分支,但是不使用属于QuickFix1的2个提交。

1
2
3
4
5
      q2a'--q2b' (quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)

我试图从QuickFix2中的某个修订版创建修补程序,但该修补程序不保留提交历史记录。有没有一种方法可以保存我的提交历史记录,但是在QuickFix1中有一个没有更改的分支?


这是rebase --onto的典型案例:

1
2
3
4
5
 # let's go to current master (X, where quickfix2 should begin)
 git checkout master

 # replay every commit *after* quickfix1 up to quickfix2 HEAD.
 git rebase --onto master quickfix1 quickfix2

所以你应该从

1
2
3
4
5
o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)

到:

1
2
3
4
5
      q2a'--q2b' (new quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)

最好在干净的工作树上进行。见git config --global rebase.autostash true,特别是在git 2.10之后。


您可以使用git cherry-pick来选择要复制的提交。

也许最好的方法是从master创建分支,然后在该分支中,在您想要的QuickFix2的2提交上使用git cherry-pick


你能做的最简单的事就是挑选一个范围。它和rebase --onto一样,但对眼睛来说更容易。

1
git cherry-pick quickfix1..quickfix2


我相信是:

1
2
3
4
git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2


我发现唯一的工作方式是:

1
2
3
4
5
6
git show>~/some_file.txt
git checkout master
git checkout -b new_branch
git apply -stat ~/some_file.txt
git apply -check ~/some_file.txt
git apply ~/some_file.txt

然后您需要再次提交更改,但比手动提交要容易得多…