سلام عزیزان، امیدوارم حالتون عالی باشه. چند ماهی از دیدنتون دور بودم و الان با انرژی بیشتری برگشتم و خوشحالم که دوباره اینجام. تو این مقاله (که مقاله کوتاهی هم خواهد بود) قرار هست با git bisect آشنا بشیم و ببینیم که در چه مواقعی برامون کاربردی خواهد بود! خوب اگر آماده این بیاین شروع کنیم :)
فرض کنید در جایی از پروژه تون مشکلی پیش اومده و میخواید ببینید که این مشکل اولین بار در کدوم commit ایجاد شده! راه حل ساده و زمانبری که برای این رفع این مشکل وجود داره، این هست که commit ها رو یکی یکی بررسی کنید و به عقب برگردید و برای هر کامیت چک کنید که آیا در این کامیت مشکلی وجود داره یا نه! اما همونطور که میدونید اگر تعداد کامیت ها زیاد باشه، این کار خیلی زمان بر خواهد بود و در همچین مواقعی باید حرفه ای تر عمل کنیم :) تو این شرایط میتونیم از ترفندی به نام git bisect
استفاده کنیم! این ابزار با استفاده از جستجوی دودویی (binary serach)، تعداد کامیت هایی که باید بررسی کنیم رو خیلی کمتر میکنه! به عنوان مثال، اگر ۱۰۰ کامیت داشته باشیم، با روش اول ممکنه که همه ی کامیت هارو بررسی کنیم، در حالی که با کمک git bisect
ممکنه فقط با بررسی ۸ کامیت به نتیجه دلخواهمون برسیم! برای استفاده از git bisect، ابتدا دستور زیر رو اجرا میکنیم:
حالا باید شناسه (id) کامیتی که حدس میزنیم مشکلی در اون وجود داره و کامیتی که مطمئنیم مشکلی در اون وجود نداره رو پیدا کنیم. طبیعتا کامیت فعلی دارای مشکل هست و برای کامیت بدون مشکل هم میتونیم یک کامیت قدیمی که هیچ مشکلی نداره رو انتخاب کنیم :) فرض کنید id این دو کامیت به ترتیب <LAST-COMMIT-ID> و <OLD-COMMIT-ID> باشن، حالا دستورات زیر رو اجرا میکنیم:
این دستورات در واقع به bisect
میگن که <OLD-COMMIT-ID>
کامیت خوبیه (چون مشکلی در اون وجود نداره) و <LAST-COMMIT-ID>
هم کامیت بدیه (چون مشکلی در اون وجود داره)! با اجرای دستور دوم، bisect
کامیتی که از نظر ترتیب وسط <LAST-COMMIT-ID>
و <OLD-COMMIT-ID>
هست رو برامون checkout
میکنه و از ما میخواد که چک کنیم آیا این کامیت هم مشکلی داره یا نه!
سوالی که ممکنه پیش بیاد این هست که یعنی چی که bisect کامیت رو checkout میکنه؟ مگه فقط برنجها نبودن که checkout میشدن :) ؟ منظور از checkout شدن در اینجا این هست که فایل ها به شکلی که تو اون کامیت بودن، تغییر میکنن تا بتونیم چک کنیم که آیا واقعا مشکلی در داخلشون وجود داره یا نه! همونطور که میدونید برای branch هم دقیقا همین مفهوم وجود داره و وقتی checkout میکنیم، فایل ها به شکلی که در اون branch نوشته شده بودن تغییر میکنن!
بعد از بررسی، اگر مشکلی وجود داشت، دستور زیر:
و اگر مشکلی وجود نداشت دستور زیر رو اجرا میکنیم:
این دستورات در واقع به bisect
گزارش میدن کامیتی که برامون checkout
کرده، خوبه یا بده (به قول خودمون بچه ی خوبیه یا نه :) . بعد از اجرای هر کدوم از دستورات بالا، bisect
مجددا کامیت دیگه ای رو برامون checkout
میکنه تا ما good یا bad بودنش رو بررسی کنیم. بعد از چند بار تکرار این کار، bisect
کامیتی که اولین بار این مشکل رو ایجاد کرده رو گزارش میکنه. برای درک یهتر توضیحات تصویر زیر میتونه بهتون کمک کنه:
در آخر یادتون باشه وقتی کارتون با git bisect تموم شد، این دستور رو اجرا کنید تا bisecting خاتمه پیدا کنه: