πŸ›πŸ” Как Π½Π°ΠΉΡ‚ΠΈ Π±Π°Π³ Π² 2088 ΠΊΠΎΠΌΠΌΠΈΡ‚Π°Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ git bisect

Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск Π² дСйствии: Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ кСйс, ΠΊΠ°ΠΊ Π½Π°ΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ срСди тысяч ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΊΠΎΠ΄Π°, Π·Π°Ρ‚Ρ€Π°Ρ‚ΠΈΠ² ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

ΠœΠ΅Ρ‚ΠΎΠ΄ git bisect – ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для поиска измСнСния, Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ Π±Π°Π³ Π² ΠΊΠΎΠ΄Π΅: с Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΡƒΠ΄Π°Π»ΠΎΡΡŒ быстро Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, просмотрСв всСго 11 ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² вмСсто ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… 2088.

Π—Π°Π΄Π°Ρ‡Π°: Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Π²Π°Π» Ρ€Π΅Π³Ρ€Π΅ΡΡΠΈΠΎΠ½Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅:

  • Ошибка Π±Ρ‹Π»Π° зарСгистрирована 21 октября. Она находится Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии Π½Π° Π²Π΅Ρ‚ΠΊΠ΅ main.
  • Ошибка отсутствуСт Π² Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΉ вСрсии, которая Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ release-5.7.0.
  • Π’Π΅Ρ‚ΠΊΡƒ release-5.7.0 создали 2 мСсяца Π½Π°Π·Π°Π΄, Π° с Ρ‚Π΅Ρ… ΠΏΠΎΡ€ Π² Π²Π΅Ρ‚ΠΊΠ΅ main Π±Ρ‹Π»ΠΎ сдСлано ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ – Π±Π°Π³ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² любом ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… тысяч ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ быстро ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ.

Как Π½Π°ΠΉΡ‚ΠΈ ΠΎΡˆΠΈΠ±ΠΊΡƒ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ появилась ошибка, Π½ΡƒΠΆΠ½ΠΎ:

  • Найти Ρ‚ΠΎΡ‡ΠΊΡƒ Π² истории ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π³Π΄Π΅ ΠΊΠΎΠ΄ Π΅Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ инструмСнт git bisect, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ поиск Π΄ΠΎ минимального числа ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ.

Π¨Π°Π³ 1: Находим Β«Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉΒ» ΠΈ Β«ΠΏΠ»ΠΎΡ…ΠΎΠΉΒ» ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Π²Π΅Ρ‚ΠΊΠ΅ release-5.7.0 ошибки Π½Π΅Ρ‚, Π·Π½Π°Ρ‡ΠΈΡ‚, Π±Π°Π³ появился Π² Π²Π΅Ρ‚ΠΊΠ΅ main послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±Ρ‹Π»Π° создана Π²Π΅Ρ‚ΠΊΠ° release-5.7.0. Для опрСдСлСния ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ° (Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ вСтвлСния) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°:

git merge-base main release-5.7.0

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π°ΠΉΠ΄Π΅Ρ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ° Π΄Π²ΡƒΡ… Π²Π΅Ρ‚ΠΎΠΊ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Π΅Ρ‚ΠΊΠ° release-5.7.0 Π±Ρ‹Π»Π° Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΈΠ· Π²Π΅Ρ‚ΠΊΠΈ main. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚ (Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ commit0001 для краткости) Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Β«Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌΒ» – Π² Π½Π΅ΠΌ ошибки Π΅Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π»ΠΎ.

Ошибка Π±Ρ‹Π»Π° зарСгистрирована 21 октября. Π—Π½Π°Ρ‡ΠΈΡ‚, Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΡ‡Π½ΠΎ содСрТит Π±Π°Π³, сдСланный Π΄ΠΎ этой Π΄Π°Ρ‚Ρ‹. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°:

git log --before="2024-10-21" -n 1 main

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π±ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Β«ΠΏΠ»ΠΎΡ…ΠΈΠΌΒ» – Π±Π°Π³ Π² Π½Π΅ΠΌ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ. Для простоты Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ commit9999.

Π¨Π°Π³ 2: ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅ΠΌ количСство ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΌΠ΅ΠΆΠ΄Ρƒ Β«Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌΒ» ΠΈ Β«ΠΏΠ»ΠΎΡ…ΠΈΠΌΒ»

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, сколько ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ этими двумя Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

git rev-list --count commit0001..commit9999

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: ΠΌΠ΅ΠΆΠ΄Ρƒ этими двумя ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ оказалось 2088 ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ – слишком ΠΌΠ½ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

Π¨Π°Π³ 3: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ поиск git bisect

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ git bisect ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ быстро Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Π²Π°Π» ΠΎΡˆΠΈΠ±ΠΊΡƒ, примСняя Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска. ВмСсто ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ всСх 2088 ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ всСго 10-11 шагов.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ процСсс поиска, ΡƒΠΊΠ°Π·Π°Π² Β«Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉΒ» ΠΈ Β«ΠΏΠ»ΠΎΡ…ΠΎΠΉΒ» ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹:

git bisect start
git bisect good commit0001
git bisect bad commit9999

ПослС этого Git автоматичСски Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚ посСрСдинС ΠΌΠ΅ΠΆΠ΄Ρƒ Β«Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌΒ» ΠΈ Β«ΠΏΠ»ΠΎΡ…ΠΈΠΌΒ» . НапримСр, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅:

Bisecting: 1044 revisions left to test after this (roughly 10 steps)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚:

  • Если Π±Π°Π³ присутствуСт, Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ git bisect bad
  • Если Π±Π°Π³Π° Π½Π΅Ρ‚ – git bisect good

Git снова Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π² сСрСдинС ΠΎΡΡ‚Π°Π²ΡˆΠ΅Π³ΠΎΡΡ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. НапримСр:

Bisecting: 522 revisions left to test after this (roughly 9 steps)

Π’Ρ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚Π΅ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· указывая good ΠΈΠ»ΠΈ bad. ΠŸΡ€ΠΈ этом Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΏΠΎΠ΄ΠΎΠ·Ρ€Π΅Π²Π°Π΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π² Π΄Π²Π° Ρ€Π°Π·Π° Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС. ПослС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… шагов (Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 10-11 для 2088 ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²) git bisect сообщаСт, Ρ‡Ρ‚ΠΎ нашСл ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ появился Π±Π°Π³:

commit1234 is the first bad commit
commit commit1234
Author: Some Person <somebody@example.com>
Date:   Wed Oct 16 13:43:01 2024 -0400
[commit message]

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠœΠ΅Ρ‚ΠΎΠ΄ git bisect особСнно ΠΏΠΎΠ»Π΅Π·Π΅Π½ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… с частыми ΠΊΠΎΠΌΠΌΠΈΡ‚Π°ΠΌΠΈ – ΠΎΠ½ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ экономит врСмя ΠΈ ускоряСт поиск ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π’ΠΎΠ·ΡŒΠΌΠΈΡ‚Π΅ Π½Π° Π·Π°ΠΌΠ΅Ρ‚ΠΊΡƒ!

А ΠΊΠ°ΠΊΠΈΠ΅ Π΅Ρ‰Π΅ инструмСнты Git Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΊΠΎΠ΄Π°? ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ своим ΠΎΠΏΡ‹Ρ‚ΠΎΠΌ Π² коммСнтариях!

***
πŸ’» Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста»

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста
18 октября 2017

Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ° ΠΏΠΎ Git, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ прСдставлСны основныС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

Git сСгодня - это ΠΎΡ‡Π΅Π½ΡŒ популярная систСма контроля вСрсий. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΡˆΠΏΠ°Ρ€Π³Π°Π»...
admin
21 июня 2017

ΠŸΡ€ΠΎ Git, Github ΠΈ Gitflow простыми словами

НС самоС ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰Π΅Π΅, Π½ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΡ…ΠΎΠ΄Ρ‡ΠΈΠ²ΠΎΠ΅ руководство ΠΏΠΎ Git, Gith...
admin
23 фСвраля 2017

Git Π·Π° полчаса: руководство для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ…

Π’ послСдниС Π³ΠΎΠ΄Ρ‹ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ git дСмонстрируСт Π²Π·Ρ€Ρ‹Π²Π½ΠΎΠΉ рост. Π­Ρ‚Π° систСма ...