180

チェリーピックを実行するのに問題があります。私のローカルマシンでは、現在「マスター」ブランチにいます。「zebra」という名前の別のブランチからのコミットをチェリーピックしたいと思います。「ゼブラ」ブランチはリモートブランチです。

したがって、git status:

# 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'

これで、ローカルマシン上で、ディレクトリ内のファイルがzebraの状態を正しく反映していることがわかります。マスターに戻り、もう一度チェリーピックを試みます(コミットデータが利用可能になることを期待しています)が、同じ問題が発生します。

私はここで何が起こっているのかについて根本的な誤解を持っています、どんな助けも素晴らしいでしょう。

4

11 に答える 11

248

「ゼブラ」はリモートブランチなので、ローカルにデータがないと思っていました。

あなたは正しいデータを持っていないというのは正しいですが、間違った方法でそれを解決しようとしました。リモートソースからローカルにデータを収集するには、を使用する必要があります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
于 2012-12-09T16:45:09.700 に答える
27

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は必要なコミットハッシュです。

于 2017-01-09T18:24:51.253 に答える
21

チェリーピックするリモートリポジトリを(「foo」として)追加する

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

彼らの枝をフェッチします

$ git fetch foo

コミットを一覧表示します(これにより、フェッチされたすべてのコミットが一覧表示されますfoo

$ git log foo/master

チェリーピック必要なコミットを選択してください

$ git cherry-pick 97fedac
于 2019-05-14T20:13:36.287 に答える
9

開発ブランチをマスターにマージした後、私は通常、開発ブランチを削除します。ただし、開発ブランチでコミットをチェリーピックしたい場合は、「不正なオブジェクト」エラーを回避するために、マージコミットハッシュを使用する必要があります。

于 2015-10-14T05:26:14.173 に答える
6

最初にローカルドライブの両方のブランチデータをプルする必要があります。

何が起こっているのかというと、branch-aからbranch-bにチェリーピックしようとしています。現在、branch-bを使用していますが、branch-aのローカルコピーはまだ更新されていません(git pullonを実行する必要があります)。最初に両方のブランチ)。

手順:
-git checkout branch -a --git
pull origin branch-
a --git checkout branch-b
--git pull origin branch-b
--git Cherry-pick <hash>

出力:
[branch-b <hash>]ログデータ
作成者:作成者<作成者
1つのファイルが変更され、1つの挿入(+)、3つの削除(-)

于 2014-03-06T11:27:11.623 に答える
4

コミットはローカルに存在する必要があります。を使用して確認してくださいgit log

コミットが存在しない場合はgit fetch、ローカルを最新のリモートで更新してみてください。

于 2018-12-04T16:25:20.180 に答える
3

プルリクエストのコミットIDタブからコミットIDを使用した後、このエラーが返されました。その後、そのコミットは潰されてマージされました。githubプルリクエストで、[コミット]タブのコミットIDを使用する代わりに、「コミットxxxxxxxを...にマージしました」というテキストを探します。

于 2017-12-15T20:15:59.460 に答える
3

実行する2つの小さなステップ:

  1. git fetch
  2. git Cherry-pickur-commit-hash
于 2021-07-23T06:53:30.377 に答える
2

フェッチしたにもかかわらず、これが発生する場合は、次の理由が考えられます。

選択しようとしているコミットが、どのブランチにも属していない可能性があります。これは、リベースするときに発生する可能性があります。

このような場合、リモートリポジトリで:

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

次に、リポジトリで、もう一度フェッチします。そのコミットを含め、新しいブランチがフェッチされます。

于 2019-10-01T04:58:54.303 に答える
1

これは、SourceTreeでも簡単に実現できます。

  • マスターブランチをチェックアウトする
  • [ログ/履歴]タブを開きます
  • xyzコミットを見つけて右クリックします
  • 「マージ...」をクリックします

終わり :)

于 2017-01-03T09:24:24.067 に答える
1

私はチェリーピックしたいコミットでブランチに行くことでこの問題を解決しました。

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>
于 2020-03-03T15:16:02.087 に答える