push, pull, fetch

שלוש הפקודות שמסנכרנות בין המאגר המקומי שלכם לבין המאגר המרוחק.

git fetch - הורדה ללא מיזוג

fetch מוריד שינויים מהשרת אבל לא ממזג אותם לקוד שלכם. הוא מעדכן רק את ה-remote branches המקומיים (origin/main למשל), בלי לגעת ב-branches המקומיים שלכם.

git fetch                   # מ-origin (ברירת מחדל)
git fetch origin            # אותו דבר במפורש
git fetch upstream          # מ-remote ספציפי
git fetch --all             # מכל ה-remotes
git fetch --prune           # מנקה גם branches שנמחקו בשרת

מתי להשתמש?

  • כשרוצים לבדוק אם יש עדכונים בלי לסכן את העבודה הנוכחית
  • לפני git merge או git rebase ידני

git pull - fetch + merge

pull הוא בעצם fetch + merge בפעולה אחת. הוא מוריד שינויים מהשרת וממזג אותם מיד לתוך ה-branch המקומי שלכם.

git pull                          # מה-tracking branch
git pull origin main              # מ-branch ספציפי
git pull --rebase                 # fetch + rebase במקום merge
git pull --ff-only                # רק אם אפשר fast-forward

pull עם rebase

git pull --rebase

הופך את ההיסטוריה לנקייה יותר. במקום ליצור merge commit, הוא לוקח את ה-commits המקומיים שלכם ומיישר אותם מעל ה-commits החדשים מהשרת.

אפשר להפוך את זה להגדרה דיפולטיבית:

git config --global pull.rebase true

git push - שליחה לשרת

push שולח את ה-commits המקומיים שלכם לשרת המרוחק.

git push                          # ל-tracking branch
git push origin main              # מפורש: לאן ולאיזה branch
git push -u origin feature/login  # קביעת tracking + push (פעם ראשונה)
git push --all                    # כל ה-branches המקומיים
git push --tags                   # כל ה-tags
git push origin --delete feature/login   # מחיקת branch מרוחק

-u (set-upstream)

בפעם הראשונה שאתם דוחפים branch חדש לשרת:

git push -u origin feature/login

הדגל -u (קיצור של --set-upstream) קובע שמעכשיו ה-branch המקומי feature/login עוקב אחרי origin/feature/login. בפעמים הבאות מספיק git push בלי פרמטרים.

push מסוכן: --force

git push --force          # מסוכן! דורס היסטוריה בשרת
git push -f               # אותו דבר, קצר יותר
git push --force-with-lease   # בטוח יותר

--force דורס את ההיסטוריה בשרת בלי בדיקות. אם מישהו אחר דחף בינתיים - העבודה שלו תאבדו.

--force-with-lease בודק קודם שמה שיש בשרת זה מה שאתם מצפים. אם מישהו אחר דחף - הפקודה נכשלת ולא עושה נזק.

🚫 כלל ברזל: לעולם אל תעשו --force ל-main או ל-branches משותפים.

ההבדל בין fetch ל-pull

fetch pull
מוריד שינויים מהשרת ✅ ✅
משנה remote branches מקומיים ✅ ✅
משנה את ה-branch המקומי שלכם ❌ ✅
בטוח לחלוטין ✅ יכול לגרום לקונפליקטים

דוגמת זרימה יומית

# בוקר - מסנכרנים את main
git switch main
git pull

# יוצרים branch לפיצ'ר
git switch -c feature/dashboard

# עובדים, עושים commits
git add .
git commit -m "Add dashboard skeleton"
git add .
git commit -m "Wire dashboard data fetching"

# דוחפים לראשונה
git push -u origin feature/dashboard

# ממשיכים לעבוד...
git add .
git commit -m "Add dashboard charts"

# דחיפה רגילה
git push

# בסוף היום - בודקים אם יש שינויים ב-main
git fetch
git log main..origin/main    # מה חדש ב-main?

טעויות נפוצות

"fatal: The current branch has no upstream"

קרה בעת git push בלי -u ב-branch חדש. הפתרון:

git push -u origin <branch-name>

"Updates were rejected because the remote contains work that you do not have"

מישהו אחר דחף בינתיים. הפתרון:

git pull --rebase
git push

בדקו את עצמכם

נסו לענות לבד לפני שאתם פותחים את התשובה.

  1. מה ההבדל בין fetch ל-pull?

    1. fetch מוריד בלי למזג, pull מוריד וממזג
    2. אין הבדל
    3. fetch שולח
    4. pull לא מוריד
    הצגת התשובה

    תשובה א. fetch בטוח: מסתכלים מה חדש לפני שמשלבים.

  2. למה לא לעשות push --force ל-main?

    1. הוא דורס היסטוריה שאחרים כבר מבוססים עליה
    2. הוא מוחק את המאגר
    3. הוא לא עובד
    4. הוא איטי
    הצגת התשובה

    תשובה א. אם חייבים, --force-with-lease על ענף אישי בלבד.