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

use*_*701 117 git

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

所以git状态:

# On branch master
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)

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

git cherry-pick xyz
fatal: bad object xyz
Run Code Online (Sandbox Code Playgroud)

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

所以第一个显而易见的问题是,为什么git找不到我引用的提交?说实话,我真的不明白这是如何工作的.对于所有其他分支,git是否在我的工作目录中存储类似于本地提交的数据库?执行cherry-pick命令时,是否会搜索该本地数据库以查找我正在谈论的提交?

由于"斑马"是一个远程分支,我以为我没有本地数据.所以我换了分支:

git checkout zebra
Switched to branch 'zebra'
Run Code Online (Sandbox Code Playgroud)

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

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

Pet*_*ren 168

由于"斑马"是一个远程分支,我以为我没有本地数据.

你没有正确的数据,但试图以错误的方式解决它是正确的.要从远程源本地收集数据,您需要使用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
Run Code Online (Sandbox Code Playgroud)

  • 这里真的缺少一个在cherry-pick中传递远程的选项,例如: git cherry-pick &lt;remote&gt; &lt;hash&gt; (2认同)

小智 10

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

发生的情况是您尝试从branch-a 到branch-b,其中您当前位于branch-b,但branch-a 的本地副本尚未更新(您需要执行 git pull首先是两个分支)。

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

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


Cez*_*sto 10

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

如果您遇到问题

fatal: bad object xxxxx
Run Code Online (Sandbox Code Playgroud)

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

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx
Run Code Online (Sandbox Code Playgroud)

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


ikb*_*mad 9

只需执行 2 个小步骤即可:

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


Juu*_*nen 5

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


Muh*_*man 5

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

$ git remote add foo git://github.com/foo/bar.git
Run Code Online (Sandbox Code Playgroud)

获取分支

$ git fetch foo
Run Code Online (Sandbox Code Playgroud)

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

$ git log foo/master
Run Code Online (Sandbox Code Playgroud)

挑选您需要的提交

$ git cherry-pick 97fedac
Run Code Online (Sandbox Code Playgroud)