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可以描述为:
在rev及其父级之间进行更改.
将这些更改应用于当前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之间的差异正是小部件分支中缺少的杂乱删除.
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中的合并冲突?
就我个人而言,我通常做的是,因为合并合并了 2 个提交,例如,如果我有合并提交 C,它由 2 个父项组成,例如 master 中的提交 A 和来自另一个分支的提交 B 合并,如果我需要挑选合并 我不会用令人困惑的命令来挑选合并提交本身,而是我会单独挑选每个父母 A 和 B,这在您只想挑选提交 B 的情况下也很有帮助来自 master 的案例提交 A 已经被挑选到分支,其中一个在合并发生之前被挑选到。
| 归档时间: |
|
| 查看次数: |
54594 次 |
| 最近记录: |