Saya punya dua cabang. Komit a
adalah kepala satu, sementara yang lain memiliki b
, c
, d
, e
dan f
di atas a
. Saya ingin pindah c
, d
, e
dan f
untuk cabang pertama tanpa komit b
. Mudah menggunakan cherry pick: checkout cabang pertama cherry-pick satu per satu c
ke f
dan rebase cabang kedua menjadi yang pertama. Tapi apakah ada cara untuk memilih semua c
- f
dalam satu perintah?
Berikut ini adalah deskripsi visual dari skenario (terima kasih JJD ):
git
git-rebase
cherry-pick
cekcok
sumber
sumber
b
f
Jawaban:
Git 1.7.2 memperkenalkan kemampuan untuk memilih berbagai komitmen. Dari catatan rilis :
Untuk memilih semua komitmen dari komit
A
ke komitB
(di manaA
lebih tua dariB
), jalankan:Jika Anda ingin mengabaikan A itu sendiri, jalankan:
(Kredit jatuh ke damian, JB Rainsberger dan sschaef di komentar)
sumber
git cherry-pick A^..B
git cherry-pick f~3
lalugit cherry-pick f~2
dll. Hinggagit cherry-pick f
(menekan panah ke atas mendapatkan perintah sebelumnya sehingga saya dapat dengan cepat mengubah nomor dan menjalankan itu, harus serupa di sebagian besar konsol).git cherry-pick master..somebranch
akan memilih semua commit di somebranch sejak master (dengan asumsi sudah diubah ke master), dan menerapkannya ke cabang Anda saat ini.Cara paling sederhana untuk melakukan ini adalah dengan
onto
opsi untukrebase
. Misalkan cabang yang selesai sekaranga
disebut mybranch dan ini adalah cabang yang ingin Anda pindahkanc
-f
ke.sumber
git checkout secondbranch && git rebase mybranch
jawaban lengkapnyarebase
mode interaktif. Terima kasih, @ Charles!--interactive
untuk menghapus beberapa commit dari urutan atau menyusun ulang sebelum "cherry pick". +1b
dalam contoh ini) tapi ya ini berhasil bagi saya.Atau satu baris yang diminta:
sumber
Anda dapat menggunakan kombinasi serial
git rebase
dangit branch
untuk menerapkan sekelompok commit ke cabang lain. Seperti yang sudah diposting oleh wolfc , perintah pertama sebenarnya menyalin komit. Namun, perubahan tidak terlihat sampai Anda menambahkan nama cabang ke komit paling atas grup.Silakan buka gambar di tab baru ...
Untuk meringkas perintah dalam bentuk teks:
gitk --all &
.git rebase --onto a b f
.HEAD
yang ditandai.git branch selection
Ini harus menjelaskan hal-hal:
a
adalah tujuan utama baru grup.b
adalah komit sebelum komit pertama grup (eksklusif).f
adalah komitmen terakhir dari grup (inklusif).Setelah itu, Anda bisa menggunakan
git checkout feature && git reset --hard b
untuk menghapus komitc
sampaif
darifeature
cabang.Selain jawaban ini, saya menulis posting blog yang menggambarkan perintah dalam skenario lain yang seharusnya membantu untuk menggunakannya secara umum.
sumber
git rebase --onto a b mybranch
dan btw - program mana yang menampilkan gambar git yang bagus itu?Untuk menerapkan komentar JB Rainsberger dan sschaef untuk secara spesifik menjawab pertanyaan ... Untuk menggunakan rentang pick-ceri pada contoh ini:
atau
sumber
git 2.7.0.windows.1
dan memperhatikan bahwa ketika saya mencoba untuk melakukan berbagai tindakan, semuanya baik-baik saja tetapi git tidak memberi tahu Anda di mana pun yang harus Anda lakukangit cherry-pick --continue | --abort | --quit
sebelum Anda mencoba untuk melakukan / memilih lagi. Jadi, jika Anda memilih berbagai komitmen, Anda harus menjalankangit cherry-pick --continue
setiap kali Anda siap (menyelesaikan konflik atau semacamnya) dengan komit dari kisaran yang diberikan.^
setelah c sebenarnya berarti "komit sebelum c" yang merupakan b dalam kasus ini. Inilah sebabnya mengapac^..f
identik denganb..f
. Coba lakukangit log c^..f
dan Anda akan melihat komit c hingga f, persis sama seperti jika Anda melakukannyagit log b..f
Jika Anda memiliki revisi selektif untuk bergabung, katakan A, C, F, J dari A, B, C, D, E, F, G, H, I, J berkomitmen, cukup gunakan perintah di bawah ini:
sumber
sumber
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
Untuk memilih cherry dari id komit sampai ke ujung cabang, Anda dapat menggunakan:
git cherry-pick commit_id^..branch_name
sumber
Varian lain yang layak disebutkan adalah bahwa jika Anda ingin
n
komit terakhir dari cabang,~
sintaksnya dapat berguna:Dalam kasus ini, perintah di atas akan memilih 4 commit terakhir dari cabang bernama
some-branch
(meskipun Anda juga bisa menggunakan hash komit sebagai pengganti nama cabang)sumber
Sebenarnya, cara paling sederhana untuk melakukannya adalah dengan:
MERGE_BASE=$(git merge-base branch-a branch-b)
rebase cabang yang dihasilkan ke dirinya sendiri, mulai dari pangkalan gabungan dari langkah 1, dan secara manual menghapus komit yang tidak diinginkan:
Atau, jika hanya ada beberapa komit baru, lewati langkah 1, dan gunakan saja
pada langkah pertama, cukup gunakan
^
untuk melewati merge-base.Anda akan melihat sesuatu seperti ini di rebase interaktif:
Kemudian hapus baris b (dan lainnya yang Anda inginkan)
sumber
sumber
Berikut ini adalah skrip yang akan memungkinkan Anda untuk memilih-ceri beberapa komit secara berturut-turut hanya dengan memberi tahu skrip sumber dan cabang target untuk ceri pilihan dan jumlah komit:
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
Untuk memilih-ceri dari cabang Anda untuk dikuasai (gunakan cabang saat ini sebagai sumber):
Untuk memilih 5 komitmen terbaru dari cabang 6.19.x Anda untuk dikuasai:
sumber