Bagaimana cara memetik ceri dari cabang terpencil?

135

Saya mengalami kesulitan melakukan pick-ceri. Di mesin lokal saya, saya saat ini di cabang "master" saya. Saya ingin cherry-pick di komit dari cabang lain, bernama "zebra". Cabang "zebra" adalah cabang terpencil.

Jadi status git:

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

Oke, sekarang saya coba untuk memilih-komit yang saya inginkan:

git cherry-pick xyz
fatal: bad object xyz

di mana "xyz" adalah tanda tangan dari komit yang saya tertarik, yang terjadi pada cabang "zebra".

Jadi pertanyaan pertama yang jelas adalah, mengapa git tidak dapat menemukan komit yang saya referensikan? Saya tidak begitu mengerti bagaimana ini bekerja pada awalnya untuk jujur. Apakah git menyimpan sesuatu seperti basis data komit secara lokal di direktori kerja saya, untuk semua cabang lainnya? Ketika menjalankan perintah cherry-pick, apakah itu pergi dan mencari di database lokal untuk menemukan komit yang saya bicarakan?

Karena "zebra" adalah cabang jarak jauh, saya berpikir saya tidak memiliki datanya secara lokal. Jadi saya beralih cabang:

git checkout zebra
Switched to branch 'zebra'

Jadi sekarang di sini di mesin lokal saya, saya dapat melihat bahwa file-file dalam direktori mencerminkan keadaan zebra dengan benar. Saya beralih kembali ke master, mencoba memilih lagi (berharap data commit tersedia sekarang), tetapi saya mendapatkan masalah yang sama.

Saya memiliki kesalahpahaman mendasar tentang apa yang terjadi di sini, bantuan apa pun akan bagus.

pengguna291701
sumber
2
secara konseptual semuanya tampak benar. apakah Anda yakin Anda menggunakan hash (tanda tangan sebagaimana Anda menyebutnya) dengan benar dari komit? coba 'git show <hash>' untuk memverifikasi.
0xc0de
Hai, ya positif - kedua cabang saya ada di github, dan saya bisa menggunakannya untuk menemukan halaman komit dengan cara itu. Jika saya mengerti, keadaan mesin saya secara lokal adalah sedemikian sehingga git tidak dapat menemukan hash dari 'zebra' ketika dalam konteks 'master'. Apakah saya perlu mengatakannya bahwa 'zebra' juga ada secara lokal?
user291701
oh dan melakukan 'git show xyz' memberikan kesalahan yang sama "fatal: bad object". (dan saya mengganti xyz dengan hash yang benar).
user291701
Dan untuk memperjelas, saya dapat menggunakan hash 'xyz' saya untuk melihat komit di github tanpa masalah, seperti: " github.com/me/test/commit/xyz ".
user291701

Jawaban:

195

Karena "zebra" adalah cabang jarak jauh, saya berpikir saya tidak memiliki datanya secara lokal.

Anda benar bahwa Anda tidak memiliki data yang benar, tetapi mencoba menyelesaikannya dengan cara yang salah. Untuk mengumpulkan data secara lokal dari sumber jarak jauh, Anda perlu menggunakan git fetch. Ketika Anda melakukannya, git checkout zebraAnda beralih ke status cabang apa pun yang terakhir kali Anda ambil. Jadi, ambil dari remote terlebih dahulu:

# 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
Peter Lundgren
sumber
1
Tautan yang diarsipkan: archive.miek.nl/blog/archives/2011/12/13/…
brianpeiris
1
Mencoba pendekatan ini untuk memilih perbaikan hulu pada Github dan ternyata hash yang diperiksa berbeda dari yang ada di Github. Karena itu saya harus check out, ambil hash dan cherry-pick itu.
DustWolf
1
Sungguh hilang di sini opsi untuk lulus jarak jauh di cherry-pick seperti: git cherry-pick <remote> <hash>
Jared
bekerja dengan baik setelah mengambil cabang yang jauh. Terima kasih :)
Adeel
ya berhasil setelah menjemputku juga. Lebih lanjut tentang git cherry-pick tersedia di atlassian.com/git/tutorials/cherry-pick
Satheesh M
12

Sama seperti tambahan untuk jawaban yang diterima OP:

Jika Anda mengalami masalah dengan

fatal: bad object xxxxx

itu karena Anda tidak memiliki akses ke komit itu. Yang berarti Anda tidak memiliki repo yang disimpan secara lokal. Kemudian:

git remote add LABEL_FOR_THE_REPO REPO_YOU_WANT_THE_COMMIT_FROM
git fetch LABEL_FOR_THE_REPO
git cherry-pick xxxxxxx

Di mana xxxxxxx adalah hash komit yang Anda inginkan.

Cezar Augusto
sumber
hmm ketika saya sudah menambahkan repo tanpa flag upstream?
Gobliins
10

Menambahkan repo jarak jauh (sebagai "foo") dari mana kami ingin memilih-ceri

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

Ambil cabang mereka

$ git fetch foo

Daftarkan komit mereka (ini harus mencantumkan semua komit yang diambil foo)

$ git log foo/master

Cherry-pilih komit yang Anda butuhkan

$ git cherry-pick 97fedac
Muhammad Soliman
sumber
5

Setelah menggabungkan cabang pengembangan untuk dikuasai, saya biasanya menghapus cabang pengembangan. Namun, jika saya ingin memilih komit di cabang pengembangan, saya harus menggunakan hash gabungan komit untuk menghindari kesalahan "objek buruk".

Juuso Ohtonen
sumber
3

Perlu menarik kedua data cabang pada drive lokal Anda terlebih dahulu.

Apa yang terjadi adalah Anda mencoba untuk memilih-ceri dari cabang-a ke cabang-b, di mana Anda saat ini berada di cabang-b, tetapi salinan lokal cabang-a belum diperbarui (Anda perlu melakukan tarikan git pada kedua cabang terlebih dahulu).

langkah-langkah:
- git checkout branch-a
- git pull asal cabang-a
- git checkout branch-b
- git pull asal cabang-b
- git cherry-pick <hash>

output:
[branch-b <hash>] data log
Penulis: Penulis <Penulis
1 file berubah, 1 penyisipan (+), 3 penghapusan (-)

temyong
sumber
1

Saya memiliki kesalahan ini kembali setelah menggunakan id komit dari tab tarik permintaan, komit id. Komit itu kemudian tergencet dan bergabung. Dalam permintaan tarik github, cari teks ini: "gabungkan commit xxxxxxx menjadi ..." alih-alih mencoba menggunakan id komit dari tab commit.

Mary
sumber
1

Komit harus ada di lokal Anda, periksa dengan menggunakan git log .

Jika komit tidak ada maka coba git fetchperbarui lokal dengan remote terbaru.

Kuldeep Saxena
sumber
0

Ini juga dapat dengan mudah dicapai dengan SourceTree:

  • checkout cabang master Anda
  • buka tab "Log / Riwayat"
  • temukan komit xyz dan klik kanan di atasnya
  • klik pada "Gabung ..."

selesai :)

Giona
sumber
Ini salah. Karena sekarang Anda menggabungkan KEPALA master menjadi zebra, bukan hanya komit terpilih.
Chef Firaun
0

Jika Anda telah mengambil, namun ini masih terjadi, berikut ini mungkin menjadi alasan.

Bisa jadi komit yang Anda coba pilih, tidak lagi milik cabang mana pun. Ini mungkin terjadi ketika Anda rebase.

Dalam kasus seperti itu, di repo jarak jauh:

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

Kemudian di repo Anda, ambil lagi. Cabang baru akan diambil, termasuk komit itu.

lalalala
sumber
0

Saya memecahkan masalah ini dengan pergi ke cabang dengan komit saya ingin memilih ceri.

git checkout <branch With Commit To Cherry-Pick>

gunakan log untuk menemukan hash komit

git log

ketika Anda telah menemukan potongan hash dan tempel di buku catatan. jika menggunakan perintah cukup gulir ke atas untuk mendapatkan hash kemudian checkout cabang yang Anda inginkan untuk menempatkan komit.

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

akhirnya panggil cherry-pick dari git (note) -x adalah untuk menambahkan pesan cherry-pick ke aslinya. "Saat merekam komit, tambahkan baris yang mengatakan" (cherry pick from commit ...) "ke pesan komit asli untuk menunjukkan komit mana dari perubahan ini dipilih dari ceri."

git cherry-pick -x <your hash commit to add to the current branch>
RVscript
sumber