Git cherry-pick语法和合并分支

The*_*ebs 57 git cherry-pick git-cherry-pick

所以我以前做了无数的樱桃选择,似乎我现在必须在生活中失败,我想尝试从一个分支到另一个分支,这应该是容易的,我怎么会得到一个关于它是合并的错误但是不是给了-m?

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0
error: Commit a8c5ad438f6173dc34f6ec45bddcef2ab23285e0 is a merge but no -m option was given.
fatal: cherry-pick failed
Run Code Online (Sandbox Code Playgroud)

那看起来不对.......它应该是:

$ git cherry-pick a8c5ad438f6173dc34f6ec45bddcef2ab23285e0
Run Code Online (Sandbox Code Playgroud)

从什么时候开始我必须提供-m功能?

use*_*342 76

-m如果提交是合并提交,则必须提供,即具有多个父提交的提交.

通常情况下,git cherry-pick REV可以描述为:

  1. rev及其父级之间进行更改.

  2. 将这些更改应用于当前HEAD,并使用rev的提交消息提交结果.

合并提交加入两行开发.例如,一行实现小部件,另一行删除杂乱.合并为您提供了小部件的代码,没有混乱.

现在考虑一下樱桃挑选过程的第一步:git无法猜测你是想要删除混乱还是实现小部件.你也不能同时做到这两点,因为关于如何做到这两点的信息不包含在单个合并提交中,只有合并树的结果是内容.

-m选项允许您告诉git如何继续.例如,如果发生了杂乱删除master并且使用创建了合并提交git merge WIDGET,那么git cherry-pick -m 1 merged-commit将挑选新的小部件,因为合并树和父级1之间的差异(最后的杂乱删除提交)将完全是小部件添加.另一方面,git cherry-pick -m 2 merge-commit将删除杂乱,因为父2(最后一个小部件添加提交)和merge-commit之间的差异正是小部件分支中缺少的杂乱删除.

  • 为了验证`git cherry-pick`做了你想要做的事,在推之前运行`git show`; 这将向你展示即将被推动的差异. (3认同)
  • @Zennichimaro如果你想要两者,那么我想你需要一个`merge`,而不是'cherry-pick`.挑选樱桃的重点不是在提交后重新创建树(包括更改的两侧),而是重新创建*更改*.合并提交的更改取决于您要查看的合并的哪一侧. (3认同)
  • 如果我想要添加小部件和混乱删除,该怎么办?那是合并提交的重点吗?另外,我会挑选最后提交的小部件 - 或者最后提交的杂乱删除 (2认同)
  • 上帝保佑你用户4815162342 (2认同)

ken*_*orb 18

git请求您指定父编号(-m),因为您的合并提交有两个父级,而git不知道合并的哪一侧应该被视为主线.因此,使用此选项,您可以指定主线和cherry-pick的父编号(从1开始),以便重放相对于指定父级的更改.

要找出您的提交父母,请尝试以下任一方法:

git show --pretty=raw <merge_commit>
Run Code Online (Sandbox Code Playgroud)

要么:

git cat-file -p <merge_commit>
Run Code Online (Sandbox Code Playgroud)

或者为了获得更好的GUI可见性,请尝试:

gitk <merge_commit>
Run Code Online (Sandbox Code Playgroud)

结果,你应该得到类似的东西:

commit fc70b1e9f940a6b511cbf86fe20293b181fb7821
tree 8d2ed6b21f074725db4f90e6aca1ebda6bc5d050 
parent 54d59bedb9228fbbb9d645b977173009647a08a9 = <parent1_commit>
parent 80f1016b327cd8482a3855ade89a41ffab64a792 = <parent2_commit>
Run Code Online (Sandbox Code Playgroud)

然后通过以下方式检查您的每个家长

git show <parent1_or_2_commit>
Run Code Online (Sandbox Code Playgroud)

添加--stat以查看已修改文件的列表.

或使用以下命令比较更改(基于以上父级):

git diff <parent1_or_2_commit>..<commit>
Run Code Online (Sandbox Code Playgroud)

添加--stat以查看已修改文件的列表.

或者使用组合差异来比较两个父母:

git diff --cc <parent1_commit>
git diff --cc <parent2_commit>
Run Code Online (Sandbox Code Playgroud)

然后为您的樱桃选择指定从1开始的父编号,例如

git cherry-pick -m 1 <merge_commit>
Run Code Online (Sandbox Code Playgroud)

然后跑去git status看看发生了什么.如果您还不想提交更改,请添加-n选项以查看发生的情况.然后当你不开心时,重置为HEAD(git reset HEAD --hard).如果您将获得git冲突,您可能必须手动解决它们或指定合并策略(-X),请参阅:如何解决Git中的合并冲突?


Wyc*_*lif 5

就我个人而言,我通常做的是,因为合并合并了 2 个提交,例如,如果我有合并提交 C,它由 2 个父项组成,例如 master 中的提交 A 和来自另一个分支的提交 B 合并,如果我需要挑选合并 我不会用令人困惑的命令来挑选合并提交本身,而是我会单独挑选每个父母 A 和 B,这在您只想挑选提交 B 的情况下也很有帮助来自 master 的案例提交 A 已经被挑选到分支,其中一个在合并发生之前被挑选到。