【问题标题】:How to cherry-pick from a remote branch?如何从远程分支中挑选?
【发布时间】:2012-12-09 15:45:55
【问题描述】:

我在挑选樱桃时遇到问题。在我的本地机器上,我目前在我的“主”分支上。我想从另一个名为“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 命令时,它会搜索本地数据库以找到我正在谈论的提交吗?

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

git checkout zebra
Switched to branch 'zebra'

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

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

【问题讨论】:

  • 从概念上讲,一切似乎都是正确的。你确定你使用了正确的哈希(你称之为签名)的提交吗?试试 'git show ' 来验证。
  • 嗨,是的,肯定的——我的两个分支都在 github 上,我可以用它们来找到提交页面。如果我理解的话,我的机器在本地的状态是 git 在 'master' 的上下文中无法找到来自 'zebra' 的哈希。我是否需要以某种方式告诉它本地也存在“斑马”?
  • 哦,执行 'git show xyz' 会给出相同的错误“致命:坏对象”。 (我正在用正确的哈希替换 xyz)。
  • 澄清一下,我可以使用我的“xyz”哈希来查看 github 上的提交而不会出现问题,例如:“github.com/me/test/commit/xyz”。

标签: git


【解决方案1】:

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

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

【讨论】:

  • 尝试了这种方法来挑选 Github 上的上游修复,结果发现签出的哈希与 Github 上的不同。因此,我必须检查,获取哈希并挑选它。
  • 这里真的缺少一个在cherry-pick中传递远程的选项,例如: git cherry-pick
  • 在获取远程分支后运行良好。谢谢:)
  • 是的,在为我取回后也有效。有关 git cherry-pick 的更多信息,请访问 atlassian.com/git/tutorials/cherry-pick
【解决方案2】:

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

【讨论】:

  • 嗯,当我已经添加了没有上游标志的 repo 时?
【解决方案3】:

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

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

获取他们的分支

$ git fetch foo

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

$ git log foo/master

Cherry-pick 你需要的提交

$ git cherry-pick 97fedac

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      步骤:
      - git checkout 分支-a
      - git pull origin 分支-a
      - git checkout 分支-b
      - git pull origin 分支-b
      - git cherry-pick

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

      【讨论】:

        【解决方案6】:

        提交应该存在于您的本地,使用git log检查。

        如果提交不存在,请尝试git fetch 使用最新的远程更新本地。

        【讨论】:

          【解决方案7】:

          只需 2 个小步骤即可:

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

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              您尝试选择的提交可能不再属于任何分支。这可能会在您变基时发生。

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

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

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

              【讨论】:

                【解决方案10】:

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

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

                完成:)

                【讨论】:

                • 这是不正确的。因为现在您正在将 master 的 HEAD 合并到 zebra 而不仅仅是选定的提交。
                【解决方案11】:

                我通过提交我想要挑选的提交在分支上解决了这个问题。

                git checkout <branch With Commit To Cherry-Pick>
                

                使用日志查找提交哈希

                git log
                

                当您在记事本上找到您的哈希剪切和粘贴时。如果使用命令只是向上滚动 获取哈希,然后签出您要放置提交的分支。

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

                finally call 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>
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2015-03-30
                  • 2020-05-22
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-02
                  • 2023-03-28
                  • 2014-08-09
                  • 2014-03-17
                  相关资源
                  最近更新 更多