Shadi Shirinbeik
Shadi Shirinbeik
خواندن ۴ دقیقه·۵ سال پیش

با Git bisect توی یه چشم بهم زدن باگ رو پیدا کنید!

با فرض اینکه ما می‌دونیم گیت چی هست و تجربه کار با گیت‌هاب و گیت‌لب رو داریم، می‌خوام که توی این مقاله شما رو با یکی از امکانات فوق‌العاده گیت به نام git bisect آشنا کنم.


راجع به اینکه گیت چقدر عالیه، چقدر بزرگه و چقدر واجبه که همه دولوپرها حداقل قسمتی از کاربردهای گیت رو بشناسن و بتونن باهاش کار کنن صحبتی نمی‌کنم چون کاملا برای هممون واضحه. پس بدون اتلاف وقت، میرم سراغ اصل مطلب!

دستور git bisect در حقیقت مخفف git binary search commit هست. ما وقتی ازین دستور استفاده می‌کنیم که در روند توسعه پروژه به باگ خوردیم و حالا می‌خوایم بدونیم که این باگ چه زمانی در کدوم کامیت پیدا شده و از طرفی کدوم ورژن از repositoryمون bug free هست. git bisect اینکارو با بررسی کامیت‌ها برامون انجام میده.

خب حالا در عمل چه اتفاقاتی میفته و چجوری می‎تونیم با git bisect کار کنیم... دستور زیر اول از همه به گیت میگه که شروع کن به bisect کردن.

git bisect start


حالا باید یک سری اطلاعات به گیت بدیم تا بتونه در پیدا کردن باگ بهمون کمک کنه. اطلاعاتی که ما قراره به گیت بدیم دو قسمت بیشتر نیست. [خب چون خودمون اطلاعات زیادی نداریم! وگرنه دیگه نیازی به bisect نبود!:) ] اول از همه باید مشخص کنیم که در حال حاضر ما در این کامیتی که هستیم باگ داریم و یا به عبارتی اوضاع بده! پس با دستور زیر این رو به گیت میفهمونیم.

git bisect bad


و بعد ازین، در مرحله بعد باید یکی از کامیت‌هایی که می‌دونیم در اون باگ نداشتیم رو به گیت معرفی کنیم و بگیم که در اون کامیت اوضاع خوب بوده. برای این کار به آی‌دی اون کامیتی که می‌دونیم بدون باگ بوده نیاز داریم، تا بتونیم ازین طریق به گیت معرفیش کنیم.

پس یه git log می‌گیریم و آی‌دی کامیت مورد نظرمون رو کپی می‌کنیم. (در اینجا لزومی نداره که همه آی‌دی کپی بشه. یکمی از اولش هم کپی بشه برای شناسایی توسط گیت کافیه.) عکس زیر یه نمونه از git log هست. همونطور که میبینید جزئیات آخرین کامیت‌هاون رو نشون میده.

git log
git log


و در ادامه با دستور زیر به راحتی این کامیت سالم رو به گیت معرفی می‌کنیم.

git bisect good 3799573c07ae56555(#commit ID)

همونطور که میبینید دستورات خیلی ساده و روون هستن.

ازینجا ببعد کار گیت شروع میشه. به اینصورت که دقیقا یک کامیت مابین این دو کامیتی که ما معرفی کردیم رو در نظر می‌گیره و به ما پیشنهاد میده که این کامیت رو چک کنید ببینید باگ داره یا خیر. (یه پیغامی شبیه به عکس زیر مشاهده می‌کنید در این مرحله)

چک کردن کامیت پیشنهادی گیت
چک کردن کامیت پیشنهادی گیت


پس ما باید پروژه رو run و بررسی کنیم. فرض کنید پس از بررسی میبینیم که در این کامیت باگ وجود داشته. حالا باید مثل قبل با دستور زیر مشخص کنیم که کامیت پیشنهادی باگ داره. (بدون نیاز به آی‌دی کامیت)

git bisect bad


بعد ازین دوباره گیت یه کامیت دیگه برای بررسی بهمون پیشنهاد میده. (پایه و اساس انتخاب‌ این کامیت‌ها توسط گیت، جستجوی باینری هست.) این کامیت رو هم بررسی می‌کنیم و (فرضا) میبینیم که در این کامیت باگی وجود نداره. دیگه حالا می‌دونید که باید دستور زیر رو بنویسیم.

git bisect good


تا اینجای کار به اینصورت پیش رفتیم:

همونطور که میبینید زیر roughly 1 step خط کشیدم. این جمله یعنی اینکه گیت داره بهمون میگه هنوز 1قدم دیگه مونده تا باگ رو پیدا کنیم. پس حالا باید بازهم مثل مرحله قبل کامیت فعلی رو چک کنیم و به گیت بگیم که اوضاع چطوره. فرض می‌کنیم که در این کامیت هم باگی وجود نداره و دستور bisect good رو وارد کردیم. نتیجه میشه مثل عکس زیر:

تمووووم :)

باگ اینجاست. roughly 0 steps! یعنی دیگه تموم شده و نیازی به بررسی کامیت جدیدی نیست. باگ در همین کامیتی هست که آی‌دیش اون زیر نوشته شده. ("fix gallery")


به همین سادگی! مراحل انجام کار همینی هست که در بالا گفتیم. در حقیقت هر دفعه باید پروژه رو اجرا بگیریم و بررسی کنیم و نتیجه رو به گیت اطلاع بدیم. و در نهایت گیت کامیتی رو که باگ در اون پیدا شده به ما معرفی خواهد. نه چیزی کمتر، نه چیزی بیشتر!

برای کسب اطلاعات بیشتر و دقیق‌تر می‌تونید داکیومنت git bisect رو مطالعه کنید.

https://git-scm.com/docs/git-bisect



امیدوارم این مقاله براتون مفید بوده باشه. نظر، انتقاد یا پیشنهادی اگر دارین خوشحال میشم بشنوم تا باهم بیشتر یاد بگیریم. موفق باشید.


بقیه مقالات من در ویرگول:

https://vrgl.ir/Xw8al
https://vrgl.ir/5GHd4


References:

  1. https://medium.com/free-code-camp/how-did-that-bug-happen-git-bisect-to-the-rescue-4368105f8149
  2. https://medium.com/infraspeak/git-bisect-the-unsung-hero-for-hunting-down-bugs-a4dbe3ca4c75


گیتgitباگ
Front-End Developer (JavaScript | Vue.js). I love to learn more
شاید از این پست‌ها خوشتان بیاید