180

我在挑选樱桃时遇到了麻烦。在我的本地机器上,我目前在我的“主”分支上。我想从另一个名为“zebra”的分支中挑选提交。“斑马”分支是一个远程分支。

所以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,再次尝试挑选(希望提交数据现在可用),但我遇到了同样的问题。

我对这里发生的事情有一个基本的误解,任何帮助都会很棒。

4

11 回答 11

248

由于“斑马”是一个远程分支,我想我在本地没有它的数据。

您是正确的,您没有正确的数据,但试图以错误的方式解决它。要从远程源本地收集数据,您需要使用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
于 2012-12-09T16:45:09.700 回答
27

正如 OP 接受的答案的附录:

如果您遇到问题

fatal: bad object xxxxx

那是因为您无权访问该提交。这意味着您没有在本地存储该存储库。然后:

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx

其中 xxxxxxx 是您想要的提交哈希。

于 2017-01-09T18:24:51.253 回答
21

添加我们要从中挑选的远程仓库(作为“foo”)

$ git remote add foo git://github.com/foo/bar.git

获取他们的分支

$ git fetch foo

列出他们的提交(这应该列出 fetched 中的所有提交foo

$ git log foo/master

Cherry-pick 你需要的提交

$ git cherry-pick 97fedac
于 2019-05-14T20:13:36.287 回答
9

在将一个开发分支合并到master之后,我通常会删除这个开发分支。但是,如果我想在开发分支中挑选提交,我必须使用合并提交哈希来避免“坏对象”错误。

于 2015-10-14T05:26:14.173 回答
6

需要先在本地驱动器上提取两个分支数据。

发生的事情是您尝试从分支-a 到分支-b 进行挑选,您当前在分支-b 上,但分支-a 的本地副本尚未更新(您需要执行 git pull on首先是两个分支)。

步骤:
- git checkout 分支-a
- git pull origin 分支
-a - git checkout 分支-b
- git pull origin 分支-b
- git cherry-pick <hash>

输出:
[branch-b <hash>] 日志数据
作者:作者 <作者
1 文件更改,1 插入(+),3 删除(-)

于 2014-03-06T11:27:11.623 回答
4

提交应该存在于您的本地,使用git log.

如果提交不存在,则尝试git fetch使用最新的远程更新本地。

于 2018-12-04T16:25:20.180 回答
3

在使用拉取请求提交 ID 选项卡中的提交 ID 后,我返回了此错误。该提交随后被压缩并合并。在 github 拉取请求中,查找此文本:“merged commit xxxxxxx into...”,而不是尝试使用提交选项卡中的提交 ID。

于 2017-12-15T20:15:59.460 回答
3

只需 2 个小步骤:

  1. 获取
  2. git cherry-pick ur-commit-hash
于 2021-07-23T06:53:30.377 回答
2

如果您已获取,但仍然发生这种情况,可能是以下原因。

您尝试选择的提交可能不再属于任何分支。这可能会在您变基时发生。

在这种情况下,在远程仓库:

  1. git checkout xxxxx
  2. git checkout -b temp-branch

然后在你的仓库中,再次获取。将获取新分支,包括该提交。

于 2019-10-01T04:58:54.303 回答
1

我通过提交我想要挑选的提交在分支上解决了这个问题。

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>
于 2020-03-03T15:16:02.087 回答
1

这也可以通过 SourceTree 轻松实现:

  • 签出你的主分支
  • 打开“日志/历史”选项卡
  • 找到 xyz 提交并右键单击它
  • 点击“合并...”

完毕 :)

于 2017-01-03T09:24:24.067 回答