这听起来像是一个基本问题,但我似乎无法找到类似的问题。也许我正在搜索错误的关键字...请指出我是否重复。
我的远程转发mybranchX
,mybranchY
中有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
不用说,在我的情况下,实际的提交数量很大(相当多的几十个),而且每次提交樱桃都是一项长期任务。
答案 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或字符串~2
。 mybranchX
后缀告诉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
因此S
为T~2
,R
为C
,依此类推。您现在可以通过mybranchX~2
(倒数两个第一父链接)或mybranchY^2
命名提交T
(采用提交A
的第二个父级)。提交B
,C
和mybranchY
现在已在mybranchX
上,同时仍在D
上。提交E
和mybranchX
仅在node_modules
。