6 اشتباه رایج Git و روش برطرف کردن آن
آیا با معروفترین سیستم کنترل نسخه جهان به مشکل خوردهاید؟
اشتباه شماره 1 یکی از سادهترين خطاهای Git است که میتوان آنرا اصلاح کرد. فرض کنید برخی از کارها را به یک شاخه محلی (local branch) ارجاع دادید، بعد متوجه شدید که تعدادی از فایلهای مورد نیاز را طبقهبندی نکردهاید یا فراموش کردهاید اطلاعات مشخصی را به پیغام ارجاع اضافه کنید. جای نگرانی نیست، در ابتدا اگر تغییرات جدیدی دارید که نیاز به طبقهبندی دارند، اینکار را انجام دهید. سپس فرمان git commit –amend را تایپ کنید تا پیغام ارجاع را ویرایش کنید. بعد از انجام فرآیند فوق، کلید Esc را فشار داده و فرمان :xq را تایپ کنید تا تغییرات ذخیره شوند. در انتها از ویرایشگر خارج شوید. اگر تنها فایلها را تغییر دادهاید و نیازی به اصلاح پیغام ارجاع ندارید از فرمان git commit --amend --no-edit برای اضافه کردن فایلها و گذر از فرآیند ویرایش پیغام استفاده کنید. برای پیشگیری از بروز این مشکل باید روش ساخت ارجاع در Git را تغییر دهید. اگر مشغول کار روی پروژهای هستید که مرتبا برای ردگیری نسخههای افزایشی به ساخت ارجاعات کوچک نیاز دارد، این کار را از طریق شاخهها (branch) انجام دهید. در زمان انجام این کار تغییرات عمدهای که ایجاد میکنید را مستندسازی کنید و صبر نکنید با خط فرمان git commit همه تغییرات را به یکباره مستندسازی کنید. زمانی که به نقطه عطف پروژه رسیدید از فرمان git merge –squash در شاخه خود برای ذخیرهسازی نتایج به صورت یکجا در شاخه پروژه استفاده کنید، ارجاع را پاک کنید و از یادداشتهایی که برای پیغام ارجاع برداشته بودید برای بازبینی نهایی پروژه استفاده کنید.
2. تغییرات را به محلی ارجاع دادهاید
یکی دیگر از اشتباهات رایج این است که از روی وظیفهشناسی تعدادی از تغییرات را به اشتباه به شاخه اصلی مخزن ارجاع میدهید. در واقع تصمیم داشتید تغییرات را به یک شاخه جدید یا شاخه dev که برای شکست تغییرات در نظر گرفته بودید ارجاع دهید، اما تغییرات در شاخه اصلی قرار گرفتهاند. این اشتباه را با سه فرمان زیر میتوان برطرف کرد:
git branch new-branch
git reset HEAD~ --hard
git checkout new-branch
اولین فرمان شاخه جدیدی ایجاد میکند. فرمان دوم شاخه اصلی را به قبل از آخرین ارجاع ریست میکند، اما تغییراتی که ایجاد کردهاید را در شاخه new باقی میگذارد. فرمان سوم برای رفتن به شاخه جدیدی است که قرار است تغییرات جدید در آن قرار بگیرد. اگر چند ارجاع ساختهاید از فرمان git reset HEAD~<n> --hard استفاده کنید. در اینجا <n> به تعداد ارجاعاتی اشاره دارد که قصد بازگشت به آنها را دارید. البته میتوانید از فرمان git reset <nnnn> هم استفاده کنید. در فرمان فوق <nnnn> شناسه هش ارجاع هدف است. برای جلوگیری از بروز این اشتباه باید عادت کنید شاخههای جديدی بسازید و تغییرات را به آنها منتقل کنید.
3. یک فایل یا دایرکتوری را دور ریختهاید
یک اشتباه رایج دیگر پاک کردن تصادفی محتوای یک فایل یا یک پوشه است با آگاهی از این که متوجه میشوید تعدادی ارجاع به این شاخه وجود دارد. خوشبختانه یک راهکار ساده برای این مشکل وجود دارد. ابتدا از فرمان git log یا ابزار Git داخلی IDE که از آن استفاده میکنید برای پیدا کردن شناسه هش یک ارجاع قبل از اعمال تغییرات روی فایل استفاده کنید. سپس از فرمان git checkout hash_id -- /path/to/file برای بررسی ارجاعات به فایل استفاده کنید. دقت کنید که مسیر باید مرتبط با ریشه پروژه باشد. این کار نسخه قبلی فایل را در ناحیه شروع پروژه قرار میدهد. اگر در نظر دارید تعداد n ارجاع به عقب بازگردد، دیگر نیازی به شناسه هش ندارید. تنها کافی است فرمان git checkout HEAD~<n> -- /path/to/file را اجرا کنید. دقت کنید <n> تعداد ارجاعاتی است که شما را به عقب باز میگرداند. اگر میخواهید کل دایرکتوری فایلها را بررسی کنید، باید از فرمت wildcard برای مسیر فایل استفاده کنید. برای مثال، وارد کردن git checkout HEAD~1 -- ./src/** شما را یک ارجاع به عقب برمیگرداند و هر چیزی که در دایرکتوری /src ریشه پروژه است را بازیابی میکند.
4. بهطور تصادفی یک شاخه را حذف کردهاید
حذف کردن تصادفی کل یک شاخه از مخزن اتفاقی است که همه توسعهدهندگان از آن وحشت دارند. این مشکل با انجام چند کار نسبتا ساده حل میشود. ابتدا از فرمان git reflog برای پیدا کردن آخرین ارجاع داده شده به شاخه استفاده کنید. سپس از شناسه هش و مطابق با فرمان زیر برای ساخت یک شاخه جدید استفاده کنید:
git checkout -b restored-branch <hash_id>
دقت کنید راهکار فوق تنها زمانی مشکل را برطرف میکند که شاخه مورد بحث قبلا ادغام شده باشد. اگر به اجبار یک شاخه ادغام نشده را پاک کردهاید، ابتدا باید فرمان زیر را اجرا کنید.
git fsck --full --no-reflogs --unreachable --lost-found
این فرمان فهرستی از تمام هشهای ارجاع برای آبجکتهایی که دیگر قابل دسترس نیستند (از جمله شاخههای حذف شده) را استخراج میکند. از انتهای این فهرست به سمت بالا به دنبال مدخل unreachable commit بگردید، و سعی کنید این شناسه هش را درون یک شاخه جدید بازیابی کنید تا ببینید این همان شاخهای است که حذف کرده بودید یا خیر. اگر پاسخ منفی است باید این کار را تکبهتک تا بالای فهرست ادامه دهید تا ببینید چه چیزهایی را میتوانید بازیابی کنید. به عنوان یک قانون کلی، هرگز بهطور پیشفرض یک شاخه را به اجبار حذف (force-delete) نکنید تا بتوانید به محتوای یک شاخه ادغام نشده که هنوز هم میتوان چیزهای ارزشمندی درون آن پيدا کرد دسترسی داشته باشید.
5. با git push به یک شاخه راه دور صدمه وارد کردهاید
گاهی اوقات در زمان کار با یک کپی محلی از یک مخزن GitHub، این احتمال وجود دارد که با گزینه –force به اشتباه شاخه اصلی خود را به کپی راه دور وارد کنید. در نتیجه با یک کپی عمومی از یک مخزن مواجه خواهید شد که هنوز به مرحله باثبات و قابل استفادهای برای همه توسعهدهندگان نرسیده است.
چنین پیامدی میتواند یک فاجعه بزرگ برای وجهه کاری شما باشد. اگر چنین اشتباهی مرتکب شدید و مخزن خصوصی با مخزن راه دور همگامسازی شده، میتوانید از کپی شاخه مخزن راه دور برای همگامسازی مخزن خود استفاده کنید. به شاخهای که میخواهید دوباره همگامسازی شود مراجعه کنید (اگر از قبل در این شاخه هستید نیازی به این کار نیست) و فرمان زیر را اجرا کنید:
git reset --hard <remote_repo>/<branch>@{1}
این فرمان کپی <branch> شما را به آخرین نسخه همگامسازی شده <remote_repo> ریست میکند. در این مثال، شاخه ما master و مخزن راه دور origin است، بنابراین فرمان به شکل زیر است:
git reset --hard origin/master@{1}
سپس از فرمان git push -f <remote_repo> <branch> استفاده کنید تا مخزن راه دور به مرحله قبلی خود بازیابی شود.
یک راه برای جلوگیری از بروز چنین مشکلی این است که امکان force-pushing را غیرفعال كنيد. فرمان زیر اجازه انجام چنین کاری را روی مخزن Git راه دور میدهد:
git config --system receive.denyNonFastForwards true
6. اطلاعات خصوصی را به یک مخزن عمومی ارجاع دادهاید
اشتباه فوق بدترین مشکل در Git است. شما به اشتباه دادههای حساس خود را به یک مخزن عمومی ارجاع دادهاید و میخواهید هر چه سریعتر این فایلها را از این مخزن خارج کنید. ابتدا باید اطمینان حاصل کنید که این دادههای حساس حتا با برگشت به ارجاع قبلی قابل مشاهده نباشند و مهمتر اینکه فرآیند فوق را بدون اینکه محتوای دیگری تغییر کند انجام دهید. مشکل اینجا است که نمیتوانید تنها به وضعیت قبل از اضافه شدن فایل بازگرديد، چرا که در این فرآیند برخی از پوشهها یا ارجاعات، آسیب دیده و خراب میشوند. خبر خوب این است ابزاری بهنام BFG Repo-Cleaner به نشانی
https://rtyley.github.io/bfg-repo-cleaner ساخته شده که دادههای غیرضروری را از مخازن Git حذف میکند. این ابزار اجازه میدهد به سرعت عملیاتی کاربردی روی مخزن انجام دهید که حذف تمام فایلهای مطابق با یک wildcard مشخص یا حذف برخی متون مشخص از جمله این موارد است. توجه داشته باشید اگر دادهها را از یک شاخه محلی پاک کنید که باید در جای دیگری همگامسازی میشد، تنها از طریق force-push و اتصال به شاخههای راه دور قادر به همگام سازی خواهید بود. تمام ساختار درختی ارجاع باید از نو نوشته شود، بنابراین شما از اساس باید یک تاریخچه کاملا جدید برای مخزن راه دور بنويسید.
منبع: مجله شبکه