Pushing
در بخشِ قبلی، تغییراتی رو که انجام دادیم رو میخواهیم به origin نیز بفرستیم. به همین خاطر از دستورِ push
استفاده میکنیم.
وقتی که این دستور رو اجرا میکنیم گیت کامیتِ جدیدمون رو به remote repository میفرسته، سپس اشارهگر master رو به جلو میبره تا به کامیتِ C اشاره کنه و در نهایت، Origin/Master نیز به همین کامیت اشاره میکنه.
حالا سناریویِ بالا رو در عمل ببینیم؛ تو ترمینال دستورِ git push
و سپس repoمون رو براش مشخص میکنیم و در نهایت branchای رو که میخواهیم push کنیم رو براش مشخص میکنیم.
git push origin master
با توجه به اینکه الان در master branch هستیم میتونیم از نوشتنِ master صرفنظر کنیم و همچنین با توجه به اینکه گیت بصورتِ پیشفرض origin رو بعنوانِ remote repo در نظر میگیره از نوشتنِ origin نیز صرفنظر میکنیم که در نهایت دستورِ زیر رو خواهیم داشت.
git push
با اجرایِ دستورِ بالا، گیت از ما اطلاعاتِ کاربریِ گیتهاب (GitHub credentials) رو خواهد خواست. در نهایت، گیت کامیتِ جدیدمون رو به origin میفرسته.
برای اینکه مطمئن بشیم میتونیم به تعدادِ کامیتها و آخرین کامیت در گیتهاب نگاه کنیم.
برخی اوقات، pushتون reject میشه. بیایین دلیلش رو بفهمیم.
بار دیگه با توجه به تصویرِ زیر، در local repoمون یه کامیت جلوتر از origin هست. حالا، بیایید فرض کنیم که قبل اینکه push رو انجام بدیم شخصِ دیگری، pushای رو انجام داده و کامیتِ جدیدی رو در origin اضافه کرده. حالا، اگه ما push کنیم pushمون reject خواهد شد. چون history ما بصورتِ متفاوتی توسعه یافته شده.
پس، گیت از بازنویسی (overwriting) رویِ کارِ شخصِ دیگهای توسطِ ما جلوگیری میکنه. گاهاً دیده شده که برخی کاربرا در این شرایط از آپشنِ f—
به منظورِ اجبار به عملِ push استفاده میکنن. و این بدترین کاریه که میتونین انجام بدین. با این کار به گیت دستور میدین که بیخیالِ کارِ شخصِ دیگهای بشه و بجاش کارِ ما رو جایگزینِ اون کنه! و این چیزی نیست که ما میخواهیم. مگر اینکه یه دلیلِ خیلی محکمی برای این کارتون داشته باشین.
پس، هرگز هرگز هرگز از آپشنِ force در این شرایط استفاده نکنین! اساساً زمانی از این آپشن در این شرایط استفاده میکنیم که واقعاً گندی بالا آوردیم.
پس چی کار میتونیم بکنیم؟
خُب از دستورِ pull استفاده میکنیم تا کارِ شخصِ دیگهای رو به local repoمون بیاریم. سپس، merge یا rebase کنیم. اگر هم با conflictای روبرو شدیم اون رو رفع کنیم و بعد از اون میتونیم عملِ push رو انجام بدیم.
یه سوال. کدوم کامیتها در local هست ولی در remote نیست؟ کامیتهایِ C و M در لوکال هست ولی در ریموت نیست. وقتی که push میکنیم گیت کامیتهایِ C و M رو به origin خواهد فرستاد.
حالا وضعیتِ یکسانی رو در هر دو repoمون داریم.