Bayangkan sejarah berikut ini:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
Bagaimana saya dapat menemukan ketika komit "c" telah digabungkan menjadi master (yaitu, temukan merger komit "h")?
Contoh Anda menunjukkan bahwa cabang feature
masih tersedia.
Dalam hal ini h
adalah hasil terakhir dari:
git log master ^feature --ancestry-path
Jika cabang feature
tidak tersedia lagi, Anda bisa menunjukkan komit gabungan di garis sejarah antara c
dan master
:
git log <SHA-1_for_c>..master --ancestry-path --merges
Namun ini juga akan menunjukkan semua gabungan yang terjadi setelah h
, dan di antara e
dan g
di feature
.
Membandingkan hasil dari perintah berikut:
git rev-list <SHA-1_for_c>..master --ancestry-path
git rev-list <SHA-1_for_c>..master --first-parent
akan memberi Anda SHA-1 h
sebagai baris terakhir yang sama.
Jika tersedia, Anda dapat menggunakan comm -1 -2
hasil ini. Jika Anda menggunakan msysgit, Anda dapat menggunakan kode perl berikut untuk membandingkan:
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
(kode perl dari http://www.cyberciti.biz/faq/command-to-display-lines-common-in-files/ , yang mengambilnya dari "seseorang di grup berita comp.unix.shell").
Lihat penggantian proses jika Anda ingin membuatnya satu-liner.
master
digabung menjadifeature
, maka segerafeature
digabung menjadimaster
sebagai fast-forward (ujungfeature
penggantimaster
). Apakah itu menyebabkan--first-parent
mengembalikan orangtua yang salah?comm -1 -2
tetapi tidak berhasil.comm
hanya berfungsi pada garis yang diurutkan. (Perl one-liner bekerja, meskipun saya tidak bisa membacanya.)git find-merge h master
(mengembalikan apa-apa selain harus mengembalikan h),git find-merge d master
(mengembalikan f tetapi harus mengembalikan d),git find-merge c feature
(mengembalikan e tetapi harus mengembalikan g).Tambahkan ini ke Anda
~/.gitconfig
:Maka Anda dapat menggunakan alias seperti ini:
Untuk melihat pesan komit gabungan dan detail lainnya, gunakan
git show-merge
dengan argumen yang sama.(Berdasarkan jawaban Gauthier . Terima kasih kepada Rosen Matev dan javabrett karena telah memperbaiki masalah
sort
.)sumber
sort -k2 | uniq -f1 -d | sort -n | tail -1 | cut -f2
tidak menemukan baris terakhir yang benar secara umum. Berikut ini contoh gagal.16db9fef5c581ab0c56137d04ef08ef1bf82b0b7
sini ketika saya menjalankannya pada pasta Anda, apakah itu tidak diharapkan? OS apa yang Anda pakai?29c40c3a3b33196d4e79793bd8e503a03753bad1
git-get-merge akan menemukan dan menunjukkan komit gabungan yang Anda cari:
Perintah mengikuti anak-anak dari komit yang diberikan sampai penggabungan ke cabang lain (mungkin master) ditemukan.
sumber
Artinya, untuk meringkas posting Gauthier:
EDIT: karena ini menggunakan proses substitusi "
<()
", itu tidak kompatibel dengan POSIX, dan mungkin tidak berfungsi dengan shell Anda. Ini bekerja denganbash
atauzsh
meskipun.sumber
<()
tidak kompatibel dengan POSIX. Anda perlu menggunakanbash
,zsh
atau substitusi proses pendukung shell . Saya mengedit jawaban saya sesuai dengan itu.Saya perlu melakukan ini, dan entah bagaimana menemukan
git-when-merged
(yang sebenarnya merujuk pertanyaan SO ini, tetapi Michael Haggerty tidak pernah menambahkan referensi ke skrip Python yang sangat bagus di sini). Jadi sekarang saya punya.sumber
Membangun berdasarkan jawaban hebat Gauthier, kita tidak perlu menggunakan
comm
untuk membandingkan daftar. Karena kami sedang mencari hasil terakhir--ancestry-path
yang juga ada--first-parent
, kami dapat dengan mudah menerima yang terakhir di keluaran yang pertama:Atau untuk sesuatu yang tajam dan dapat digunakan kembali, inilah fungsi untuk muncul
.bashrc
:sumber
comm
tidak berfungsi saat input tidak diurutkan.Untuk kerumunan Ruby, ada git-mana . Sangat mudah.
sumber
Saya menggunakan skrip bash di bawah ini yang saya tempatkan di jalur
~/bin/git-find-merge
. Ini didasarkan pada jawaban Gauthier dan jawaban evilstreak dengan beberapa penyesuaian untuk menangani kasus sudut.comm
melempar ketika input tidak diurutkan.grep -f
bekerja dengan sempurna.Kasus sudut:
~/bin/git-find-merge
naskah:Yang memungkinkan saya melakukan ini:
Skrip ini juga tersedia di github saya .
sumber
Kemudian cari gabungan pertama sebelum komit.
sumber
Versi ruby saya dari ide @ robinst, bekerja dua kali lebih cepat (yang penting ketika mencari komit yang sangat lama).
find-commit.rb
Anda bisa menggunakannya seperti ini:
sumber
Anda dapat mencoba sesuatu seperti ini. Idenya adalah untuk beralih melalui semua gabungan komit dan melihat apakah komit "c" dapat dicapai dari salah satu dari mereka:
sumber
git rev-list <SHA-1_for_c>..master --ancestry-path --merges
Saya harus melakukan ini beberapa kali (terima kasih kepada semua orang yang menjawab pertanyaan ini!), Dan akhirnya menulis skrip (menggunakan metode Gauthier) yang dapat saya tambahkan ke koleksi kecil utilitas git saya. Anda dapat menemukannya di sini: https://github.com/mwoehlke/git-utils/blob/master/bin/git-merge-point .
sumber