リモートブランチからチェリーピックする方法は?


135

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

だからgitステータス:

# On branch master
nothing to commit (working directory clean)

OK、今私は欲しいコミットをチェリーピックしようとします:

git cherry-pick xyz
fatal: bad object xyz

ここで、「xyz」は、ブランチ「zebra」で発生した、私が関心を持っているコミットのシグネチャです。

最初の明白な質問は、なぜ私が参照しているコミットをgitが見つけられないのですか?正直なところ、そもそもこれがどのように機能しているかはよくわかりません。他のすべてのブランチのために、gitはコミットのデータベースのようなものを自分の作業ディレクトリにローカルに格納しますか?cherry-pickコマンドを実行すると、ローカルデータベースを検索して、私が話しているコミットを見つけますか?

「ゼブラ」はリモートブランチなので、ローカルにデータがないと思っていました。だから私はブランチを切り替えました:

git checkout zebra
Switched to branch 'zebra'

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

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


2
概念的にはすべてが正しいようです。あなたはコミットの正しいハッシュ(あなたが呼び出すときの署名)を使用していますか?確認するには、「git show <ハッシュ>」を試してください。
0xc0de

こんにちは、ポジティブです。私のブランチはどちらもgithub上にあります。私はそれらを使用して、コミットページをそのように見つけることができます。私が理解している場合、私のマシンのローカル状態は、gitが「マスター」のコンテキストで「ゼブラ」からのハッシュを見つけられないような状態です。「シマウマ」もローカルに存在することをどういうわけか伝える必要がありますか?
user291701

ああ、「git show xyz」を実行すると、同じエラー「致命的:不良オブジェクト」が発生します。(そして、私はxyzを正しいハッシュに置き換えています)。
user291701

明確にするために、「xyz」ハッシュを使用して、github上のコミットを問題なく確認できます。たとえば、「github.com/me/test/commit/xyz」のようにします。
user291701

回答:


195

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

あなたは正しいデータを持っていないのは正しいですが、間違った方法でそれを解決しようとしました。リモートソースからローカルにデータを収集するには、を使用する必要があります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
このアプローチを試して、Githubのアップストリーム修正を適切に選択すると、チェックアウトされたハッシュがGithubのものとは異なることが判明しました。したがって、私はチェックアウトしてハッシュを取得し、それをチェリーピックする必要がありました。
DustWolf

1
本当にここにチェリーピックでリモートを渡すオプションがありません:git cherry-pick <remote> <hash>
Jared

リモートブランチを取得した後、うまくいきました。ありがとう:)
Adeel

はい私のためにフェッチした後もうまくいきました。git cherry-pickの詳細はatlassian.com/git/tutorials/cherry-pick
Satheesh M

12

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


ええと、私はすでに上流のフラグなしでリポジトリを追加しましたか?
Gobliins 2017年

10

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

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

ブランチをフェッチする

$ git fetch foo

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

$ git log foo/master

必要なコミットをチェリーピックする

$ git cherry-pick 97fedac

5

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


3

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

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

手順:
-git checkout branch-a
-git pull origin branch-a
-git checkout branch-b
-git pull origin branch-b
-git cherry-pick <ハッシュ>

出力:
[branch-b <ハッシュ>]ログデータ
作成者:作成者<作成者
1ファイルが変更、1挿入(+)、3削除(-)


1

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


1

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

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


0

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

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

完了:)


これは誤りです。選択したコミットではなく、masterのHEADをzebraにマージしているからです。
シェフのファラオ

0

フェッチしてもまだこれが発生する場合は、次の理由が考えられます。

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

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

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

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


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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.