Гит

Водич за Гит Бисецт

Водич за Гит Бисецт
Коментарисање ваших обавеза је битан део одржавања следљивог кода. Помаже вам у праћењу проблема. Међутим, проналажење грешке само на основу коментара је досадан задатак. Може бити потребно дуго времена да се сортира сва историја и схвати који је починитељ кривац.

Команда гит бисецт пружа начин за убрзавање процеса откривања грешака. Омогућава вам брже препознавање проблема. Помоћу гит бисецт можете дефинисати низ урезивања за које сумњате да имају проблематични код, а затим помоћу бинарних метода уклањања пронаћи почетак проблема. Проналажење грешака постаје брже и лакше.

Поставимо пример и покренимо неколико тест случајева да бисмо видели како то функционише.

Пример подешавања

У нашем примеру ћемо направити тест.ткт датотеку и додајте нови ред у датотеку уз свако урезивање. Након 16 урезивања, коначно стање датотеке ће изгледати овако:

Ево мог доброг кода 1
Ево мог доброг кода 2
Ево мог доброг кода 3
Ево мог доброг кода 4
Ево мог доброг кода 5
Ево мог доброг кода 6
Ево мог доброг кода 7
Ево мог доброг кода 8
Ево мог лошег кода 1 <-- BUG INTRODUCED HERE
Ево мог лошег кода 2
Ево мог лошег кода 3
Ево мог лошег кода 4
Ево мог лошег кода 5
Ево мог лошег кода 6
Ево мог лошег кода 7
Ево мог лошег кода 8
Ево мог лошег кода 9

У горњем примеру, грешка је ушла у код након 8 урезивања. Шифру смо наставили развијати чак и након увођења грешке.

Можете да креирате фасциклу звану ми_бисецт_тест и да користите следеће команде из директоријума да бисте креирали пример ситуације:

гит инит
ецхо "Ево мог доброг кода 1"> тест.ткт
гит адд -А && гит цоммит -м "Мој налог 1"
ецхо "Ево мог доброг кода 2" >> тест.ткт
гит адд -А && гит цоммит -м "Мој налог 2 (в1.0.0) "
ецхо "Ево мог доброг кода 3" >> тест.ткт
гит адд -А && гит цоммит -м "Мој налог 3"
ецхо "Ево мог доброг кода 4" >> тест.ткт
гит адд -А && гит цоммит -м "Ми цоммит 4"
ецхо "Ево мог доброг кода 5" >> тест.ткт
гит адд -А && гит цоммит -м "Мој налог 5 (в1.0.1) "
ецхо "Ево мог доброг кода 6" >> тест.ткт
гит адд -А && гит цоммит -м "Ми цоммит 6"
ецхо "Ево мог доброг кода 7" >> тест.ткт
гит адд -А && гит цоммит -м "Мој налог 7 (в1.0.2) "
ецхо "Ево мог доброг кода 8" >> тест.ткт
гит адд -А && гит цоммит -м "Ми цоммит 8"
ецхо "Ево мог лошег кода 1"> тест.ткт
гит адд -А && гит цоммит -м "Ми цоммит 9"
ецхо "Ево мог лошег кода 2" >> тест.ткт
гит адд -А && гит цоммит -м "Ми цоммит 10"
ецхо "Ево мог лошег кода 3" >> тест.ткт
гит адд -А && гит цоммит -м "Ми цоммит 11"
ецхо "Ево мог лошег кода 4" >> тест.ткт
гит адд -А && гит цоммит -м "Мој налог 12 (в1.0.3) "
ецхо "Ево мог лошег кода 5" >> тест.ткт
гит адд -А && гит цоммит -м "Ми цоммит 13"
ецхо "Ево мог лошег кода 6" >> тест.ткт
гит адд -А && гит цоммит -м "Ми цоммит 14"
ецхо "Ево мог лошег кода 7" >> тест.ткт
гит адд -А && гит цоммит -м "Мој налог 15 (в1.0.4) "
ецхо "Ево мог лошег кода 8" >> тест.ткт
гит адд -А && гит цоммит -м "Ми цоммит 16"

Провера историје

Ако погледате историју урезивања, видећете следеће:

$ гит лог
зарежи 3023б63еб42ц7фадц93ц2дд18б532а44а0а6888а
Аутор: Зак Х
Датум: Нед Дец 31 23:07:27 2017 -0800
Моја обавеза 17
зарежи 10еф0286д6459цд5деа5038а54едф36фц9бфе4ц3
Аутор: Зак Х
Датум: Нед Дец 31 23:07:25 2017 -0800
Моја обавеза 16
завежи 598д4ц4ацаеб14цда0552б6а92аа975ц436д337а
Аутор: Зак Х
Датум: Нед Дец 31 23:07:23 2017 -0800
Мој налог 15 (в1.0.4)
додај б9678б75ац93д532еед22ец2ц6617е5а9д70фе7б
Аутор: Зак Х
Датум: Нед Дец 31 23:07:21 2017 -0800
Моја обавеза 14
додај еб3ф2ф7б0ебедб732ецб5ф18бее786цд3цббб521
Аутор: Зак Х
Датум: Нед Дец 31 23:07:19 2017 -0800
Моја обавеза 13
зарежи 3цб475а4693б704793946а878007б40а1фф67цд1
Аутор: Зак Х
Датум: Нед Дец 31 23:07:17 2017 -0800
Мој налог 12 (в1.0.3)
завежи 0419а38д898е28ц4дб69064478ецаб7736700310
Аутор: Зак Х
Датум: Нед Дец 31 23:07:15 2017 -0800
Моја обавеза 11
завежи 15бц59201ац1ф16аеаа233еб485е81фад48фе35ф
Аутор: Зак Х
Датум: Нед Дец 31 23:07:13 2017 -0800
Моја обавеза 10
изврши а33е366ад9ф6004а61а468б48б36е0ц0ц802а815
Аутор: Зак Х
Датум: Нед Дец 31 23:07:11 2017 -0800
Моја обавеза 9
додај еад472д61ф516067983д7е29д548фц856д6е6868
Аутор: Зак Х
Датум: Нед Дец 31 23:07:09 2017 -0800
Моја обавеза 8
завежи 8995д427668768аф88266ф1е78213506586б0157
Аутор: Зак Х
Датум: Нед Дец 31 23:07:07 2017 -0800
Мој налог 7 (в1.0.2)
цоммит бе3б341559752е733ц6392а16д6е87б5аф52е701
Аутор: Зак Х
Датум: Нед Дец 31 23:07:05 2017 -0800
Моја обавеза 6
додај ц54б58ба8ф73фб464222ф30ц90аа72ф60б99бда9
Аутор: Зак Х
Датум: Нед Дец 31 23:07:03 2017 -0800
Мој налог 5 (в1.0.1)
завежи 264267111643еф5014е92е23фд2ф306а10е93а64
Аутор: Зак Х
Датум: Нед Дец 31 23:07:01 2017 -0800
Моја обавеза 4
цоммит цфд7127цд35ф3ц1а55еб7ц6608ецаб75бе30б208
Аутор: Зак Х
Датум: Нед Дец 31 23:06:59 2017 -0800
Моја обавеза 3
цоммит 3ф90793б631ддце7бе509ц36б0244606а2ц0е8ад
Аутор: Зак Х
Датум: Нед Дец 31 23:06:57 2017 -0800
Мој налог 2 (в1.0.0)
додај цц163адб8а3ф7б7б52411дб2б3д8баб9б7фб191е
Аутор: Зак Х
Датум: Нед Дец 31 23:06:55 2017 -0800
Моја обавеза 1

Чак и са само неколико урезивања, можете видети да је тешко прецизно одредити урезивање које је покренуло грешку.


Проналажење Буг

Употријебимо гит лог -онлине да бисмо видјели чишћу верзију историје урезивања.

$ гит лог --онелине
3023б63 Моја обавеза 17
10еф028 Мој налог 16
598д4ц4 Мој налог 15 (в1.0.4)
б9678б7 Мој налог 14
еб3ф2ф7 Мој налог 13
3цб475а Мој налог 12 (в1.0.3)
0419а38 Моја обавеза 11
15бц592 Мој налог 10
а33е366 Мој налог 9
еад472д Мој налог 8
8995д42 Мој налог 7 (в1.0.2)
бе3б341 Мој налог 6
ц54б58б Мој налог 5 (в1.0.1)
2642671 Моја обавеза 4
цфд7127 Мој налог 3
3ф90793 Мој налог 2 (в1.0.0)
цц163ад Мој налог 1

Желимо да нађемо ситуацију у којој се на линији „Ево мог лошег кода 1“ <- BUG INTRODUCED HERE” entered the picture.

Ситуација 1

Претпоставимо да се сећамо да је наш код био добар до в1.0.2 и желимо да проверимо од тог тренутка до најновијег урезивања. Прво започињемо наредбу бисецт:

$ гит бисецт старт

Пружамо добру и лошу границу (без хеша значи најновији код):

$ гит бисецт гоод 8995д42
$ гит бисецт бад

Излаз:

Подјела: 4 ревизије преостале за тестирање након овога (отприлике 2 корака)
[3цб475а4693б704793946а878007б40а1фф67цд1] Мој урезивање 12 (в1.0.3)

Команда бисецт пронашла је средњу тачку у нашем дефинисаном опсегу и аутоматски преместила код да преда 12. Сада можемо да тестирамо наш код. У нашем случају ћемо објавити садржај теста.ткт:

$ мачји тест.ткт

Излаз:

Ево мог доброг кода 1
Ево мог доброг кода 2
Ево мог доброг кода 3
Ево мог доброг кода 4
Ево мог доброг кода 5
Ево мог доброг кода 6
Ево мог доброг кода 7
Ево мог доброг кода 8
Ево мог лошег кода 1 <-- BUG INTRODUCED HERE
Ево мог лошег кода 2
Ево мог лошег кода 3
Ево мог лошег кода 4

Видимо да је стање теста.ткт је у стању након грешке. Дакле, у лошем је стању. Дакле, обавестили смо команду бисецт:

$ гит бисецт бад

Излаз:

Подељавање: преостало је 2 ревизије за тестирање након овога (отприлике 1 корак)
[а33е366ад9ф6004а61а468б48б36е0ц0ц802а815] Мој налог 9

Премешта наш код на урезивање 9. Поново тестирамо:

$ мачји тест.ткт

Излаз:

Ево мог доброг кода 1
Ево мог доброг кода 2
Ево мог доброг кода 3
Ево мог доброг кода 4
Ево мог доброг кода 5
Ево мог доброг кода 6
Ево мог доброг кода 7
Ево мог доброг кода 8
Ево мог лошег кода 1 <-- BUG INTRODUCED HERE

Видимо да смо пронашли почетну тачку грешке. Кривац је прекршај „а33е366 Мој налог 9“.

Коначно, све враћамо у нормалу:

$ гит ресетовање бисект-а

Излаз:

Претходна ХЕАД позиција била је а33е366… Мој налог 9
Пребачено на грану 'мастер'

Ситуација 2

У истом примеру, покушајмо са ситуацијом када други програмер започне са премисом да је грешка уведена између в1.0.0 и в1.0.3. Процес можемо започети поново:

$ гит бисецт старт
$ гит бисецт гоод 3ф90793
$ гит бисецт бад 3цб475а

Излаз:

Подјела: 4 ревизије преостале за тестирање након овога (отприлике 2 корака)
[8995д427668768аф88266ф1е78213506586б0157] Мој налог 7 (в1.0.2)

Бисецт је преместио наш код тако да урезује 7 или в1.0.2. Покренимо наш тест:

$ мачји тест.ткт

Излаз:

Ево мог доброг кода 1
Ево мог доброг кода 2
Ево мог доброг кода 3
Ево мог доброг кода 4
Ево мог доброг кода 5
Ево мог доброг кода 6
Ево мог доброг кода 7

Не видимо ниједан лош код. Дакле, обавестите гит бисецт:

$ гит бисецт добро

Излаз:

Подељавање: преостало је 2 ревизије за тестирање након овога (отприлике 1 корак)
[а33е366ад9ф6004а61а468б48б36е0ц0ц802а815] Мој налог 9

Потакнуо нас је да починимо 9. Поново тестирамо:

$ мачји тест.ткт

Излаз:

Ево мог доброг кода 1
Ево мог доброг кода 2
Ево мог доброг кода 3
Ево мог доброг кода 4
Ево мог доброг кода 5
Ево мог доброг кода 6
Ево мог доброг кода 7
Ево мог доброг кода 8
Ево мог лошег кода 1 <-- BUG INTRODUCED HERE

Поново смо пронашли урезивање које је увело грешку. То је било урезивање „а33е366 Мој налог 9“. Иако смо започели са различитим опсегом сумњи, у неколико корака пронашли смо исту грешку.

Ресетујмо:

$ гит ресетовање бисект-а

Излаз:

Претходна ХЕАД позиција била је а33е366… Мој налог 9
Пребачено на грану 'мастер'

Закључак

Као што видите из примера, гит бисецт нам омогућава да брже утврдимо проблем. Одличан је алат за повећање ваше продуктивности. Уместо да пролазите кроз целу историју урезивања, можете заузети систематичнији приступ отклањању грешака.

Даље истраживање:

хттпс: // гит-сцм.цом / доцс / гит-бисецт
хттпс: // гит-сцм.цом / боок / ен / в2 / Гит-Тоолс-Дебуггинг-витх-Гит

Најбоље апликације за мапирање гамепада за Линук
Ако волите да играте игре на Линуку са гамепадом уместо са типичним системом за унос тастатуре и миша, за вас постоје неке корисне апликације. Многе и...
Корисни алати за Линук играче
Ако волите да играте игре на Линуку, велика је вероватноћа да сте можда користили апликације и услужне програме попут Вине, Лутрис и ОБС Студио за поб...
ХД Ремастеред игре за Линук које никада раније нису имале Линук издање
Многи програмери и издавачи игара долазе са ХД ремастером старих игара како би продужили живот франшизе, молимо обожаваоце да захтевају компатибилност...