Saya punya dua cabang devel
dan next
. Dalam perkembangan saya memiliki jumlah komitmen yang sedikit banyak. Beberapa dari komit dipilih next
. Saya juga menambahkan beberapa komit ke berikutnya yang digabung ke devel
.
Sekarang saya ingin melihat apa yang hilang next
, jadi saya bisa menguji perubahan secara detail sebelum membawanya next
. Pertanyaan saya sekarang, bagaimana saya bisa melihat komit yang masuk devel
tetapi tidak di berikutnya?
Jawaban:
Perintah yang jarang digunakan
git cherry
menunjukkan kepada Anda komit yang belum dipilih secara ceri. Dokumentasi untukgit cherry
ada di sini , tetapi, singkatnya, Anda hanya dapat melakukan:... dan lihat outputnya sedikit seperti ini:
Komit yang dimulai dengan
+
akan menjadi komitmen yang belum Anda pilihnext
. Dalam hal ini, sejauh ini saya hanya memilih satu koma. Anda mungkin ingin menambahkan-v
parameter kegit cherry
perintah, sehingga juga menampilkan baris subjek dari setiap komit.sumber
git checkout devel
, Anda bisa melakukannyagit cherry next devel
.-v
" ? Cherry tanpa a-v
sepertils
tanpa-la
. ; -Jcherry
untuk menandai atau mengecualikan komitmen yang setara, bukan?cherry
sepertinya perintah plumbing, tetapi tidak (tampaknya) menawarkan banyak opsi. Untuk apa saya saat ini di tengah-tengah,git cherry
memberi saya positif palsu, tetapi @ sehegit log --cherry-pick
dengan benar mengecualikan komitmen yang sebelumnya diambil / diubah.Anda juga bisa menggunakannya
untuk mendapatkan daftar bagus dari berbagai komitmen aktual yang tidak dibagikan di antara cabang-cabang.
Kata operasinya adalah
--cherry-pick
Perbarui Seperti disebutkan dalam komentar, git versi terbaru ditambahkan
--cherry-mark
:sumber
Anda mungkin dapat mencoba melakukan subset git log:
sumber
--left-only
akan lebih baik). Namun, yang ini dapat sedikit ditingkatkan dengan menambahkan--no-merges
untuk menghilangkan komit gabungan (misalnya jika fitur atau cabang perbaikan terbaru digabungkan (secara terpisah) menjadi devel dan berikutnya). Sebenarnya, resolusi konflik dalam penggabungan dapat menciptakan perbedaan lain, tetapi biasanya tidak demikian. The--no-merges
pilihan dapat berguna diterapkan pada jawaban lain juga.Bagaimana tentang
Hasilnya mirip dengan jawaban Byran (urutan komit berbeda) tetapi kedua jawaban kami akan menghasilkan komit yang berbeda di antara cabang-cabang, alih-alih hanya menunjukkan apa yang ada di satu cabang dan tidak di yang lain.
sumber
git log next..
Untuk mendapatkan daftar komit yang tidak terintegrasi ke dalam cabang rilis (selanjutnya) Anda dapat menggunakan:
Periksa git-rev-list untuk info lebih lanjut.
sumber
next...devel
@Mark Longair memakukannya dalam jawabannya di sini , tapi saya ingin menambahkan beberapa wawasan tambahan.
Terkait, dan menjawab pertanyaan tentang cara memecah Permintaan Tarik (PR) besar, terutama ketika menekan komitmen Anda tidak praktis karena satu atau lebih gabungan master ke dalam feature_branch Anda
Situasi saya:
Saya membuat besar
feature_branch
dengan 30 komitmen dan membuka Permintaan Tarik (PR) pada GitHub untuk menggabungkannyamaster
. Branchmaster
mengganti satu ton di bawahku, dan menerima 200 komit yangfeature_branch
tidak kumiliki. Untuk menyelesaikan konflik yang saya lakukangit checkout feature_branch
dangit merge master
untuk menggabungkanmaster
perubahan ke dalam sayafeature_branch
. Saya memilih untukmerge
daripadarebase
menjadi master terbaru sehingga saya harus menyelesaikan konflik hanya satu kali daripada berpotensi 30 kali (satu kali untuk setiap komitmen saya). Saya tidak ingin memeras 30 komit saya menjadi 1 terlebih dahulu dan kemudian kembali ke yang terbarumaster
karena itu mungkin menghapus riwayat komentar ulasan GitHub dalam PR. Jadi, saya menggabungkan master ke cabang fitur saya dan menyelesaikan konflik 1 kali. Semuanya baik-baik saja. Namun PR saya terlalu besar untuk ditinjau oleh kolega saya. Saya perlu membaginya. Saya pergi untuk menekan 30 komit saya dan OH TIDAK! DIMANA MEREKA? MEREKA SEMUA YANG TERCANTUM DENGANmaster
200 komitmen baru-baru ini sekarang karena saya bergabungmaster
dengan sayafeature_branch
! APA YANG SAYA LAKUKAN?git cherry
penggunaan jika Anda ingin mencobagit cherry-pick
komitmen individu:git cherry
untuk menyelamatkan (semacam)!Untuk melihat semua komitmen yang ada
feature_branch
tetapi TIDAK dalam,master
saya dapat melakukannya:ATAU, saya dapat memeriksa komit dari cabang APA PUN dengan TIDAK MEMASTIKAN saya sedang
feature_branch
melakukangit cherry [upstream_branch] [feature_branch]
, seperti ini. Sekali lagi, ini memeriksa untuk melihat yang melakukan adalahfeature_branch
tetapi tidak dalamupstream_branch
(master
dalam hal ini):Menambahkan
-v
juga menunjukkan baris subjek pesan komit:Memipis ke "jumlah kata" "-line" (
wc -l
) menghitung berapa banyak komit yang ada:Anda dapat membandingkan jumlah ini dengan angka komit yang diperlihatkan dalam GithHub PR Anda agar merasa lebih baik karena mengetahui bahwa itu
git cherry
benar - benar berfungsi. Anda juga dapat membandingkan hash git satu per satu dan melihatnya cocok di antaragit cherry
dan GitHub. Perhatikan bahwagit cherry
TIDAK akan menghitung setiap komit merge di mana Anda bergabungmaster
ke dalamfeature_branch
, tapi GitHub WILL. Jadi, jika Anda melihat perbedaan kecil dalam hitungan, cari halaman komit PR GitHub untuk kata "gabung" dan Anda mungkin akan melihat bahwa itulah penyebabnyagit cherry
. Mis: komit berjudul "Gabungkan 'master' cabang ke feature_branch" akan muncul di PR GitHub tetapi tidak ketika Anda menjalankangit cherry master feature_branch
. Ini baik dan diharapkan.Jadi, sekarang saya memiliki cara untuk mengetahui perbedaan mana yang mungkin ingin saya ceri-pilih ke cabang fitur baru untuk memisahkan perbedaan ini: Saya dapat menggunakan
git cherry master feature_branch
secara lokal, atau melihat komitmen di GitHub PR.Bagaimana squashing bisa membantu - andai saja kita bisa terjepit:
Sebuah alternatif, bagaimanapun, untuk memisahkan diff saya yang besar adalah dengan memecah semua 30 komit saya menjadi satu, menambal yang ke cabang fitur baru, soft reset patch komit, kemudian gunakan
git gui
untuk menambahkan potongan file dengan file, potongan demi potongan, atau baris demi baris. Setelah saya mendapatkan satu sub-fitur, saya dapat melakukan apa yang saya tambahkan kemudian memeriksa cabang baru, menambahkan lebih banyak, melakukan, memeriksa cabang baru, dll, sampai saya memiliki fitur besar saya dibagi menjadi beberapa sub-fitur . Masalahnya adalah bahwa 30 komit saya berbaur dengan 200 komit lain dari orang lain karena sayagit merge master
masuk ke dalam sayafeature_branch
, jadi rebasing karenanya tidak praktis, karena saya harus menyaring 230 komit untuk memesan ulang dan menghancurkan 30 komit saya.Cara menggunakan file tambalan sebagai pengganti yang lebih mudah untuk terjepit:
Cara mengatasinya adalah dengan hanya mendapatkan file tambalan yang berisi "squash-equivalen" dari semua 30 komit saya, menambalnya ke garpu baru
master
(cabang-sub-fitur baru), dan bekerja dari sana, sebagai berikut:Sekarang saya memiliki 30-komit patch saya semua diterapkan secara lokal, tetapi tidak dipentaskan dan tidak berkomitmen.
Sekarang gunakan
git gui
untuk menambahkan file, potongan, dan / atau baris dan putus PR besar Anda atau "diff":Perhatikan bahwa jika Anda tidak memilikinya
git gui
, Anda dapat menginstalnya dengan mudah di Ubuntusudo apt install git-gui
.Sekarang saya dapat menjalankan
git gui
dan mulai menambahkan file, potongan, dan / atau baris (dengan mengklik kanan pada program GUI Git), dan memecah 30 cabang fitur komit ke dalam sub cabang seperti dijelaskan di atas, berulang kali menambahkan, melakukan, lalu forking cabang fitur baru dan ulangi siklus ini sampai semua perubahan telah ditambahkan ke cabang-sub-fitur dan fitur 30-commit saya berhasil dipecah menjadi 3 atau 4 sub-fitur. Saya dapat membuka PR terpisah untuk masing-masing sub-fitur ini sekarang, dan mereka akan lebih mudah untuk ditinjau oleh tim saya.Referensi:
sumber