Saya memiliki repo1
dan repo2
di mesin lokal. Mereka sangat mirip, tetapi yang terakhir adalah semacam cabang lain ( repo1
tidak dipertahankan lagi).
/path/to/repo1 $ git log HEAD~5..HEAD~4
<some_sha> Add: Introduce feature X
Bagaimana menerapkan perubahan yang dilakukan oleh berkomitmen <some_sha>
dalam repo1
ke repo2
?
Apakah saya perlu menyiapkan beberapa tambalan, atau mungkinkah melakukan beberapa di cherry-pick
antara repo?
Bagaimana jika melakukan hal yang sama tetapi untuk berbagai komitmen?
Jawaban:
Sebagai retasan, Anda dapat mencoba mengubah resep untuk membandingkan komit di dua repositori berbeda di halaman GitTips , yaitu:
di mana
../repo
jalur ke repositori lain.Dengan Git modern Anda dapat menggunakan beberapa revisi dan rentang revisi dengan cherry-pick .
Ada di
$(git --git-dir=../repo/.git rev-parse --verify <commit>)
sini untuk menerjemahkan<commit>
(misalnyaHEAD
, atauv0.2
, ataumaster~2
, yang merupakan nilai dalam repositori kedua yang Anda salin) ke pengenal SHA-1 untuk komit. Jika Anda mengetahui SHA-1 dari perubahan yang ingin Anda pilih, itu tidak perlu.CATATAN Namun, Git dapat melewati penyalinan objek dari repositori sumber, karena Git tidak tahu bahwa repositori objek alternatif hanya bersifat sementara, untuk satu operasi. Anda mungkin perlu menyalin objek dari repositori kedua dengan:
Ini menempatkan objek-objek yang dipinjam dari repositori kedua di penyimpanan repositori asli
Tidak diuji.
Solusi yang tidak terlalu hacky adalah mengikuti jawaban knittl :
git format-patch
git am --3way
untuk menerapkan tambalansumber
fatal: unable to read tree ...
tetapi setelahgit reset HEAD^
semuanya berfungsi dengan baik<commit>
tetapirev-parse --verify
perintah tidak menyukainya karena hanya menerima nilai komit tunggal. Tetapi karenacherry-pick
menerima nilai komit tunggal dan rentang, saya bertanya: mengaparev-parse
diperlukan?git rev-parse
diperlukan jika Anda ingin merujuk ke komit dengan nama berbasis ref di repositori lain, misalnyamaster
,HEAD^^
atau sesuatu seperti itu; rev-parse mengubahnya menjadi pengenal SHA-1 universal.Anda mungkin ingin menggunakan
git format-patch
dan kemudiangit am
menerapkan tambalan itu ke repositori Anda.Atau, dalam satu baris:
sumber
GIT_ALTERNATE_OBJECT_DIRECTORIES
(yang akan merusak repositori saya).--ignore-whitespace
kegit am
perintah dapat menyelesaikan konflik apa pun dan menghindari keharusan melakukan penggabungan 3 arahAnda dapat melakukannya
cherry-pick
jika Anda menambahkan repo kedua sebagai remote ke yang pertama (dan kemudianfetch
).sumber
git fetch [remote-name]
di repo kedua dan kemudiangit cherry-pick [sha1]
.cherry-pick
. Jadi, meskipun mungkin terasa seperti cara yang "benar", cara ini tidak selalu paling praktis.Saya menulis skrip kecil untuk menerapkan keluaran diff repo diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0
sumber