我在执行樱桃挑选时遇到了麻烦。在我的本地机器上,我目前在我的“主”分支上。我想从另一个名为“斑马”的分支中挑选。 “斑马”分支是一个远程分支。
所以git状态:
# On branch master
nothing to commit (working directory clean)
好的,现在我尝试挑选我想要的提交:
git cherry-pick xyz
fatal: bad object xyz
其中“xyz”是我感兴趣的提交的签名,发生在分支“zebra”上。
所以第一个显而易见的问题是,为什么git找不到我引用的提交?说实话,我真的不明白这是如何工作的。对于所有其他分支,git是否在我的工作目录中存储类似于本地提交的数据库?执行cherry-pick命令时,是否会搜索该本地数据库以查找我正在讨论的提交?
由于“斑马”是一个远程分支,我以为我没有本地数据。所以我换了分支:
git checkout zebra
Switched to branch 'zebra'
所以现在在我的本地机器上,我可以看到目录中的文件正确反映了斑马的状态。我切换回master,尝试再次挑选(希望提交数据现在可用),但我遇到了同样的问题。
我对这里发生的事情有一个根本的误解,任何帮助都会很棒。
答案 0 :(得分:147)
由于“斑马”是一个远程分支,我以为我没有它的数据 本地。
你没有正确的数据,但试图以错误的方式解决它是正确的。要从远程源本地收集数据,您需要使用git fetch
。当你执行git checkout zebra
时,你切换到最后一次获取时该分支的状态。所以首先从远程获取:
# fetch just the one remote
git fetch <remote>
# or fetch from all remotes
git fetch --all
# make sure you're back on the branch you want to cherry-pick to
git cherry-pick xyz
答案 1 :(得分:6)
正如OP的附录接受了答案:
如果您遇到问题
fatal: bad object xxxxx
因为你无法访问该提交,所以。这意味着您没有在本地存储该回购。然后:
git remote add upstream REPO_YOU_WANT_THE_COMMIT_FROM
git fetch REPO_YOU_WANT_THE_COMMIT_FROM
git cherry-pick xxxxxxx
其中xxxxxxx是您想要的提交哈希。
答案 2 :(得分:4)
将开发分支合并到master之后,我通常会删除开发分支。但是,如果我想在开发分支中挑选提交,我必须使用 merge commit 哈希来避免&#34;坏对象&#34;错误。
答案 3 :(得分:2)
首先需要在本地驱动器上提取两个分支数据。
正在发生的事情是你试图从branch-a到branch-b进行挑选,你现在在branch-b上,但是branch-a的本地副本还没有更新(你需要执行一个先把git拉到两个分支上。)
步骤:
- git checkout branch-a
- git pull origin branch-a
- git checkout branch-b
- git pull origin branch-b
- git cherry-pick&lt; hash&gt;
输出:
[branch-b&lt; hash&gt;]日志数据
作者:作者&lt;作者
1个文件已更改,1个插入(+),3个删除( - )
答案 4 :(得分:1)
我在使用pull request commit id选项卡中的commit id后返回了此错误。该提交随后被压缩并合并。在github pull请求中,查找以下文本:&#34;将提交xxxxxxx合并到...&#34;而不是尝试使用提交选项卡中的提交ID。
答案 5 :(得分:1)
该提交应该存在于您的本地,请使用git log
进行检查。
如果不存在提交,则尝试git fetch
用最新的遥控器更新本地。
答案 6 :(得分:0)
使用SourceTree可以很容易地实现这一点:
完成:))
答案 7 :(得分:0)
$ git remote add foo git://github.com/foo/bar.git
$ git fetch foo
foo
中的所有提交)$ git log foo/master
$ git cherry-pick 97fedac
答案 8 :(得分:0)
如果您已获取数据,但仍会发生这种情况,则可能是以下原因。
您尝试选择的提交可能不再属于任何分支,这可能会发生。重新设置基准时可能会发生这种情况。
在这种情况下,在远程仓库中:
git checkout xxxxx
git checkout -b temp-branch
然后在您的仓库中,再次获取。新分支将被获取,包括该提交。
答案 9 :(得分:0)
我通过在分支上进行我想挑选的提交来解决了这个问题。
git checkout <branch With Commit To Cherry-Pick>
使用日志查找提交哈希
git log
找到哈希剪切并粘贴在记事本上时。如果使用命令只是向上滚动 获取哈希,然后检出您要放置提交的分支。
git checkout < branch I Want To Place My Cherry-Picked-Hash In>
最后从git调用cherry-pick(注意)-x是将您的cherry-pick消息附加到原始消息上。 “在记录提交时,请在原始提交消息后附加一行(从樱桃中提取……),以表明此更改是从哪个提交中挑选出来的。”
git cherry-pick -x <your hash commit to add to the current branch>
答案 10 :(得分:0)
只需 2 个小步骤: