2

我有一个看起来有点像这样的 git repo:

   A - B - C - D - E - F
   ^                   ^
   |                   |
Staging              master

我想将 Staging 分支指针移动到 E,但我不希望提交 B 和 D 在分支中。我想把 B 和 D 放到他们自己的分支中。

            Staging
               |
               V
A ---- C ----- E - F <- master
  \               /
   B ----- D -----
           ^
           |
         new branch

我不知道如何将提交移出主分支链并将它们移动到自己的分支,然后再次将它们重新合并到主分支中。

这甚至可能吗?

4

3 回答 3

4

对于这类转换,我会使用交互式变基( )。git rebase -i

  1. 创造new-branch

    git checkout -b new-branch D
    git rebase -i A^
    
  2. 移动staging

    git checkout staging
    git reset --hard E
    git rebase -i A^
    
  3. 更新master

    git checkout master
    git reset --hard staging
    git merge new-branch
    

交互式变基

您开始交互式变基git rebase -i A^(它将所有内容从HEADA)。您的编辑器将打开并呈现从最旧到最新排序的提交(请注意,这是相反的顺序,git log有时会令人困惑)。您可以通过重新排列相应的行来重新排列提交。您还可以删除行,这会删除关联的提交。(在您的情况下,删除就足够了。)

注意:如果您已经将历史记录发布给您的同事,那么变基会更改您不应该做的历史记录。

于 2013-08-17T22:04:29.683 回答
1

基于 A 创建两个新分支:

git branch staging-new A
git branch new-branch A

然后使用cherry-picking为每个分支选择你想要的提交:

git checkout staging-new
git cherry-pick C E

和类似的新分支。

然后你可以删除旧的分支 Staging。大师保持不变。

笔记:

  • 如果任何中间提交是合并提交,这将更加复杂(因为挑选合并提交更复杂)。
  • 由于您正在重新创建分支 Staging,因此(由您或其他人)基于它的任何分支都必须更改(通常是重新设置)。
  • 您不会得到您所描述的确切内容,因为挑选樱桃会创建新的提交。所以 staging-new 和 new-branch不会是 master 的祖先(如你的图片所示)。为此,您必须使用 rebase 修改 master 的历史记录。当然,这通常仅在您尚未共享 master 时才可取。
于 2013-08-17T22:01:13.810 回答
0

您想使用git cherry-pick选择性地将提交从一个分支移动到另一个分支。

本文可能对您有所帮助:http: //technosophos.com/content/git-cherry-picking-move-small-code-patches-across-branches

并从 git 手册: http: //git-scm.com/docs/git-cherry-pick

于 2013-08-17T22:00:55.810 回答