Hal inti yang Anda inginkan di sini adalah git add -p
( -p
adalah sinonim untuk --patch
). Ini memberikan cara interaktif untuk memeriksa konten, memungkinkan Anda memutuskan apakah setiap bingkah harus masuk, dan bahkan membiarkan Anda mengedit tambalan secara manual jika perlu.
Untuk menggunakannya dalam kombinasi dengan cherry-pick:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(Terima kasih kepada Tim Henigan untuk mengingatkan saya bahwa git-cherry-pick memiliki opsi --no-commit, dan terima kasih kepada Felix Rabe karena menunjukkan bahwa Anda perlu mengatur ulang! Jika Anda hanya ingin meninggalkan beberapa hal dari komit , Anda dapat menggunakan git reset <path>...
untuk menghapus hanya file-file itu.)
Tentu saja Anda dapat memberikan jalur khusus add -p
jika perlu. Jika Anda memulai dengan tambalan, Anda bisa mengganti cherry-pick
dengan apply
.
Jika Anda benar-benar menginginkan git cherry-pick -p <commit>
(opsi itu tidak ada), Anda dapat menggunakannya
git checkout -p <commit>
Itu akan membedakan komit saat ini dengan komit yang Anda tentukan, dan memungkinkan Anda untuk menerapkan bakhil dari diff itu secara individual. Opsi ini mungkin lebih berguna jika komit yang Anda tarik memiliki konflik gabungan di bagian komit yang tidak Anda minati. (Namun, yang checkout
berbeda dari cherry-pick
: checkout
mencoba menerapkan <commit>
konten seluruhnya, cherry-pick
menerapkan perbedaan dari komit yang ditentukan dari orang tuanya. Ini berarti bahwa checkout
dapat menerapkan lebih dari sekedar komit itu, yang mungkin lebih dari yang Anda inginkan.)
cherry-pick -n
ternyata tidak membiarkan perubahan dipentaskan - konvensi pasti bahwa--no-commit
opsi berhenti tepat sebelum komit, yaitu dengan semua perubahan dipentaskan. Saya akan menambahkan reset ke dalam jawabannya.git checkout -p <F>
tidak tidak hanya membuat Anda mendapatkan perubahan dari F, itu akan Anda ABCDEF semua tumbuk bersama-sama dan memungkinkan Anda memilah apa bagian dari yang Anda inginkan . Mengupas bahwa hanya beberapa perubahan dari F adalah menyakitkan. Di sisi lain,git cherry-pick -n <F>
Anda hanya mendapatkan perubahan dari F - dan jika beberapa dari perubahan tersebut bertentangan, ini akan membantu Anda sehingga Anda dapat mengetahui cara menggabungkan dengan benar.git reset
akan menghapus dipentaskan file danadd -p
hanya akan mengatakan 'apa-apa untuk menambahkan'.Saya tahu saya menjawab pertanyaan lama, tetapi sepertinya ada cara baru untuk melakukan ini dengan memeriksa secara interaktif:
Kredit untuk Dapatkah saya secara interaktif memilih bakhil dari komit git lain?
sumber
Dengan asumsi perubahan yang Anda inginkan ada di kepala cabang tempat Anda menginginkan perubahan itu, gunakan git checkout
untuk satu file:
untuk banyak file hanya daisy chain:
sumber
Membangun Mike Monkiewicz jawaban Anda juga dapat menentukan satu atau lebih file untuk checkout dari sha1 / cabang yang disediakan.
Ini akan memungkinkan Anda untuk secara interaktif memilih perubahan yang ingin Anda terapkan ke versi file Anda saat ini.
sumber
Jika Anda ingin menentukan daftar file pada baris perintah, dan menyelesaikan semuanya dalam satu perintah atom, cobalah:
git apply --3way <(git show -- list-of-files)
--3way
: Jika tambalan tidak berlaku bersih, Git akan membuat konflik gabungan sehingga Anda bisa menjalankangit mergetool
. Menghilangkan--3way
akan membuat Git menyerah pada tambalan yang tidak berlaku bersih.sumber
Jika "memetik sebagian ceri" berarti "di dalam file, memilih beberapa perubahan tetapi membuang yang lain", itu dapat dilakukan dengan memasukkan
git stash
:git reset HEAD^
untuk mengubah seluruh komit yang dipetik cherry menjadi perubahan kerja yang tidak dipentaskan.git stash save --patch
: pilih bahan yang tidak diinginkan untuk disimpan secara interaktif.git commit
git stash drop
.Kiat: jika Anda memberikan simpanan perubahan yang tidak diinginkan nama:
git stash save --patch junk
maka jika Anda lupa melakukannya (6) sekarang, nanti Anda akan mengenali simpanan untuk apa itu.sumber
Gunakan
git format-patch
untuk memotong bagian dari komit yang Anda pedulikan dangit am
menerapkannya ke cabang lainsumber