如何将多个提交从分支移动到另一个分支

时间:2014-08-13 03:43:38

标签: git github

我已经从主人那里剪了一个分支X,然后我做了某些提交说,

  C1, C2, C3, C4, C5, C6

现在我想将X与master分支合并到提交C2,我想将提交C3和C6移动到我从X剪切的不同分支Y.所以我想要的,如下所示:

  master
    \
     \
      X-C1-C2-C3-C4-C5-C6

最后它应该是这样的:

    master------master
      \        /
       \      /
        X-C1-C2
              \
               Y-C3-C4-C5-C6

3 个答案:

答案 0 :(得分:2)

给出的答案要么很短,要么不能满足你的要求,所以我会提供另一个答案。

让我先解释一下git中的分支仅仅是对提交的引用;它们实际上是一个包含其提交哈希值的文件。因此,使用分支时几乎没有开销。

虽然您可以创建另一个分支Y,但这不是必需的。最简单的方法是从C2提交到master的简单合并。

git checkout master
git merge <hash-of-c2>

但请注意,这可能会导致fast-forward合并。如果master上没有进一步的提交,那么就会发生这种情况,因此git只是将master移动到C2,如果你想强制合并提交并避免使用fast-forward你可以使用合并时--no-ff选项。

git merge --no-ff <hash-of-c2>

完成此操作后,您的提交图应与以下内容类似:

* (master) Merge commit
|\
| | * (X) C6
| | * C5
| | * C4
| | * C3
| |/
| * C2
| * C1
|/
* master commit

(master)和(X)是分支的当前提交。


显然,您可以按照建议创建多个分支。最简单的方法如下。

git branch Y X # Create Y branch which points at the same commit as X
git branch -f X <hash-of-c2> # Move X to point at C2

如果还有其他问题,请不要犹豫。

答案 1 :(得分:0)

您可以从X创建新的分支Y. reset X回到指定的提交(C2)。然后merge X进入主人。

答案 2 :(得分:0)

这是完成您之后的最明确的方式:

git branch Y X
git checkout C2 # where "C2" is the commit hash of C2 commit - now Tip of X is at C2
git branch -f X # force repointing of X in .git/refs/heads/X
git checkout master
git merge X  

回复@cabellicar123的回答: 我更喜欢结账重置。重置将移动HEAD,将您从Y分支中分离出来,并且(实际上,它们总是在reflog中)消除您的C3-C6提交。