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
בדקו את עצמכם
נסו לענות לבד לפני שאתם פותחים את התשובה.
-
מה ההבדל בין
fetchל-pull?הצגת התשובה
תשובה א. fetch בטוח: מסתכלים מה חדש לפני שמשלבים.
-
למה לא לעשות
push --forceל-main?הצגת התשובה
תשובה א. אם חייבים, --force-with-lease על ענף אישי בלבד.