如何从远程分支机构中挑选樱桃?


135

我在摘樱桃时遇到麻烦。在本地计算机上,我目前在“ master”分支上。我想从另一个分支“ zebra”中提交提交。“斑马”分支是一个远程分支。

所以git状态:

# On branch master
nothing to commit (working directory clean)

好的,现在我尝试挑选我想要的提交:

git cherry-pick xyz
fatal: bad object xyz

其中“ xyz”是我感兴趣的提交的签名,发生在分支“斑马”上。

所以第一个明显的问题是,为什么git无法找到我正在引用的提交?老实说,我真的不明白这是如何工作的。git是否在我的工作目录中为其他所有分支存储类似本地提交数据库的内容?执行cherry-pick命令时,它会搜索本地数据库以找到我正在谈论的提交吗?

由于“斑马”是一个远程分支,因此我一直认为我没有本地的数据。所以我切换了分支:

git checkout zebra
Switched to branch 'zebra'

因此,现在在本地计算机上,我可以看到目录中的文件正确反映了zebra的状态。我切换回主服务器,尝试再次进行选择(希望提交数据现在可用),但是我遇到了同样的问题。

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


2
从概念上讲,一切似乎都是正确的。您确定使用正确的提交哈希(您称之为签名)吗?尝试'git show <hash>'进行验证。
0xc0de 2012年

嗨,是的,不错-我的两个分支都位于github上,我可以使用它们以这种方式找到提交页面。据我了解,我的计算机的本地状态使得git在'master'上下文中无法从'zebra'中找到哈希。我是否需要以某种方式告诉它“斑马”也存在于本地?
user291701

哦,执行“ git show xyz”会产生相同的错误“致命:不良物体”。(和我用正确的哈希替换xyz)。
user291701

为了澄清,我可以使用我的'xyz'散列查看github上的提交,而不会出现问题,例如:“ github.com/me/test/commit/xyz ”。
user291701

Answers:


194

由于“斑马”是一个远程分支,因此我一直认为我没有本地的数据。

您没有正确的数据是正确的,但是试图以错误的方式解决它。要从远程源本地收集数据,您需要使用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
尝试使用这种方法在Github上挑选上游修复程序,结果发现检出的哈希值与Github上的哈希值不同。因此,我不得不检查一下,得到哈希值并挑剔。
DustWolf

1
真正缺少这里的一个选项,可以像下面这样通过远程发送信息进行选择:git cherry-pick <remote> <hash>
贾里德(Jared)

在获取远程分支后工作良好。谢谢:)
Adeel

是的,在为我取货后也起作用了。有关git cherry-pick的更多信息,请访问atlassian.com/git/tutorials/cherry-pick
Satheesh M,

12

就像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是您想要的提交哈希。


嗯,当我已经添加了回购而没有上游标志?
Gobliins

10

添加我们要从中选择的远程回购(作为“ foo”)

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

获取分支

$ git fetch foo

列出他们的提交(这应该列出获取的所有提交foo

$ git log foo/master

挑选您需要的提交

$ git cherry-pick 97fedac

5

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


3

首先需要将两个分支数据都拉到本地驱动器上。

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

步骤:
-git checkout分支-a-
git pull原始分支-a-
git checkout分支-b
-git pull原始分支-b
-git cherry-pick <哈希>

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


1

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



0

也可以使用SourceTree轻松实现:

  • 结帐您的主分支
  • 打开“日志/历史记录”标签
  • 找到xyz提交并右键单击它
  • 点击“合并...”

完成:)


这是不正确的。因为现在您正在将master的HEAD合并到斑马中,而不是仅合并到选定的提交中。
法老王厨师

0

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

您尝试选择的提交可能不再属于任何分支,这可能会发生。重新设置基准时可能会发生这种情况。

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

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

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


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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.