رفع خطاها در گیت – راهنمای جامع و ساده
در دنیای توسعهی نرم افزار و کد نویسی، ابزارها مختلفی مانند گیت کاربرد دارند. گیت (Git) به برنامهنویسان و توسعهدهندگان کمک میکند تا نسخهها و ورژنهای مختلف نرم افزار را نگهداری کرده و پروژههای تیمی را راحتتر مدیریت کنند. با این حال، گاه برخی خطاها در این ابزارها به وجود میآید که روند کار را مختل میسازد. در این مطلب قصد داریم تا به رفع خطاها در گیت بپردازیم. این محتوا به شما کمک میکند تا مسیر برنامه نویسی خود را راحتتر و بدون مشکل بسازید.
کار با گیت
همانطور که در مقدمهی مطلب بیان کردیم، گیت یک سیستم است که برای کنترل نسخههای مختلف (ورژنهای) نرمافزارها ایجاد شده است. بدین معنا که یک چهارچوب قوی و منعطف ایجاد شده است تا برنامه نویسان بتوانند بهصورت گروهی در این چهارچوب کدهای خود را ساماندهی کرده و تغییرات مختلف را روی آن اعمال کنند.
ویژگی مهم گیت این است که به برنامه نویسان این امکان را میدهد تا به صورت تیمی و همزمان روی پروژهها کار کنند. این مسأله یعنی تغییرات لحاظ شده توسط هر برنامه نویس، روی نسخهی نهایی قابل ادغام بوده و میتوان تغییرات را پیگیری کرد.
با وجود تمام مزیتهایی که در گیت دیده میشود، مشکلات گیت هم بخشی از آن است. توسعهدهندگان و برنامه نویسان با انواع خطا در گیت روبهرو هستند. در ادامهی مطلب با خطاهای رایج گیت از جمله «Updates were rejected because the tip of your current branch is behind» و نحوهی رفع خطاها در گیت آشنا خواهید شد.
درک خطاها در گیت
پیش از اینکه به بیان راهحل خطای پیش آمده بپردازیم، باید ابتدا درک واضحی از خطا داشته باشید. اینکه بدانید این خطا دقیقاً به چه معناست و چه موقع با آن روبهرو خواهیم شد. در این بخش، به این موضوع میپردازیم.
معنای خطا چیست؟
خطای «Updates were rejected because the tip of your current branch is behind» به معنای آن است که شاخهی محلی شما به نسبت شاخهی ریموت (از راه دور) عقب افتاده است. به عبارت روشنتر، در شاخهی از راه دور یکسری تغییرات لحاظ شده که شاخهی فعلی شما هنوز آنها را در خود ادغام نکرده است.
چه موقع این خطا را میبینیم؟
این خطا زمانی دیده میشود که شما در حال ارسال تغییرات به مخزن از راه دور هستید. تصور کنید که تیم شما نیز روی آن کدها کار میکند. این امکان وجود دارد که اعضای مختلف تیم، تغییرات را بهطور همزمان در آن شاخه ایجاد کنند. بنابراین احتمال دریافت این خطا بالا میرود.
پیشنهاد مطالعه: Git bash چیست؟ گیت بش به زبان ساده
سناریوهای رایج منجر به ایجاد مشکلات گیت
هر خطایی که در گیت دیده میشود، دلیل مخصوص به خودش را دارد. در مورد خطایی که پیشتر بیان کردیم، دلیل آن را باید در الگو و عادتهای توسعهدهندگان جستوجو کنیم. در ادامه سه دلیل اصلی که میتواند چنین خطایی را ایجاد کند، ذکر شده است.
تغییرات همزمان توسط چندین نفر از اعضای تیم
همانطور که میدانید، گیت امکان کار روی پروژههای تیمی را ایجاد کرده است. بدین معنا که چندین عضو تیم میتوانند به طور همزمان روی کدها کار کنند و تغییراتی را در آن بهوجود آورند.
تصور کنید که دو نفر از اعضای تیم مثلاً فرد «الف» و «ب» بهطور همزمان روی یکی از شاخهها کار میکنند. در زمان واحد، این دو فرد نسخهای از پروژه در آن شاخه را به سیستم لوکال خود فراخوانی میکنند. این احتمال وجود دارد که فرد «الف» بهروزرسانیهای خود را روی آن شاخه، سریعتر از فرد «ب» اعمال کرده باشد. اکنون که فرد «ب» قصد دارد تا تغییرات خود را به مخزن ارسال کند، با این خطا روبهرو خواهد شد. چراکه فرض کردهایم که فرد «ب» به نسخهی پیش از تغییرات فرد «الف» در نسخهی local خود دسترسی دارد.
فراموش کردن برای pull کردن بهروزرسانیهای اخیر
اگر کدنویس فراموش کند که آخرین تغییرات و update های کدها و پایگاه داده را pull کند؛ در واقع روی نسخهی قدیمیتر کار میکند. بنابراین هنگامی که قصد دارد تا تغییرات نسخهی لوکال خود را بفرستد، با این خطا روبهرو خواهد شد.
علت این موضوع آن است که زمانی که شما فایلی را به گیت ارسال میکنید، گیت اختلافات بین شاخهی محلی و نسخهی راه دور را شناسایی میکند. بنابراین وقتی تطبیقی میان این دو دیده نمیشود، یک پیغام خطا را به شما نشان خواهد داد.
رونوشت کردن روی نسخهی از ریموت
یکی از دلایلی که سبب میشود تا خطای ذکر شده را ببینید، تغییر در تاریخچهی commit است. فعالیتهایی مانند rebasing میتواند تاریخچهی کامیت را تغییر دهد. زمانی که برنامهنویس بدون اطمینان از همگامی با تاریخچهی نسخهی از راه دور، اقدام به چنین کاری میکند، گیت اختلاف را شناسایی کرده و آن را در قالب یک خطا، نشان میدهد.
پیشنهاد مطالعه: Git checkout چیست؟ آموزشی جامع
رفع خطاها در گیت
مواجه شدن با خطاها بسیار ناراحت کننده است. به خصوص زمانی که سرگرم کارهای پروژه هستید و تمام سعیتان ارسال به موقع کدها به دیگر اعضای تیم باشد، بروز خطا میتواند کلافه کننده باشد.
برای توسعهدهندگانی که با گیت کار میکنند، این خطاها غیر قابل اجتناب است. پس باید این مشکلات را شناخته و راه رفع خطاها در گیت را بلد باشید. در این صورت، شما میتوانید موانع را به راحتی و در کمترین زمان ممکن شناسایی کرده و برطرف نمایید.
برای رفع خطاها در گیت، بهترین راه این است که مستندات رسمی گیت را مطالعه کنید. بهتر است در اینباره همیشه آپدیت و بهروز باشید. در ادامهی این مطلب، راهحلهایی را برای حل خطای «Updates were rejected because the tip of your current branch is behind» در گیت پیشنهاد کردهایم.
رویکردهای ایمن
مطمئناً در هنگام مواجه با یک خطا، تمام تمرکز و تلاشتان بر این موضوع است که فوراً آن را برطرف کنید. اما باید حواستان باشد تا روشهایی را امتحان کنید که امنیت و سلامت ریپازیتوری (مخزن) را به خطر نمیاندازد.
استفاده از دستور git pull
اصلیترین راه رفع خطای مذکور، استفاده از دستور git pull به شرح زیر است.
git pull origin branch-name
حال ببینیم که این دستور دقیقاً چه کاری را انجام میدهد. این دستور تغییرات جدید را از شاخهی ریموت با شاخهی محلی شما ادغام میکند. پس در نتیجهی این دستور، شما به آخرین نسخه از تغییرات برنامه دسترسی خواهید داشت.
توجه داشته باشید که دستور git pull هم میتواند سبب تداخلهای ادغام شود. به این صورت که تغییراتی که در شاخهی ریموت برنامه وجود دارند با تغییرات نسخهی محلی و local تداخل داشته باشند. در این صورت باید تداخل ادغام را حل کنید. برای حل این موضوع از دستورالعمل زیر استفاده کنید.
- فایلهایی که با هم تداخل دارند را باز کنید. اگر به مشکل تداخل ادغام بخورید، خودِ گیت این مناطق تداخلی را تعیین میکند.
- فایلها را ویرایش کنید تا تفاوتها از میان برود و یا با هم سازگار باشد.
- تغییرات را با استفاده از دستور git add filename استیج کنید.
- تغییرات را با استفاده از دستور git commi ثبت و سپس push کنید.
استفاده از دستور git pull –rebase
روش دیگری که برای رفع خطا وجود دارد، استفاده از دستور git pull –rebase است. به این صورت که مینویسیم:
git pull –rebase origin branch-name
این دستور منجر میشود تا در زمان کامیت کردن شاخهی محلی به شاخهی از راه دور، شما آن را در بالای شاخهی ریموت قرار دهید. ممکن است تا در صورتی که تغییراتی که بهصورت محلی در پروژه اعمال کردهاید با تغییرات نسخهی ریموت همپوشانی داشته باشد. در این شرایط، در حین rebase کردن، شما با تداخلهایی مواجه شوید.
برای حل تداخلهای rebase کردن از دستورالعمل زیر استفاده کنید.
- فایلهایی که مشکل تداخل دارند را باز کنید.
- فایلها را ویرایش کنید.
- تغییرات را با استفاده از دستور git add filename استیج کنید.
- rebase کردن را با استفاده از دستور git rebase –continue انجام دهید.
رویکردهای جایگزین
در بخش قبل، دو روش ایمن را برای رفع خطای «Updates were rejected because the tip of your current branch is behind» در گیت نشان دادیم. توجه داشته باشید که روشهای دیگری نیز برای رفع خطاها در گیت وجود دارد. اما این روشها سطوح مختلفی از خطر را شامل میشوند. به عبارت بهتر، چندان ایمن نیستند. در ادامه، این روشها را بررسی خواهیم کرد.
استفاده از دستور git fetch بعد از git merge
بهجای اینکه از دستور push برای اعمال تغییرات استفاده کنید، میتوانید در ابتدا آنها را بازیابی یا fetch کنید. بدین صورت که مینویسید:
git fetch origin
این دستور، آخرین بهروزرسانیهای انجام شده در شاخهی ریموت را بازیابی میکند. اما با این دستور ادغام با کدهای لوکال بلافاصله و بهصورت خودکار آغاز نخواهد شد. پس شما باید دستور مجزایی برای ادغام تغییرات بازیابی شده با نسخهی محلی خود بنویسید.
git merge origin/branch-name
استفاده از push اجباری (هشدار!)
استفاده از push اجباری یک اقدام قاطعانه است که میتوانید برای رفع خطای بیان شده، انجام دهید.
git push origin branch-name –force
این دستور بازیابی ریموت را با تغییرات نسخهی محلی و لوکال، بهروز میکند. البته این کار عواقبی هم دارد. چراکه ممکن است تغییراتی که در نسخهی از راه دور و ریموت پروژه قرار دارد را کنار بگذارد. در یک کار تیمی، این امر به منزلهی کنار گذاشتن تغییراتی است که دیگر اعضای تیم روی پروژه ایجاد کردهاند. توصیه میکنیم از این دستور تنها در شرایطی استفاده کنید که با دیگر اعضای تیم ارتباط گرفته و مطمئن هستید که نتیجهی صحیح را در پی خواهد داشت.
بهترین روش برای رفع خطاها در گیت
در اینجا، بهترین کاری که در مواجه با خطاهای مختلف گیت میتوان انجام داد را بیان کردهایم.
- مطمئن باشید آخرین تغییرات را از نسخهی ریموت دریافت کردهاید.
- در کارهای گروهی و تیمی، حتماً با دیگر اعضای گروه ارتباط داشته باشید.
- تا جایی که امکان دارد از دستوراتی مانند push force استفاده نکنید. مگر در مواقعی که چارهای نداشته و به پیامدهای آن مطمئن هستید.
پیشنهاد مطالعه: آموزش گیت هاب دسکتاپ – بررسی قابلیتها و کاربردهای این نسخه
پیشگیری از بروز خطا در آینده
هیچکس از مواجه با خطا، لذت نمیبرد. بنابراین در این بخش تصمیم گرفتهایم را راهکارهایی را نشانتان دهیم که امکان بروز چنین مشکلاتی در گیت را به حداقل میرساند.
تنظیم گیت برای rebasing
بهطور پیش فرض گیت برای ادغام و merge کردن تنظیم شده است. شما میتوانید این تنظیمات را برای pull کردن در هنگام rebasing تغییر دهید.
git config –global pull.rebase true
استفاده از ابزارهای GUI در گیت
ابزارهایی مانند source tree، git kraken، و یا GitHub desktop برای تصویرسازی شاخهها و ادغامها در گیت کاربرد دارند. استفاده از این ابزارها سبب میشود تا درک صحیحتری از وضعیت مخزن داشته باشید.
بازیابی منظم آپدیتهای اعمال شده
اگر همیشه از آخرین تغییرات اعمال شده، استفاده کنید و آخرین پایگاه داده را به کار ببرید، به احتمال کمتری با خطا مواجه خواهید شد.
کار در شاخههای feature
شما میتوانید بهجای آنکه به طور مستقیم روی شاخهی اصلی پروژه فعالیت داشته باشید، یک شاخهی فرعی ایجاد کرده و تغییرات را روی آن اعمال کنید. اینطور با احتمال کمتری با خطاها در هنگام ادغام فایلها مواجه خواهید شد.
نتیجهگیری
یکی از مهمترین موضوعاتی که در خصوص کار با git باید یاد داشته باشید، درک خطاها و مدیریت آن برای رفع خطاها در گیت است. در این مطلب در خصوص یکی از خطاهای رایج و مهم گیت صحبت کردیم. ابتدا دلایل بروز این خطا را عنوان کرده و سپس راهکارهایی را برای حل این مشکل بیان کردیم.
از آنجایی که پیشگیری همیشه بهتر از درمان است، شما میتوانید از روشهای عنوان شده در این مطلب برای پیشگیری از بروز خطاها در آینده استفاده کنید. ناگفته نماند که استفاده از تکنیکهای بهترین راه رفع خطا در گیت در این زمینه بسیار کمککننده خواهد بود.
آموزش گیت در مکتب خونه
اگر به دنبال منابع آموزشی گیت هستید، میتوانید از دورههای آموزش گیت و آموزش برنامه نویسی متنوع مکتب خونه استفاده کنید. در این دورهها از صفر تا صد کار با گیت ، نکات و ترفندها، رفع خطاها در گیت و غیره را میآموزید و قادر خواهید بود تا با استفاده از این ابزار قدرتمند، پروژههای خود را مدیریت کرده و پیش ببرید. شما میتوانید در مکتب خونه مقالات آموزشی مرتبط با گیت را نیز دنبال کنید. در این مقالات، مهمترین نکات و سرفصلهای آموزشی گیت پوششدهی شده است.