Saya telah membaca beberapa artikel yang mengatakan itu git bisect
luar biasa. Namun, saya bukan penutur asli dan saya tidak bisa mengerti mengapa itu luar biasa.
Bisakah seseorang mendemonstrasikan dengan beberapa contoh kode:
- Bagaimana cara menggunakannya?
- Apakah itu seperti
svn blame
?
git
git-bisect
IAdapter
sumber
sumber
Jawaban:
Gagasan di belakang
git bisect
adalah melakukan pencarian biner dalam sejarah untuk menemukan regresi tertentu. Bayangkan Anda memiliki riwayat pengembangan berikut:Anda tahu bahwa program Anda tidak berfungsi dengan baik di
current
revisi, dan itu berfungsi di revisi0
. Jadi regresi tersebut kemungkinan diperkenalkan di salah satu komit1
,2
,3
,4
,5
,current
.Anda dapat mencoba memeriksa setiap komit, membangunnya, memeriksa apakah regresi ada atau tidak. Jika ada banyak komitmen, ini bisa memakan waktu lama. Ini adalah pencarian linear. Kita dapat melakukan yang lebih baik dengan melakukan pencarian biner. Inilah yang dilakukan
git bisect
perintah. Pada setiap langkah itu mencoba untuk mengurangi jumlah revisi yang berpotensi buruk hingga setengahnya.Anda akan menggunakan perintah seperti ini:
Setelah perintah ini,
git
akan checkout komit. Dalam kasus kami, itu akan dikomit3
. Anda perlu membangun program Anda, dan memeriksa apakah regresi ada atau tidak. Anda juga harus memberi tahugit
status revisi ini dengan baikgit bisect bad
jika ada regresi, ataugit bisect good
jika tidak.Misalkan regresi diperkenalkan dalam komit
4
. Maka regresi tidak ada dalam revisi ini, dan kami kirim kegit
.Kemudian akan checkout komit lain. Salah satu
4
atau5
(karena hanya ada dua komitmen). Anggap saja itu diambil5
. Setelah membangun kami menguji program dan melihat bahwa ada regresi. Kami kemudian kirim kegit
:Kami menguji revisi terakhir
4
,. Dan karena itu yang memperkenalkan regresi, kami kirim kegit
:Dalam situasi sederhana ini, kita hanya harus uji 3 versi (
3
,4
,5
) bukan 4 (1
,2
,3
,4
). Ini adalah kemenangan kecil, tetapi ini karena sejarah kita sangat kecil. Jika rentang pencarian komit N, kita harus menguji 1 + log2 N komit dengangit bisect
bukannya N / 2 komit dengan pencarian linier.Setelah Anda menemukan komit yang memperkenalkan regresi, Anda dapat mempelajarinya untuk menemukan masalah. Setelah ini selesai, Anda gunakan
git bisect reset
untuk mengembalikan semuanya ke kondisi semula sebelum menggunakangit bisect
perintah.sumber
git bisect bad <rev> [<rev>...]
untuk menandai revisi tertentu sebagai buruk (atau bagus dengangit bisect good <rev> [<rev>...]
).rev
dapat berupa pengidentifikasi revisi apa pun seperti nama cabang, tag, hash komit (atau awalan unik hash komit), ...git bisect reset
untuk mengembalikan semuanya pada komit terbarugit bisect run
membagi dua otomatisJika Anda memiliki
./test
skrip otomatis yang memiliki status keluar 0 jika pengujian OK, Anda dapat secara otomatis menemukan bug denganbisect run
:Tentu saja ini mengandaikan bahwa jika script tes
./test
dilacak git, bahwa itu tidak hilang pada beberapa komit sebelumnya selama pembagian dua.Saya telah menemukan bahwa sangat sering Anda bisa lolos hanya dengan menyalin skrip in-tree keluar dari pohon, dan mungkin bermain dengan
PATH
variabel-like, dan menjalankannya dari sana.Tentu saja, jika infrastruktur pengujian
test
bergantung pada komit yang lebih lama, maka tidak ada solusi, dan Anda harus melakukan hal-hal secara manual, memutuskan bagaimana menguji komit satu per satu.Namun saya telah menemukan bahwa menggunakan otomasi ini sering berhasil, dan dapat menjadi penghemat waktu yang sangat besar untuk tes yang lebih lambat di tumpukan tugas Anda, di mana Anda dapat membiarkannya berjalan dalam semalam, dan mungkin bug Anda diidentifikasi pada pagi berikutnya, ada baiknya mencoba.
Lebih banyak tips
Tetap pada komit pertama yang gagal setelah membagi dua alih-alih kembali ke
master
:start
+ awalbad
dangood
sekali jalan:sama dengan:
Lihat apa yang telah diuji sejauh ini (secara manual
good
danbad
ataurun
):Output sampel:
Tunjukkan referensi yang baik dan buruk pada log git untuk mendapatkan gagasan waktu yang lebih baik:
Ini hanya menunjukkan komit dengan referensi yang sesuai, yang mengurangi kebisingan kebisingan, tetapi tidak menyertakan ref tipe autogenerated:
yang memberi tahu kami mana yang ditandai sebagai baik atau buruk.
Pertimbangkan repo tes ini jika Anda ingin bermain-main dengan perintah.
Kegagalan cepat, kesuksesan lambat
Terkadang:
Untuk kasus-kasus tersebut, misalkan anggap kegagalan selalu terjadi dalam 5 detik, dan jika kita malas membuat tes lebih spesifik seperti yang seharusnya, kita dapat menggunakan
timeout
seperti pada:Ini berfungsi sejak
timeout
keluar124
sementara kegagalantest-command
keluar1
.Status keluar ajaib
git bisect run
agak pilih-pilih tentang status keluar:apa pun di atas 127 membuat pembelahan dua gagal dengan sesuatu seperti:
Secara khusus, huruf C
assert(0)
mengarah ke aSIGABRT
dan keluar dengan status 134, sangat menjengkelkan.125 ajaib dan membuat lari dilewati
git bisect skip
.Maksud dari ini adalah untuk membantu melewati bangunan yang rusak karena alasan yang tidak terkait.
Lihat
man git-bisect
detailnya.Jadi, Anda mungkin ingin menggunakan sesuatu seperti:
Diuji pada git 2.16.1.
sumber
test_script
test suite modular + yang dibuat dengan baik , dan jalankan dari file terpisah saat membagi dua. Saat Anda memperbaikinya, gabungkan tes ke dalam test suite utama.bisect run
sangat berguna ketika ujian membutuhkan waktu lama untuk menyelesaikannya, dan saya cukup yakin bahwa sistem pengujian tidak akan rusak. Dengan cara ini, saya bisa membiarkannya berjalan di latar belakang, atau bermalam jika menghabiskan terlalu banyak sumber daya, tanpa kehilangan waktu pergantian konteks otak.TL; DR
Mulailah:
Bisecting: X revisions left to test after this (roughly Y steps)
Ulang:
Masih ada masalah?
$ git bisect bad
$ git bisect good
Hasil:
Ketika selesai:
sumber
git bisect good
untuk pindah ke komit berikutnya.Hanya untuk menambahkan poin lebih lanjut:
Kita dapat menentukan nama file atau jalur untuk
git bisect start
berjaga-jaga jika kita tahu bahwa bug tersebut berasal dari file tertentu. Sebagai contoh, Misalkan kita tahu bahwa perubahan yang menyebabkan regresi berada di direktori com / workingDir maka kita dapat menjalankangit bisect start com/workingDir
Ini berarti bahwa hanya komit yang mengubah isi direktori ini yang akan diperiksa, dan ini membuat segalanya menjadi lebih cepat.Juga, Jika sulit untuk mengetahui apakah komit tertentu baik atau buruk, Anda dapat menjalankan
git bisect skip
, yang akan mengabaikannya. Mengingat ada cukup banyak komitmen lain, git bisect akan menggunakan yang lain untuk mempersempit pencarian.sumber
$ git bisect ..
pada dasarnya alat Git untuk debugging . Debit 'Git Bisect' dengan menelusuri komitmen sebelumnya sejak komit kerja terakhir Anda (yang diketahui). Ini menggunakan pencarian biner untuk melalui semua komitmen tersebut, untuk sampai ke yang memperkenalkan regresi / bug.$ git bisect start
# Mulai membagi dua$ git bisect bad
# menyatakan bahwa komit saat ini (v1.5) memiliki titik regresi / pengaturan 'buruk'$ git bisect good v1.0
# menyebutkannya komit kerja bagus terakhir (tanpa regresi)Penyebutan poin 'buruk' dan 'baik' ini akan membantu git membagi dua (pencarian biner) memilih elemen tengah (komit v1.3). Jika regresi ada di komit v1.3, Anda akan menetapkannya sebagai titik 'buruk' baru yaitu ( Baik -> v1.0 dan Buruk -> v1.3 )
atau sama jika komit v1.3 bebas bug Anda akan menetapkannya sebagai 'Good point' yang baru yaitu (* Baik -> v1.3 dan Buruk -> v1.6).
sumber
Catatan: syarat
good
danbad
bukan satu-satunya yang dapat Anda gunakan untuk menandai komit dengan atau tanpa properti tertentu.Git 2.7 (Q4 2015) memperkenalkan
git bisect
opsi baru .Dengan menambah dokumentasi:
Lihat komit 06e6a74 , komit 21b55e3 , komit fe67687 (29 Jun 2015) oleh Matthieu Moy (
moy
) .Lihat komit 21e5cfd (29 Jun 2015) oleh Antoine Delaite (
CanardChouChinois
) .(Digabung oleh Junio C Hamano -
gitster
- dalam komit 22dd6eb , 05 Okt 2015)sumber