البداية · فصل ٣

الـ remote: fetch و pull و push

origin · origin/main · fetch · pull · push · upstream
🎯 الهدف: تفهم الفرق بين النسخة اللي عندك والنسخة اللي على GitHub، وإيه اللي بيحصل في fetch و pull.

الـ repo اللي على جهازك repo كامل لوحده، فيه التاريخ كله. GitHub مجرد repo تاني، بنسميه remote، واسمه غالبًا origin.

Git مش بيكلم GitHub غير لما إنت تقوله. أي حاجة غير fetch و pull و push بتحصل على جهازك بس.

origin/main مش main

عندك نوعين branches:

  • main: الـ branch بتاعك إنت، بتعمل عليه commits.
  • origin/main: صورة من main اللي على GitHub، من آخر مرة كلّمت فيها GitHub. مبتتحدثش لوحدها.

عشان كده git status ممكن يقولك “Your branch is up to date with origin/main” وفي الحقيقة فيه commits جديدة على GitHub. هو بيقارن بآخر صورة عنده.

fetch و pull و push

git fetch

بيجيب الجديد من GitHub ويحدّث origin/main. مش بيلمس الـ branch بتاعك ولا ملفاتك. آمن تعمله في أي وقت.

git pull

fetch وبعدها على طول دمج origin/main في الـ branch بتاعك. الدمج ده يا merge يا rebase، حسب الإعدادات (فصل ٤).

git push العكس: بيبعت الـ commits بتاعتك لـ GitHub ويحرّك الـ branch اللي هناك.

git fetch                    # شوف إيه الجديد من غير ما تلمس حاجةgit log main..origin/main    # الـ commits اللي على GitHub ومش عندكgit pull                     # هات الجديد وادمجهgit push                     # ابعت شغلك

الـ upstream

أول مرة ترفع branch جديد:

git push -u origin feature/cart

الـ -u بيربط الـ branch بتاعك بالـ branch اللي على GitHub. بعد كده git push و git pull لوحدهم بيعرفوا يروحوا فين، و git status بيقولك إنت قدامه ولا وراه بكام commit.

الـ push اترفض؟

لو حد رفع commits قبلك، GitHub هيرفض الـ push بتاعك، لأن الـ commits بتاعته مش موجودة عندك، والـ push كان هيمسحها.

! [rejected]   main -> main (fetch first)

الحل إنك تجيب شغله الأول وتدمجه، وبعدين ترفع:

git pullgit push

خلّصت الفصل لما

🧠 اختبر نفسك
١) git status بيقول up to date. يبقى مفيش جديد على GitHub؟
مش شرط. هو بيقارن بـ origin/main من آخر fetch. اعمل git fetch الأول.
٢) إيه الفرق بين fetch و pull؟
fetch بيجيب الجديد بس. pull بيجيب ويدمج في الـ branch بتاعك.
٣) الـ push اترفض عشان فيه commits جديدة على GitHub. تعمل إيه؟
pull عشان تجيبهم وتدمجهم، وبعدين push. مش —force.