Saya bekerja dengan repositori git yang membutuhkan komit dari repositori git lain yang tidak tahu apa-apa tentang yang pertama.
Biasanya saya akan menggunakan sakura HEAD@{x}
di reflog, tetapi karena ini .git
tidak tahu apa-apa tentang entri reflog ini (direktori fisik yang berbeda), bagaimana saya bisa memilih sakura ini, atau bisakah saya?
Saya menggunakan git-svn
. Cabang pertama saya adalah menggunakan git-svn
satu trunk
dari repo Subversion, dan cabang berikutnya adalah menggunakan git-svn
pada cabang Subversion.
git
cherry-pick
gitcoder182
sumber
sumber
Jawaban:
Anda harus menambahkan repositori lain sebagai remote, lalu mengambil perubahannya. Dari sana Anda melihat komit dan Anda dapat mengambilnya.
Seperti itu:
Sekarang Anda memiliki semua informasi untuk dilakukan
git cherry-pick
.Info lebih lanjut tentang bekerja dengan remote di sini: https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes
sumber
--stdlayout
opsi git-svn jika Anda menggunakan tata letak trunk / branch / tag standar di Subversion. Maka cabang Subversion akan menjadi cabang git jarak jauh belaka.git am < d821j8djd2dj812.patch
. Di luar GH, konsep serupa dapat dilakukan sebagaimana dirujuk dalam jawaban alternatif di bawah ini.Jawabannya, seperti yang diberikan, adalah menggunakan format-patch tetapi karena pertanyaannya adalah bagaimana cara memilih dari folder lain, berikut adalah bagian dari kode untuk melakukan hal itu:
sumber
git format-patch
perintah tersebut membuat tambalan darisome_other_repo
komit yang ditentukan oleh SHA-nya (-1
untuk satu komit saja). Tambalan ini disalurkan kegit am
, yang menerapkan tambalan secara lokal (-3
berarti mencoba penggabungan tiga arah jika tambalan gagal diterapkan secara bersih). Harapan itu menjelaskan.--ignore-whitespace
. Perintah penuh:git --git-dir=../<some_other_repo>/.git format-patch -k -1 --stdout <commit SHA> | git am -3 -k --ignore-whitespace
Berikut adalah contoh dari remote-fetch-merge.
Maka kamu bisa:
atau Anda bahkan bisa menggabungkan seluruh cabang
sumber
git merge projectB/master
sangat, sangat salah , karena Anda tidak menerapkan perubahan dari satu komit (seperti cherry-pick akan), Anda benar-benar penggabungan dalam semua perubahan diprojectB/master
yang tidak terkandung dalam Anda sendirimaster
cabang.git remote rm projectB
. Juga gunakangit tag -d tag-name
untuk menghapus semua tag yang diambil dari repo jarak jauh. Komit jarak jauh tidak akan lagi ditampilkan dalam riwayat Anda, dan pemangkasan akan menghapusnya dari penyimpanan pada akhirnya.Anda dapat melakukannya, tetapi membutuhkan dua langkah. Begini caranya:
Ganti
<remote-git-url>
dengan url atau path ke repositori tempat Anda ingin memilih ceri.Ganti
<branch>
dengan cabang atau nama tag yang ingin Anda pilih dari repositori jarak jauh.Anda dapat mengganti
FETCH_HEAD
dengan SHA git dari cabang.Diperbarui: dimodifikasi berdasarkan umpan balik @ pkalinow.
sumber
git fetch <repo-url> <branch> && git cherry-pick <sha>
.Berikut adalah langkah-langkah untuk menambahkan remote, mengambil cabang, dan memilih ceri komit
Sumber: https://coderwall.com/p/sgpksw
sumber
Lihat Cara membuat dan menerapkan tambalan dengan Git . (Dari kata-kata pertanyaan Anda, saya berasumsi bahwa repositori lain ini adalah untuk basis kode yang sama sekali berbeda. Jika repositori untuk basis kode yang sama, Anda harus menambahkannya sebagai remote seperti yang disarankan oleh @CharlesB. Bahkan jika itu untuk yang lain basis kode, saya kira Anda masih bisa menambahkannya sebagai remote, tetapi Anda mungkin tidak ingin memasukkan seluruh cabang ke dalam repositori Anda ...)
sumber
Anda dapat melakukannya dalam satu baris sebagai berikut. Harap Anda berada di repositori git yang membutuhkan perubahan yang dipilih cherry dan Anda telah memeriksa untuk memperbaiki cabang.
git fetch [URL cabang] [Cabang untuk dipilih dari] && git pilih-ceri [komit ID]
sumber
ssh://
bagian, hanya untukhttps://
Iya. Ambil repositori, lalu pilih ceri dari cabang jarak jauh.
sumber
Dengan asumsi
A
adalah repo Anda ingin ceri-memilih dari, danB
adalah salah satu yang ingin ceri-memilih, Anda dapat melakukan ini dengan menambahkan</path/to/repo/A/>/.git/objects
ke</path/to/repo/B>/.git/objects/info/alternates
. Buatalternates
file ini jika tidak ada.Ini akan membuat repo B mengakses semua objek git dari repo A, dan akan membuat cherry-pick berfungsi untuk Anda.
sumber
Situasi saya adalah saya memiliki repo telanjang yang didorong oleh tim, dan klon yang duduk tepat di sebelahnya. Kumpulan baris dalam Makefile ini berfungsi dengan baik untuk saya:
Dengan memperbarui master repo telanjang, kami dapat memilih perubahan yang diusulkan dipublikasikan ke repo telanjang. Kami juga memiliki cara (yang lebih rumit) untuk memilih banyak kesalahan untuk tinjauan dan pengujian konsolidasi.
Jika "tidak tahu apa-apa" berarti "tidak dapat digunakan sebagai remote", maka ini tidak membantu, tetapi pertanyaan SO ini muncul ketika saya mencari-cari alur kerja ini sehingga saya pikir saya akan berkontribusi kembali.
sumber
Jika Anda ingin memilih banyak komit untuk file yang diberikan sampai Anda mencapai komit yang diberikan, maka gunakan yang berikut ini.
sumber