我有两个提交B和C.C是B的固定版本,但不是随着B被修改的后继。 我想将此修补程序应用于最后一次提交的另一个分支A. 如何才能做到这一点,理想情况下不需要中间修补程序文件?Git:如何区分两个提交并将该差异应用于第三个提议
C
| B
|/
.
. A <-- I want to apply diff from B to C here.
|/
我以为它可能是git cherry-pick --no-commit B C
但没有。
我有两个提交B和C.C是B的固定版本,但不是随着B被修改的后继。 我想将此修补程序应用于最后一次提交的另一个分支A. 如何才能做到这一点,理想情况下不需要中间修补程序文件?Git:如何区分两个提交并将该差异应用于第三个提议
C
| B
|/
.
. A <-- I want to apply diff from B to C here.
|/
我以为它可能是git cherry-pick --no-commit B C
但没有。
一种方法是变基到B
,然后樱桃挑所得C′
(“C素”)到A
。 C′
只有C
的更改尚未在B
中。
视觉:
C′
C |
| B
|/
.
. C″
. |
. A
|/
命令:
$ git rebase --onto B C^ C
# Fix conflicts that may occur and commit.
$ git tag C-prime
$ git checkout A
$ git cherry-pick C-prime
# Again, fix conflicts because Git can be a little dumb sometimes (by design!)
在上面,我只是假设所有的字母标识符是标签,没有分支,让我解释没有标识符改变他们指向的提交。实际上,您可能不需要git tag …
命令。
不幸的是,没有这种开箱即用的命令。有像git read-tree -m
这样的低级命令,但它们不提供任何可用的冲突解决方案。
最实际的方法是做一个从B到C的假冒,然后挑选它。这些命令做到这一点:
$ git checkout A
$ git cherry-pick --edit $(echo temporary | git commit-tree -p B C^{tree})
(指树对象的方式来自man gitrevisions)