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

时间:2012-12-09 15:45:56

标签: git

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

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

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

11 个答案:

答案 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可以很容易地实现这一点:

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

完成:))

答案 7 :(得分:0)

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

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

获取其分支

$ git fetch foo

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

$ git log foo/master

樱桃选择您需要的提交

$ git cherry-pick 97fedac

答案 8 :(得分:0)

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

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

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

  1. git checkout xxxxx
  2. 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 个小步骤:​​

  1. git 获取
  2. git cherry-pick ur-commit-hash