ענפים (Branches)

מהו branch?

Branch הוא מצביע ל-commit מסוים. כשמוסיפים commit חדש - ה-branch מתקדם איתו אוטומטית. branches הם הלב של git: הם מאפשרים לכם לעבוד על מספר פיצ'רים במקביל בלי שאחד יפריע לשני.

ה-branch הראשי

כשיוצרים מאגר חדש, נוצר אוטומטית branch ראשי. בעבר נקרא master, היום נקרא main. זהו ה-branch שמייצג את הקוד היציב.

git config --global init.defaultBranch main

פקודות בסיסיות

צפייה ב-branches

git branch                  # רשימת branches מקומיים
git branch -a               # כל ה-branches כולל remote
git branch -r               # רק remote branches
git branch -v               # עם ה-commit האחרון של כל branch

ה-branch הנוכחי מסומן בכוכבית *.

יצירת branch

git branch feature/login           # יצירה בלי מעבר
git branch feature/login HEAD~3    # יצירה מ-commit ספציפי

מעבר ל-branch

git checkout feature/login         # תחביר ישן
git switch feature/login           # תחביר חדש (מומלץ)

יצירה + מעבר בו-זמנית

git checkout -b feature/login      # תחביר ישן
git switch -c feature/login        # תחביר חדש

מחיקה

git branch -d feature/login        # מחיקה בטוחה (רק אם הקוד מוזג)
git branch -D feature/login        # מחיקה כפויה

שינוי שם

git branch -m old-name new-name           # branch אחר
git branch -m new-name                    # ה-branch הנוכחי

checkout מול switch

git switch נוסף ב-Git 2.23 (2019) כדי להפריד בין שני שימושים שונים של checkout:

פקודה תפקיד
git switch מעבר בין branches
git restore שחזור קבצים
git checkout עושה את שניהם (תחביר ישן, עדיין נתמך)

דוגמת זרימה - פיצ'ר חדש

# 1. עוברים ל-main ומסנכרנים
git switch main
git pull

# 2. יוצרים branch חדש לפיצ'ר
git switch -c feature/user-profile

# 3. עובדים ועושים commits
# ...עריכות...
git add .
git commit -m "Add user profile component"

# ...עוד עריכות...
git add .
git commit -m "Add avatar upload to user profile"

# 4. דוחפים לשרת
git push -u origin feature/user-profile

# 5. אחרי שה-PR התקבל ומוזג, מנקים
git switch main
git pull
git branch -d feature/user-profile

מודל מנטלי

חשבו על branches ככבישים מקבילים. ה-main הוא הכביש הראשי. כשמתחילים לעבוד על פיצ'ר חדש, יוצרים יציאה הצידה - branch חדש - שמתחיל מאותה נקודה. עובדים עליו, מוסיפים commits, ובסוף "חוזרים" ל-main דרך merge.

main:     A───B───C─────────────M
                   \           /
feature:            D───E───F

ב-A, B, C ו-M ה-main התקדם. ה-feature התחיל מ-C (יציאה), הוסיף D, E ו-F, ובסוף התמזג ב-M.

מינוח קונבנציונלי

  • feature/login - פיצ'ר חדש
  • bugfix/header-alignment - תיקון באג
  • hotfix/critical-security-issue - תיקון דחוף ב-production
  • release/v2.0 - הכנה לשחרור גרסה
  • experiment/new-architecture - ניסוי

סיכום

  • branches זולים ב-git - אל תהססו ליצור אותם
  • branch אחד = פיצ'ר אחד = PR אחד
  • מוחקים branches שהושלמו - השאירו את הרשימה נקייה

בדקו את עצמכם

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

  1. איך יוצרים ענף חדש ועוברים אליו?

    1. git switch -c name
    2. git new name
    3. git branch -d name
    4. git merge name
    הצגת התשובה

    תשובה א. switch -c יוצר ועובר בפקודה אחת.

  2. למה לעבוד בענפים?

    1. כדי להסתיר קוד
    2. לפתח פיצ'ר בנפרד בלי לשבור את main
    3. כדי לחסוך מקום
    4. חובה
    הצגת התשובה

    תשובה ב. כשהפיצ'ר מוכן ממזגים אותו.