拉/合并分支的特定提交范围

时间:2018-03-05 12:04:56

标签: git

这听起来像是一个基本问题,但我似乎无法找到类似的问题。也许我正在搜索错误的关键字...请指出我是否重复。

我的远程转发mybranchXmybranchY中有2个分支。
两个分支都有一组单独的提交,如

mybranchX : commitXA--commitXB--commitXC--commitXD--commitXE--HEAD

mybranchY : commitYP--commitYQ--commitYR--commitYS--HEAD

我想将commitXC及更早的内容提取到mybranchY

如何做到这一点?

P.S。我知道git cherry-pick commitXC会选择特定提交的代码更改。但我想要整个历史直到commitXC

commitXA--commitXB--commitXC

之后没有,即我不想要commitXD--commitXE


不用说,在我的情况下,实际的提交数量很大(相当多的几十个),而且每次提交樱桃都是一项长期任务。

2 个答案:

答案 0 :(得分:3)

我认为你没有使用正确的条款。 pull正在与远程仓库同步并合并更改。

我相信cherry-pick就是你要找的东西

git checkout mybranchY 
git cherry-pick commitXC

<强>更新 要进行所有更改commitXA--commitXB--commitXC,您可以合并它们

git checkout mybranchY 
git merge commitXC

答案 1 :(得分:1)

对于这种特殊情况,您只需要git merge

让我们重新绘制图表。而不是:

mybranchX : commitXA--commitXB--commitXC--commitXD--commitXE--HEAD

mybranchY : commitYP--commitYQ--commitYR--commitYS--HEAD

让我们使用

       A--B--C--D--E   <-- mybranchX
      /
...--*   [this commit and all earlier commits are on BOTH branches]
      \
       P--Q--R--S   <-- mybranchY (HEAD)

因为这可能(可能)是您运行git checkout mybranchY之后存储库状态和当前分支的准确表示,HEAD将名称mybranchY附加到git log --all --decorate --oneline --graph

(为了验证这一点,请将此水平图形绘图与Git自己的垂直方向图形作为*的输出进行比较。请注意,此处标记为HEAD的提交很重要实际的合并基础,即两个分支分开的点。)

由于您的S表示提交C,并且您希望与提交C之前的所有提交合并,请找到标识提交mybranchX~2的名称,例如其原始哈希ID或字符串~2mybranchX后缀告诉Git向后计数(在此图中向左)两次提交(在第一个父链接之后,但这些提交只有第一个父级)。由于E名称提交C,如果我们倒数两次,我们就会提交git merge mybranchX~2 # or git merge <hash-id>

然后只需运行:

*

将开始合并过程。 Git会将提交C(合并基础)与提交*进行比较,看看他们做了什么。它会将提交S与提交git diff --find-renames <hash-of-*> HEAD # what we did: --ours git diff --find-renames <hash-of-*> <hash-of-C> # what they did: --theirs 进行比较,以了解您的操作:

*

Git现在将这两个差异结合起来,将更改应用于提交T。如果一切顺利,它将自动进行新的合并提交。新合并提交的两个父 - 我将在此处将其称为S - 将提交C(作为其第一个父级)并提交 A---B---C--D--E <-- mybranchX / \ ...--* \ \ \ P--Q--R--S--T <-- mybranchY (HEAD) (作为其第二个):

T~1

因此ST~2RC,依此类推。您现在可以通过mybranchX~2(倒数两个第一父链接)或mybranchY^2命名提交T(采用提交A的第二个父级)。提交BCmybranchY现在已在mybranchX上,同时仍在D上。提交EmybranchX仅在node_modules