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.
Jawaban:
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 zebra
Anda beralih ke status cabang apa pun yang terakhir kali Anda ambil. Jadi, ambil dari remote terlebih dahulu:sumber
Sama seperti tambahan untuk jawaban yang diterima OP:
Jika Anda mengalami masalah dengan
itu karena Anda tidak memiliki akses ke komit itu. Yang berarti Anda tidak memiliki repo yang disimpan secara lokal. Kemudian:
Di mana xxxxxxx adalah hash komit yang Anda inginkan.
sumber
Menambahkan repo jarak jauh (sebagai "foo") dari mana kami ingin memilih-ceri
Ambil cabang mereka
Daftarkan komit mereka (ini harus mencantumkan semua komit yang diambil
foo
)Cherry-pilih komit yang Anda butuhkan
sumber
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".
sumber
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 (-)
sumber
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.
sumber
Komit harus ada di lokal Anda, periksa dengan menggunakan
git log
.Jika komit tidak ada maka coba
git fetch
perbarui lokal dengan remote terbaru.sumber
Ini juga dapat dengan mudah dicapai dengan SourceTree:
selesai :)
sumber
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:
git checkout xxxxx
git checkout -b temp-branch
Kemudian di repo Anda, ambil lagi. Cabang baru akan diambil, termasuk komit itu.
sumber
Saya memecahkan masalah ini dengan pergi ke cabang dengan komit saya ingin memilih ceri.
gunakan log untuk menemukan hash komit
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.
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."
sumber