آموزش گیت-بخش چهارم-آموزش Branch در Git

در جلسه قبل درباره دستور Commit در گیت بطور جامع صحبت کردیم. در این مقاله می خواهیم در مورد شاخه یا branch توضیح دهیم. موضوعات بررسی شده در این مقاله: ایجاد شاخه، مقایسه شاخه ها، ادغام شاخه ها، رفع تداخل شاخه ها و…
فهرست موضوعات جلسه چهارم:
- نحوه تعریف برنچ جدید در گیت
- نحوه تغییر نام یک برنچ
- مقایسه برنچ ها در گیت
- مفهوم stash در گیت
- ادغام دو برنچ با یکدیگر
- مشاهده برنچ های ادغام شده با برنچ master
- نحوه حذف branch ها در گیت
- نحوه رفع تداخل branch ها در گیت
- نحوه انصراف از ادغام یا merge
برنچ ها در گیت بسیار کاربردی هستند و عملا گیت بدون branch بی معنا خواهد بود.
مانند جلسه قبل، در این بخش هم می خواهیم روی پروژه Venus کار کنیم. اگر قبلا فایل زیپ این پروژه را دانلود نکرده اید روی این لینک کلیک کنید.
ایجاد branch جدید در گیت:
فرض کنید در پروژه ما یک باگ ایجاد شده و می خواهیم آن را رفع کنیم. به این منظور بهتر است یک شاخه جدید بنام bugfix ایجاد کرده و پروسه رفع خطا را روی آن انجام دهیم.
به منظور ایجاد یگ branch جدید در گیت، کافیست دستور git branch bugfix را اجرا کنیم. سپس برای مشاهده لیست برنچ های ایجاد شده تا الان، دستور git branch را اجرا کنید. در نهایت برای جابجایی به شاخه جدید ایجاد شده، دستور git switch bugfix را اجرا کنید:
تغییر نام branch:
کلمه bugfix بسیار کلی است و ممکن است ده ها باگ در پروژه ما ایجاد شوند و بخواهیم برای هریک از آنها یک برنچ مجزا بسازیم. پس بهتر است نام شاخه یا برنچ ما مشخص و واضح باشد. فرضا می خواهیم خطای بوجود آمده در فرم ثبت نام را رفع کنیم. نام برنچ می تواند bugfix/signup-form باشد.
به منظور تغییر نام branch به bugfix/signup-form کافیست دستور زیر را اجرا کنید:
git branch -m bugfix bugfix/signup-form
سپس برای اعمال تغییراتی در پروژه فایل audience.txt را با VSCode باز کرده و یک خط به فایل متنی اضافه کنید (Insertion)، یک خط را پاک کنید (Deletion) و یک خط را تغییر دهید (Modification).
اکنون اگر git status را اجرا کنیم شاهد تغییراتی در فایل audience خواهیم بود که هنوز به stash اضافه نشده اند. پس با دستورات add و commit اینکار را انجام می دهیم:
حالا اگر دستور git log –oneline را اجرا کنیم خواهیم داشت:
مشاهده می شود که نشانگر HEAD به برنچ bugfix/signup-form اشاره دارد و آخرین کامیت روی این برنچ انجام شده است.
نکته: تغییراتی که در فایل audience انجام دادیم فعلا فقط در شاخه bugfix قابل مشاهده هستند و اگر با دستور switch یا checkout به شاخه master برویم، این تغییرات را نخواهیم دید:
پس از اینکه باگ برنامه را برطرف کردیم می توانیم دو برنچ را با هم ادغام یا merge کنیم. در اینصورت تغییرات در هر دو برنچ قابل مشاهده خواهد بود.
مقایسه branch ها در گیت:
به منظور نمایش commit هایی که فقط در شاخه bugfix قرار دارند و در master نیستند دستور زیر را اجرا کنید:
git log master..bugfix/signup-form
برای اینکه ببینیم چه تغییری در شاخه bugfix رخ داده است و آن را با master مقایسه کنیم، دستور زیر را داریم:
git diff bugfix/signup-form
برای اینکه بفهمیم چه فایل هایی در bugfix branch تغییر کرده اند دستور زیر را داریم:
git diff --name-only bugfix/signup-form
دستور فوق به این معنیست که وقتی برنچ bugfix را با master مرج کنیم، فایل audience.txt آپدیت می شود و تغییرات جدید آن روی شاخه master ثبت می شود.
مفهوم stash در گیت:
سناریوی زیر را در نظر بگیرید:
ما تغییراتی در شاخه master انجام داده ایم، در حالیکه هنوز این تغییرات را commit نکرده ایم می خواهیم به برنچ bugfix سوئیچ کنیم. در اینحالت گیت ارور خواهد داد. مانند زیر:
خطای تصویر می گوید: تغییرات شما هنوز commit یا stash نشده اند و اگر به شاخه دیگر سوئیچ کنید از بین می روند. ما در این مثال می خواهیم از stash استفاده کنیم. stash در واقع یک جای امنی است در repository که می تواند تغییرات ما را بصورت موقت نگه داری کند و مراقب آن باشد. تا زمانی که ما به شاخه دیگر می رویم و برمی گردیم.
برای اضافه کردن تغییرات به stash دستور زیر را داریم:
git stash push -m "add hi esi to audience file"
برای مشاهده لیست stash های موجود دستور git stash list را داریم.
حالا می توانیم با خیال راحت و بدون ارور به برنچ bugfix سوئیچ کنیم و کارهای موردنظر را انجام داده و مجددا به master برگردیم.
پس از اینکه وارد master شدیم، می خواهیم تغییرات stash شده را به فولدر پروژه خود برگردانیم. ابتدا می توان تغییرات داخل stash را با دستور زیر مشاهده کرد:
git stash show 0
نکته: چون ما در حال حاضر فقط کی stash داشتیم و آیدی آن از 0 شروع می شود، برای نمایش آن دستور show 0 را اجرا کردیم.
اکنون نوبت اعمال تغییرات واقع در stash روی پروژه است. دستور زیر را اجرا کنید:
git stash apply 0
پس از اینکه کارمان با stash تمام شد باید آن را حذف کنیم. با دستور زیر:
git stash drop 0
حالا اگر لیست stash ها را با دستور git stash list مشاهده کنیم، می بینیم که stash 0 حذف شده است:
ادغام branch ها در گیت:
برای مرج کردن شاخه ها ابتدا دستور git log –oneline –all را اجرا کنید تا بتوان وضعیت کامیت ها و برنچ ها را دید:
مشاهده می شود که شاخه bugfix یک مرحله جلوتر از master است. پس وقتی می خواهیم master را با bugfix ادغام کنیم بصورت fast-forward مرج می شود. برای ترکیب دو برنچ دستور git merge bugfix/signup-form را اجرا کنید.
در تصویر زیر مشاهده می کنید که هر دو شاخه master و bugfix و نشانگر HEAD به یکجا اشاره می کنند:
نکته: برای اینکه بتوانیم بطور همزمان و در یک لحظه یک برنچ را ایجاد کرد و به آن سوئیچ کرد دستور زیر را داریم:
git switch -C bugfix/login-form
کلید C- باعث می شود که برنچ bugfix/login-form ایجاد شود و به آن سوئیچ کنیم.
مشاهده برنچ های ادغام شده با master:
وقتی یک branch می سازیم و کارهای موردنظر را در آن انجام می دهیم و در نهایت با master ادغام می کنیم، بهتر است آن را حذف کنیم. در برخی موارد شاید فراموش کنیم چه برنچ هایی با master مرج شده اند و کدام برنچ ها مرج نشده اند.
برای مشاهده لیست شاخه هایی که با شاخه master ادغام شده اند دستور زیر را داریم:
git branch --merged
نکته: برای مشاهده برنچ هایی که ادغام نشده اند دستور زیر را داریم:
git branch --no-merged
حذف branch:
برای حذف برنچ های اضافی یا ادغام شده، می توان از دستور زیر استفاده کرد:
git branch -d bugfix/signup-form
برطرف کردن تداخل یا conflict برنچ ها:
تداخل یا conflict شاخه ها در گیت بسیار رایج است و ما باید بتوانیم این تداخل ها را شناسایی و رفع کنیم. تداخل بین شاخه ها در گیت می تواند به دلایل زیر رخ دهد:
- تغییر لاین های یکسانی از فایل در هر دو شاخه
- حذف یک فایل در برنچ اول و تغییر محتوای همان فایل در برنچ دوم
- ایجاد یک فایل با نام یکسان و محتوای متفاوت در دو شاخه
در این موارد گیت نمی داند چطور تداخل را رفع کند و دو برنچ را باهم ادغام کند. برای اینکه تداخل برنچ ها را شبیه سازی کنیم کارهای زیر را لطفا انجام دهید:
یک برنچ جدید بنام bugfix/change-password بسازید و به آن سوئیچ کنید. دستور زیر:
git switch -C bugfix/change-password
سپس با دستور echo یک عبارتی را در فایل change-pass.txt بنویسید. در نهایت add و commit کنید:
حالا به برنچ master سوئیچ کرده و همین فایل را تغییر دهید. اجرای دستور git switch master و سپس دستور code change-pass.txt برای باز کردن این فایل در vscode.
در لاین اول این فایل عبارت تستی مانند sample-text وارد کنید و ذخیره کنید. در نهایت باید آنرا به stage اضافه و commit کنید.
حالا اگر دستور git merge bugfix/change-password را اجرا کنیم، با خطای تداخل یا CONFLICT مواجه می شویم:
برای اینکه وضعیت تداخل را ببینیم، دستور git status را اجرا کنید. خروجی زیر:
در مرحله بعد باید بصورت دستی این تداخل را رفع کنیم. پس دستور code change-pass.txt را اجرا کرده تا فایل در vscode باز شود.
مشاهده می کنید که تداخل بوجود آمده بصورت ویژوال و رنگی قابل مشاهده است. سه آپشن خواهیم داشت:
- Accept current change: پذیرفتن تغییرات جاری (در شاخه master)
- Accept incoming change: پذیرفتن تغییرات جدید (در شاخه bugfix)
- پذیرفتن هر دو تغییر (در دو شاخه bugfix و master)
البته روش چهارمی هم وجود دارد که می توان بصورت دستی علامت های >>>> HEAD و >>> bugfix را حذف کرد و محتوای فایل change-pass را بصورت دستی تعریف کرد.
نکته: توصیه می کنیم تغییر جدیدی به غیر از تغییرات فوق در این فایل ایجاد نکنید/
به منظور ادغام برنچ های گیت در یک محیط کاربرپسند و گرافیکی می توان از ابزارهای زیر استفاده کرد: P4Merge و Kdiff و WinMerge
انصراف از ادغام (merge):
فرض کنید ادغام دو برنچ موردنظر ما با CONFILCT همراه شده است و ما فعلا وقت نداریم تداخل را برطرف کنیم و می خواهیم آن را به آینده موکول کنیم. برای اینکه بتوان از ادغام صرف نظر کرد دستور git merge –abort را اجرا کنید.
نمایش branch ها در نرم افزار vscode:
همانطور که قبلا عرض کردیم، افزونه Gitlens برای کار با گیت در ویژوال استودیو می باشد. پس از نصب این افزونه، در منوی سمت چپ روی آیکون gitlens کلیک کنید و در بخش BRANCHES می توانید لیست برنچ های موجود را ملاحظه کنید:
برای ایجاد یک شاخه جدید توسط گیت لنز، روی master راست کلیک کرده و create branch را بزنید. مطابق شکل زیر:
یک نام برای آن تعریف کنید بنام: feature/reset-password
در مرحله بعد یک باکس باز می شود و می پرسد آیا می خواهید برنچ را فقط create کنید یا می خواهید همزمان به آن سوئیچ کنید؟
گزینه دوم را در این مثال انتخاب می کنیم. در ادامه فایل toc.txt را باز کرده و یک خط به صورت زیر به آن اضافه کنید و save کنید:
سپس در تب source control مانند تصویر زیر ابتدا روی دکمه + کلیک کرده (تا وارد stage شود) و سپس یک پیغام دلخواه تعریف کرده و روی علامت تیک کلیک کنید تا تغییرات ما کامیت شود:
اکنون وارد Gitlens شده و برنچ feature/reset-password را پیدا کنید:
برای ثبت تغییرات در stash مطابق شکل زیر به منوی STASHES رفته و علامت + را بزنید (stash all changes):
می توان روی stash های دلخواه یکی از عملیات apply یا pop یا delete را انجام داد.
در مقاله بعد نحوه کار با سایت Github را بطور کاربردی و جامع آموزش می دهیم. همراه ما باشید…!
2 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
بسیار عالی و جامع
ممنون از شما
سلام مهدیار جان. ممنون از نظر لطفتون.