我不太会挑人。在我的本地机器上,我目前在我的“master”分支上。我想从另一个分支中挑选一个提交,命名为“斑马”。“斑马”分支是一个远程分支。

git状态:

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

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

git cherry-pick xyz
fatal: bad object xyz

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

第一个明显的问题是,为什么git找不到我引用的commit ?说实话,我真的不明白这是怎么回事。git是否在我的工作目录中为所有其他分支存储了类似于本地提交数据库的东西?当执行cherry-pick命令时,它会搜索本地数据库来找到我所说的提交吗?

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

git checkout zebra
Switched to branch 'zebra'

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

我对这里发生的事情有个基本的误解,任何帮助都是最好的。


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

您没有正确的数据,但试图以错误的方式解决它,这是正确的。要从远程源本地收集数据,需要使用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

首先需要在本地驱动器上拉出两个分支数据。

发生的事情是您试图从分支-a选择分支-b,其中您目前在分支-b上,但分支-a的本地副本尚未更新(您需要首先在两个分支上执行git拉取)。

步骤: - git checkout branch-a - git拉origin branch-a - git checkout branch-b - git拉origin branch-b - git cherry-pick <hash>

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


在将一个开发分支合并到主分支之后,我通常会删除这个开发分支。然而,如果我想在开发分支中选择提交,我必须使用合并提交散列来避免“坏对象”错误。


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

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

:完成)


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


我从一个拉请求提交id选项卡中使用提交id后返回了这个错误。该提交随后被压缩并合并。在github拉请求中,寻找这段文本:“merged commit xxxxxxx into…”,而不是尝试使用commit选项卡中的提交id。


提交应该出现在你的本地,使用git日志检查。

如果未提交,则尝试git fetch以最新的远程更新本地。


添加远程回购(作为“foo”),我们想从中挑选

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

取他们的树枝

$ git fetch foo

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

$ git log foo/master

挑选你需要的承诺

$ git cherry-pick 97fedac

如果你已经获取了,但这种情况仍然发生,下面可能是一个原因。

可能发生的情况是,您试图选择的提交不再属于任何分支。这种情况可能发生在您进行基数调整时。

在这种情况下,在远程回购:

Git结帐XXXXX Git checkout -b temp-branch

然后在你的repo中,再次取回。新的分支将被获取,包括那个提交。


我解决了这个问题,在树枝上提交我想要樱桃采摘。

git checkout <branch With Commit To Cherry-Pick>

使用日志查找提交哈希

git log

当你在笔记本上找到你的散列剪切和粘贴。如果使用命令,只需向上滚动 为了获得散列,然后签出你想要提交的分支。

git checkout < branch I Want To Place My Cherry-Picked-Hash In>

最后调用cherry-pick from git (note) -x是将你的cherry-pick消息附加到原始消息。 当记录提交时,在原始的提交消息后附加一行“(cherry pick from commit…)”,以表明这个更改是从哪个提交中选择的。

git cherry-pick -x <your hash commit to add to the current branch>

只需要2个小步骤:

git获取 Git选择ur-commit-hash


步骤如下:

git获取 Git checkout[远程分支], 示例:git checkout origin/payroll Git选择db8d7526f2218829a96de72c0cf27e3636893f36 Git分支[new-branch], New-branch必须和remote-branch相同, 示例:git分支payroll Git checkout[新分支] Git推源