Git

Tutorial Git Bisect

Tutorial Git Bisect
Mengomentari komitmen anda adalah bahagian penting dalam menjaga kod yang dapat dikesan. Ia membantu anda mengesan masalah. Walau bagaimanapun, mencari pepijat berdasarkan komen sahaja adalah tugas yang membosankan. Memerlukan waktu yang lama untuk menyusun semua sejarah dan mencari tahu siapa pelakunya.

Perintah git bisect memberikan cara untuk mempercepat proses pengesanan bug. Ini membolehkan anda menentukan masalah dengan lebih cepat. Dengan git bisect, anda dapat menentukan rangkaian komit yang anda disyaki mempunyai kod bermasalah dan kemudian menggunakan kaedah penghapusan binari untuk mencari permulaan masalah. Mencari pepijat menjadi lebih pantas dan mudah.

Mari buat contoh dan jalankan beberapa kes ujian untuk melihat bagaimana ia berfungsi.

Persediaan Contoh

Dalam contoh kami, kami akan membuat ujian.txt file dan tambahkan baris baru ke fail dengan setiap komit. Setelah 16 melakukan, keadaan akhir fail akan kelihatan seperti ini:

Inilah kod 1 saya yang baik
Inilah kod 2 saya yang baik
Inilah kod 3 saya yang baik
Inilah kod 4 saya yang baik
Inilah kod 5 saya yang baik
Inilah kod 6 saya yang baik
Inilah kod 7 yang baik saya
Inilah kod 8 saya yang baik
Inilah kod 1 saya yang tidak baik <-- BUG INTRODUCED HERE
Inilah kod buruk saya 2
Inilah kod buruk 3 saya
Inilah kod buruk saya 4
Inilah kod buruk saya 5
Inilah kod buruk saya 6
Inilah kod buruk saya 7
Inilah kod buruk 8 saya
Inilah kod buruk 9 saya

Dalam contoh di atas, bug masuk ke dalam kod setelah 8 melakukan. Kami terus mengembangkan kodnya walaupun memperkenalkan bug.

Anda boleh membuat folder bernama my_bisect_test dan menggunakan perintah berikut dari dalam folder untuk membuat situasi contoh:

git init
echo "Inilah kod baik saya 1"> ujian.txt
git add -A && git commit -m "Komit saya 1"
echo "Inilah kod 2" saya yang baik.txt
git add -A && git commit -m "Komit saya 2 (v1.0.0) "
echo "Inilah kod 3" saya yang bagus.txt
git add -A && git commit -m "Komit saya 3"
echo "Inilah ujian kod 4" saya yang baik.txt
git add -A && git commit -m "Komit saya 4"
echo "Inilah ujian kod 5" saya yang baik.txt
git add -A && git commit -m "Komit saya 5 (v1.0.1) "
echo "Inilah ujian kod saya yang baik 6" >>.txt
git add -A && git commit -m "Komit saya 6"
echo "Inilah ujian kod 7" saya yang baik.txt
git add -A && git commit -m "Komit saya 7 (v1.0.2) "
echo "Inilah ujian kod 8" saya yang baik.txt
git add -A && git commit -m "Komit saya 8"
echo "Inilah kod buruk saya 1"> ujian.txt
git add -A && git commit -m "Komit saya 9"
echo "Inilah kod buruk saya 2" >> ujian.txt
git add -A && git commit -m "Komitmen saya 10"
echo "Inilah kod buruk saya 3" >> ujian.txt
git add -A && git commit -m "Komit saya 11"
echo "Inilah kod buruk saya 4" >> ujian.txt
git add -A && git commit -m "Komitmen saya 12 (v1.0.3) "
echo "Inilah kod buruk saya 5" >> ujian.txt
git add -A && git commit -m "Komit saya 13"
echo "Inilah kod buruk saya 6" >> ujian.txt
git add -A && git commit -m "Komit saya 14"
echo "Inilah kod buruk saya 7" >> ujian.txt
git add -A && git commit -m "Komit saya 15 (v1.0.4) "
echo "Inilah kod buruk saya 8" >>.txt
git add -A && git commit -m "Komitmen saya 16"

Menyemak Sejarah

Sekiranya anda melihat sejarah pelaksanaannya, anda akan melihat perkara berikut:

$ git log
komited 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:27 2017 -0800
Komitmen saya 17
komited 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:25 2017 -0800
Komitmen saya 16
komit 598d4c4acaeb14cda0552b6a92aa975c436d337a
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:23 2017 -0800
Komitmen saya 15 (v1.0.4)
komited b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:21 2017 -0800
Komitmen saya 14
buat eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:19 2017 -0800
Komitmen saya 13
komited 3cb475a4693b704793946a878007b40a1ff67cd1
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:17 2017 -0800
Komitmen saya 12 (v1.0.3)
komited 0419a38d898e28c4db69064478ecab7736700310
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:15 2017 -0800
Komitmen saya 11
komited 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:13 2017 -0800
Komitmen saya 10
komited a33e366ad9f6004a61a468b48b36e0c0c802a815
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:11 2017 -0800
Komitmen saya 9
komited ead472d61f516067983d7e29d548fc856d6e6868
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:09 2017 -0800
Komitmen saya 8
komited 8995d427668768af88266f1e78213506586b0157
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:07 2017 -0800
Komitmen saya 7 (v1.0.2)
komit be3b341559752e733c6392a16d6e87b5af52e701
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:05 2017 -0800
Komitmen saya 6
komited c54b58ba8f73fb464222f30c90aa72f60b99bda9
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:03 2017 -0800
Komit saya 5 (v1.0.1)
komit 264267111643ef5014e92e23fd2f306a10e93a64
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:07:01 2017 -0800
Komitmen saya 4
buat cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:06:59 2017 -0800
Komitmen saya 3
komited 3f90793b631ddce7be509c36b0244606a2c0e8ad
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:06:57 2017 -0800
Komitmen saya 2 (v1.0.0)
buat cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Pengarang: Zak H
Tarikh: Ahad 31 Dis 23:06:55 2017 -0800
Komitmen saya 1

Walaupun hanya dengan segelintir komit, anda dapat melihat bahawa sukar untuk menunjukkan komitmen yang memulakan bug.


Mencari Bug

Mari gunakan git log -online untuk melihat versi sejarah komitmen yang lebih bersih.

$ git log - talian
3023b63 Komitmen saya 17
10ef028 Komitmen saya 16
598d4c4 Komitmen saya 15 (v1.0.4)
b9678b7 Komitmen saya 14
eb3f2f7 Komitmen saya 13
3cb475a Komitmen saya 12 (v1.0.3)
0419a38 Komitmen saya 11
15bc592 Komitmen saya 10
a33e366 Komitmen saya 9
ead472d Komitmen saya 8
8995d42 Komitmen saya 7 (v1.0.2)
be3b341 Komitmen saya 6
c54b58b Komitmen saya 5 (v1.0.1)
2642671 Komitmen saya 4
cfd7127 Komitmen saya 3
3f90793 Komitmen saya 2 (v1.0.0)
cc163ad Komitmen saya 1

Kami ingin mencari keadaan di mana baris "Inilah kod 1 saya yang tidak baik <- BUG INTRODUCED HERE” entered the picture.

Keadaan 1

Anggaplah kita ingat bahawa kod kami baik sehingga v1.0.2 dan kami ingin memeriksa dari saat itu hingga komitmen terbaru. Kami mula-mula memulakan arahan dua bahagian:

permulaan $ git bisect

Kami menyediakan batas baik dan sempadan buruk (tiada hash bermaksud kod terkini):

$ git bisect baik 8995d42
$ git bisect buruk

Pengeluaran:

Bisecting: 4 semakan tersisa untuk diuji selepas ini (kira-kira 2 langkah)
[3cb475a4693b704793946a878007b40a1ff67cd1] Komitmen saya 12 (v1.0.3)

Perintah dua bahagian telah menemui titik tengah dalam julat yang ditentukan dan secara automatik memindahkan kod untuk melakukan 12. Kami boleh menguji kod kami sekarang. Dalam kes kami, kami akan mengeluarkan isi ujian.txt:

$ ujian kucing.txt

Pengeluaran:

Inilah kod 1 saya yang baik
Inilah kod 2 saya yang baik
Inilah kod 3 saya yang baik
Inilah kod 4 saya yang baik
Inilah kod 5 saya yang baik
Inilah kod 6 saya yang baik
Inilah kod 7 yang baik saya
Inilah kod 8 saya yang baik
Inilah kod 1 saya yang tidak baik <-- BUG INTRODUCED HERE
Inilah kod buruk saya 2
Inilah kod buruk 3 saya
Inilah kod buruk saya 4

Kami melihat bahawa keadaan ujian.txt berada dalam keadaan pasca bug. Jadi ia dalam keadaan buruk. Oleh itu, kami memberitahu arahan dua bahagian:

$ git bisect buruk

Pengeluaran:

Bisecting: 2 semakan tersisa untuk diuji selepas ini (kira-kira 1 langkah)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Komitmen saya 9

Ia menggerakkan kod kita untuk melakukan 9. Kami menguji lagi:

$ ujian kucing.txt

Pengeluaran:

Inilah kod 1 saya yang baik
Inilah kod 2 saya yang baik
Inilah kod 3 saya yang baik
Inilah kod 4 saya yang baik
Inilah kod 5 saya yang baik
Inilah kod 6 saya yang baik
Inilah kod 7 saya yang baik
Inilah kod 8 saya yang baik
Inilah kod 1 saya yang tidak baik <-- BUG INTRODUCED HERE

Kami melihat bahawa kami telah menemui titik permulaan bug. Komitmen "a33e366 Komitmen saya 9" adalah pelakunya.

Akhirnya, kami meletakkan semuanya kembali normal:

set semula $ git bisect

Pengeluaran:

Kedudukan KEPALA sebelumnya adalah a33e366… Komitmen saya 9
Beralih ke cawangan 'tuan'

Keadaan 2

Dalam contoh yang sama, mari kita cuba situasi di mana pembangun lain bermula dengan premis bahawa bug diperkenalkan antara v1.0.0 dan v1.0.3. Kami boleh memulakan prosesnya lagi:

permulaan $ git bisect
$ git bisect baik 3f90793
$ git bisect buruk 3cb475a

Pengeluaran:

Bisecting: 4 semakan tersisa untuk diuji selepas ini (kira-kira 2 langkah)
[8995d427668768af88266f1e78213506586b0157] Komitmen saya 7 (v1.0.2)

Bisect telah memindahkan kod kami untuk melakukan 7 atau v1.0.2. Mari jalankan ujian kami:

$ ujian kucing.txt

Pengeluaran:

Inilah kod 1 saya yang baik
Inilah kod 2 saya yang baik
Inilah kod 3 saya yang baik
Inilah kod 4 saya yang baik
Inilah kod 5 saya yang baik
Inilah kod 6 saya yang baik
Inilah kod 7 saya yang baik

Kami tidak melihat kod buruk. Oleh itu, beritahu git bisect:

$ git bisect bagus

Pengeluaran:

Bisecting: 2 semakan tersisa untuk diuji selepas ini (kira-kira 1 langkah)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Komitmen saya 9

Ini telah mendorong kita untuk melakukan 9. Kami menguji lagi:

$ ujian kucing.txt

Pengeluaran:

Inilah kod 1 saya yang baik
Inilah kod 2 saya yang baik
Inilah kod 3 saya yang baik
Inilah kod 4 saya yang baik
Inilah kod 5 saya yang baik
Inilah kod 6 saya yang baik
Inilah kod 7 yang baik saya
Inilah kod 8 saya yang baik
Inilah kod 1 saya yang tidak baik <-- BUG INTRODUCED HERE

Kami sekali lagi menemui komitmen yang memperkenalkan bug. Itu adalah komit "a33e366 Komitmen saya 9". Walaupun kami memulakan dengan pelbagai kecurigaan yang berbeza, kami menemui bug yang sama dalam beberapa langkah.

Mari tetapkan semula:

set semula $ git bisect

Pengeluaran:

Kedudukan KEPALA sebelumnya adalah a33e366… Komitmen saya 9
Beralih ke cawangan 'tuan'

Kesimpulannya

Seperti yang dapat anda lihat dari contoh, git bisect membolehkan kita menentukan masalah dengan lebih cepat. Ini adalah alat yang bagus untuk meningkatkan produktiviti anda. Daripada menjalani keseluruhan sejarah komitmen, anda boleh mengambil pendekatan yang lebih sistematik untuk melakukan penyahpepijatan.

Sambung belajar:

https: // git-scm.com / docs / git-bisect
https: // git-scm.com / book / en / v2 / Git-Tools-Debugging-with-Git

Shadow of the Tomb Raider untuk Tutorial Linux
Shadow of the Tomb Raider adalah penambahan kedua belas untuk siri Tomb Raider - francais permainan aksi-pengembaraan yang dibuat oleh Eidos Montreal....
Cara Meningkatkan FPS di Linux?
FPS bermaksud Bingkai sesaat. Tugas FPS adalah mengukur kadar bingkai dalam pemutaran video atau persembahan permainan. Dengan kata mudah bilangan gam...
Permainan Makmal Apl Oculus Teratas
Sekiranya anda adalah pemilik alat dengar Oculus, maka anda mesti mengetahui tentang memuatkan sideload. Sideloading adalah proses memasang kandungan ...