Fetching
در تصویرِ زیر، در سمتِ چپ Local Repository رو داریم و در سمتِ راست Remote Repository رو. چیزی که باید در نظر داشته باشیم اینه که Local Repo ما به Remote Repo وصل نیست. به همین خاطر اگه در Remote Repo کامیتِ جدیدی اضافه بشه Local Repo از وجودِ چنین کامیتی خبردار نخواهد شد.
ابنجاست که باید از دستورِ git fetch
استفاده کنیم تا این کامیتِ جدید رو دانلود کنیم. پس از اینکه گیت این کامیت رو دانلود کرد اشارهگر Origin/Master رو جلو میبره تا به این کامیتِ جدید اشاره کنه. همانطور که قبلاً هم گفته شد این اشارهگر remote tracking branch هستش و برامون مشخص میکنه که master branch در origin به کجا اشاره میکنه. در این مثال به کامیتِ B اشاره میکنه.
با وجود اینکه این کامیت رو دانلود کردیم Working Directoryمون آپدیت نشده. چون Master به A اشاره داره و به B. در واقع داره به کامیتِ قبلی هنوز اشاره میکنه. به همین خاطر هنوز اون تغییرات جدید رو در Work Directoryمون نداریم. چطور این تغییراتِ جدید رو به Working Directoryمون بیاریم؟
دو تا branch داریم و اهمیتی هم نداره که یکی از این دو، remote tracking branch هستش. برای اینکه این تغییرات جدید رو به Master branch بیاریم باید اون یکی branch رو با master ادغام (merge) کنیم. پس، به master branch سوئیچ میکنیم و سپس از دستورِ git merge origin/master
استفاده میکنیم.
در این مثال، مسیرِ هر دو branch یکی هستش و از هم جدا نیستند و از origin/master مسیرِ خطیِ مستقیمی رو به master داریم. به همین خاطر از fast forward merge استفاده میکنیم. از طرفی اگه branchهامون مسیرشون از هم جدا باشه امکانِ وجودِ تداخل و conflict هست. که در این صورت، درست مثلِ سابق مجبوریم این تداخلها رو رفع کنیم.
برای اینکه سناریویِ بالا رو در عمل هم اجرا کنیم، ابتدا در گیتهاب (که central repoمون درش هست) فایل جدیدی رو Create یا Upload و یا همون فایلِ Readme رو ویرایش میکنیم و این تغییر رو با پیامِ Update README.md کامیت میکنیم.
حالا برمیگردیم به ترمینال و local repositoryمون. git log میکنیم که نشون میده فقط یک کامیت در local repoمون هست.
fb3b343 (HEAD -> master, origin/master, origin/HEAD) Initial commit
برای دانلود کامیتِ جدیدی که در central repoمون هست از دستورِ git fetch
استفاده میکنیم. البته میتونیم remote رو هم مشخص کنیم و دستور رو بصورتِ زیر بنویسیم.
git fetch origin
همچنین میتونیم branch رو هم مشخص کنیم.
git fetch origin branch
اگه در دستورِ fetch کامیت رو مشخص نکنیم تمامیِ کامیتهایِ موجود در remote repository دانلود خواهد شد. اگه origin رو هم ننویسیم گیت بصورتِ پیشفرض از origin کامیتها رو دانلود خواهد کرد. پس میتونیم همون git remote
رو بنویسیم.
حالا اگه git log
کنیم خروجیمون بصورتِ زیر خواهد بود.
* 012ff85 (origin/master, origin/HEAD) Update README.md
* fb3b343 (HEAD -> master) Initial commit
با توجه به خروجیِ بالا، remote tracking branch بالاترین کامیت هستش ولی این کامیت داخلِ master branchمون نیست و master یک کامیت قبلتر قرار گرفته.
دستورِ مفید دیگری هست که میتونیم در این شرایط استفاده کنیم.
> git branch -vv
master fb3b343 [origin/master: behind 1] Initial commit
دستورِ بالا نشون میده که چطور local branch و remote tracking branch از هم جدا شدن (diverge شدن). با توجه به خروجیِ بالا، master branch به origin/master branch لینک شده و یه کامیت قبلتر هست.
حالا باید merge کنیم. در حال حاضر در master branch هستیم. پس دستورِ زیر رو مینویسیم.
git merge origin/master
با توجه به اینکه branchها در این مثال diverge نشدن و از هم جدا نیستن و با یه مسیرِ خطیِ مستقیم از target branch تا master branch طرف هستیم از Fast-forward merge استفاده میکنیم.
حالا که merge رو انجام دادیم بار دیگه log رو نگاه کنیم.
* 012ff85 (HEAD -> master, origin/master, origin/HEAD) Update README.md
* fb3b343 Initial commit
حالا خروجیِ دستورِ git branch -vv
بصورت زیر خواهد بود و دیگه خبری از behind 1 نیست.
master 012ff85 [origin/master] Update README.md
میتونیم محتوایِ فایلِ [README.md](http://README.md)
رو هم بصورتِ زیر ببینیم.
cat README.md
حالا تغییری که در گیتهاب اضافه کرده بودیم در Working Directoryمون هست.