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

Ale*_*ula 367 git patch commit

情况:

  • 主人在X.
  • quickfix1是在X + 2提交

这样:

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
Run Code Online (Sandbox Code Playgroud)

然后我开始研究quickfix2,但不小心将quickfix1作为源分支进行复制,而不是master.现在quickfix2处于X + 2提交+ 2相关提交.

o-o-X (master HEAD)
     \
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)
Run Code Online (Sandbox Code Playgroud)

现在我希望有一个quickfix2分支,但没有属于quickfix1的2次提交.

      q2a'--q2b' (quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)
Run Code Online (Sandbox Code Playgroud)

我尝试从quickfix2中的某个修订版创建补丁,但补丁不保留提交历史记录.有没有办法保存我的提交历史记录,但有一个分支没有更改quickfix1?

Von*_*onC 358

这是一个经典案例rebase --onto:

 # 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 
Run Code Online (Sandbox Code Playgroud)

所以你应该去

o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)
              \
               q2a--q2b (quickfix2 HEAD)
Run Code Online (Sandbox Code Playgroud)

至:

      q2a'--q2b' (new quickfix2 HEAD)
     /
o-o-X (master HEAD)
     \ 
      q1a--q1b (quickfix1 HEAD)
Run Code Online (Sandbox Code Playgroud)

最好在干净的工作树上完成.
git config --global rebase.autostash true,特别是在Git 2.10之后.

  • 请注意,这些步骤将修改quickfix2的历史记录,因此如果您已经共享了分支,请使用cherry-picking(请参阅以下答案). (23认同)

DJ.*_*DJ. 151

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

可能最好的方法是从master创建分支,然后在该分支中使用git cherry-pick你想要的quickfix2的2次提交.


Chr*_*oph 138

你可以做的最简单的事情是挑选一个范围.它做的一样,rebase --onto但眼睛更容易:)

git cherry-pick quickfix1..quickfix2
Run Code Online (Sandbox Code Playgroud)

  • 此外,它不会丢失原始提交,IIUC,所以似乎更喜欢像我这样的"play-it-safes";或者`rebase --onto`是否也保留了原始的变化? (6认同)
  • `rebase`和`cherry-pick`都会给你新的SHA键.那是因为每次提交都是存储库的唯一**快照. (6认同)
  • @akavel意味着樱桃选择会将原始提交保留在他们的分支中,这是真的 (5认同)
  • `git checkout`在这里至关重要.你的头是什么:)? (3认同)
  • 无论它有什么价值,我都试着在这个答案中"挑选"一个范围,这让我的回购变得困惑.我不得不为每次提交做个人`cherry-pick`s.(也许不言而喻,但是如果有人在挣扎,你必须按照你的提交应用的时间顺序"挑选".) (2认同)

Mat*_*hen 26

我相信它是:

git checkout master
git checkout -b good_quickfix2
git cherry-pick quickfix2^
git cherry-pick quickfix2
Run Code Online (Sandbox Code Playgroud)

  • `cherry-pick`适用于提交哈希所以,如果你只是想从某个地方获取提交并把它放在其他地方,那么这就是你要走的路.只要确保首先执行正确分支的`checkout <branch>`. (3认同)