Git 如何从遥远的树枝上摘樱桃?

Git 如何从遥远的树枝上摘樱桃?,git,Git,我在进行樱桃采摘时遇到困难。在我的本地机器上,我目前在我的“主”分支上。我想从另一个名为“zebra”的分支中挑选一个提交。“斑马”分支是一个远程分支 因此git状态: # On branch master nothing to commit (working directory clean) 好的,现在我试着选择我想要的承诺: git cherry-pick xyz fatal: bad object xyz 其中“xyz”是我感兴趣的提交的签名,发生在分支“zebra”上 所以第一个明显

我在进行樱桃采摘时遇到困难。在我的本地机器上,我目前在我的“主”分支上。我想从另一个名为“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命令时,它是否会搜索本地数据库以找到我所说的提交

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

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

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

因为“斑马”是一个遥远的分支,我想我没有它的数据 在当地

您没有正确的数据,但试图以错误的方式解决它,这是正确的。要从远程源本地收集数据,需要使用
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
#只取一个遥控器
git获取
#或者从所有的遥控器获取
git fetch——全部
#确保你回到了你想摘樱桃的树枝上
吉特樱桃采摘xyz

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

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

步骤:
-git签出分支-a
-git拉原点分支-a
-git签出分支-b
-git拉原点分支-b
-吉特樱桃精选

输出:
[branch-b]日志数据

作者:作者将一个开发分支合并为master后,我通常会删除该开发分支。但是,如果我想在开发分支中选择提交,我必须使用合并提交散列来避免“坏对象”错误。

这也可以通过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 pull请求中,查找以下文本:“将提交xxxxxxx合并到…”,而不是尝试使用“提交”选项卡中的提交ID。

提交应该存在于本地,请使用
git日志进行检查

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

添加我们要从中选择的远程文件(作为“foo”) 去拿他们的树枝 列出他们的提交(这应该列出获取的
foo
中的所有提交) Cherry选择你需要的承诺
如果您已经获取了,但这种情况仍然发生,以下可能是一个原因

您尝试选择的提交可能不再属于任何分支。这可能发生在您重新设置基础时

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

  • git签出xxxxx
  • git签出-b临时分支机构

  • 然后在回购协议中,再次取回。新的分支将被获取,包括提交。

    我通过使用我想要选择的提交继续执行分支,解决了这个问题

    git checkout <branch With Commit To Cherry-Pick>
    
    当你在便笺簿上找到你的散列并粘贴。如果使用命令,只需向上滚动 获取散列,然后签出要将提交放入其中的分支

    git checkout < branch I Want To Place My Cherry-Picked-Hash In>
    
    git checkout
    
    最后,从git调用cherry-pick(注意)-x是将cherry-pick消息附加到原始消息。 “在记录提交时,请附加一行,内容为“(cherry从提交中选择的…​)“发送到原始提交消息,以指示此更改来自哪个提交。”

    git cherry pick-x
    
    从概念上讲,一切似乎都是正确的。您确定使用了正确的哈希(您称之为签名)吗提交的状态?请尝试“git show”进行验证。您好,是的,肯定-我的两个分支都在github上,我可以使用它们以这种方式查找提交页面。如果我了解,我的机器在本地的状态是git在“master”上下文中无法从“zebra”中找到哈希。我是否需要告诉它“zebra”也在本地存在?哦执行'git show xyz'会产生相同的错误“致命:坏对象”。(我正在用正确的散列替换xyz)。为了澄清这一点,我可以使用'xyz'散列来查看github上的提交,而不会出现问题,如:“.Archived link:尝试这种方法在Github上选择上游修复程序,结果发现签出的哈希与Github上的哈希不同。因此,我必须签出,获取哈希并选择它。这里真的缺少一个在cherry pick中传递remote的选项,比如:git cherry pick在获取远程分支后运行良好h、 谢谢:)是的,在拿到fo后工作
    $ git log foo/master
    
    $ git cherry-pick 97fedac
    
    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 <your hash commit to add to the current branch>