ابتدا یه historyمون نگاهی بندازیم.

* f1f1c6f (HEAD -> master) Merge branch 'bugfix/login-form' into master
|\
| * b4697d1 (bugfix/login-form) Update toc.txt
|/
* f882c5c (bugfix/signup-form) Fix the bug that prevented the users from signing up.
...

برای پیاده‌سازیِ feature جدید یه branch جدیدی رو می‌سازیم.

git switch -C feature/change-password

دوباره به historyمون نگاهی بندازیم.

* f1f1c6f (HEAD -> feature/change-password, master) Merge branch 'bugfix/login-form' into master
|\
| * b4697d1 (bugfix/login-form) Update toc.txt
|/
* f882c5c (bugfix/signup-form) Fix the bug that prevented the users from signing up.
...

حالا هر دویِ feature/change-password و master به کامیتِ یکسانی اشاره می‌کنند. حالا می‌خواهیم تجربه کنیم که چطور دو branch از هم مسیرشون از هم جدا می‌شه.

حالا که در feature/change-password هستیم درش یه کامیتی رو ثبت می‌کنیم.

echo hello > change-password.txt
git add .
git commit -m "Build the change password form."

حالا دوباره به historyمون نگاهی بندازیم.


* 03f30a6 (HEAD -> feature/change-password) Build the change password form.
* f1f1c6f (master) Merge branch 'bugfix/login-form' into master
|\
| * b4697d1 (bugfix/login-form) Update toc.txt
|/
* f882c5c (bugfix/signup-form) Fix the bug that prevented the users from signing up.
...

با توجه به خروجیِ بالا، feature/change-password یک کامیت از master branch جلوتر هستش. ولی هنوز مسیرشون از هم جدا نشده چونکه از feature/change-password به master مسیرِ مستقیمی هست. برای اینکه مسیرِ این دو branch رو از هم جدا کنیم به master branch سوئیچ می‌کنیم و درش یه کامیتِ جدیدی رو می‌سازیم.

git commit -m "Update objectives.txt"

حالا هر دو branch کامیتِ جدیدی رو دارن.

* B0bf5c1 (HEAD -> master) Update objectives.txt
| * 03f30a6 (feature/change-password) Build the change password form.
|/
* f1f1c6f Merge branch 'bugfix/login-form' into master
|\
| * b4697d1 (bugfix/login-form) Update toc.txt
|/
* f882c5c (bugfix/signup-form) Fix the bug that prevented the users from signing up.
...

با توجه به خروجیِ بالا feature/change-password branch حالا از مسیر منحرف شده و مسیرِ مستقیمی از این branch به master branch نداریم. اگه از feature/change-password branch شروع کنین نمی‌تونین به master برین.

در این شرایط وقتی تغییرات رو merge می‌کنیم گیت از three-way merge استفاده می‌کنه. اگه به ابتدایِ خطوط در خروجیِ بالا نگاه کنین (ستاره‌ها) متوجهِ والدِ یکسانِ کامیت‌هایِ 03f30a6 و B0bf5c1 خواهید شد. والدِ هردوشون f1f1c6f هستش.

قراره چطوری این تغییرات با هم merge بشن و در یه کامیتِ جدیدی که merge commit هست بصورت ترکیبی قرار بگیرن.

با توجه به اینکه در master branch قرار داریم برای merge کردنِ دستورِ زیر رو می‌نویسیم.

git merge feature/change-password

با اجرایِ دستورِ بالا ادیتور برای نوشتنِ پیامِ کامیت اجرا می‌شه.

اگه به خروجیِ کد بالا نگاه کنین در اینجا دیگه از fast-forward merge استفاده نشده.

بار دیگه به historyمون نگاهی بندازیم.

* f4a72b2 (HEAD -> master) Merge branch 'feature/change—password' into master
|\
| * 03f30a6 (feature/change-password) Build the change password form.
* | B0bf5c1 Update objectives.txt
|/
* f1f1c6f Merge branch 'bugfix/login-form' into master
|\
| * b4697d1 (bugfix/login-form) Update toc.txt
|/
* f882c5c (bugfix/signup-form) Fix the bug that prevented the users from signing up.
...

با توجه به خروجیِ بالا،‌ feature/change-password branch به کامیتِ 03f30a6 اشاره داره master branch هم به B0bf5c1 اشاره داشت. این دو تا با هم ترکیب شدن و کامیتِ جدیدِ f4a72b2 بوجود اومده.