Rebase

git rebase הוא דרך אלטרנטיבית לשלב שינויים בין branches. בניגוד ל-merge שיוצר merge commit, rebase "משכתב" את ההיסטוריה כך שתהיה לינארית ונקייה.

מה rebase עושה?

באופן עקרוני, rebase אומר: "קח את ה-commits של ה-branch הזה, ושים אותם מעל branch אחר".

לפני rebase:
main:     A───B───C───F───G
                   \
feature:            D───E

אחרי git rebase main (כשאתה ב-feature):
main:     A───B───C───F───G
                           \
feature:                    D'───E'

ה-commits D ו-E קיבלו hash חדש (D' ו-E') כי ההורה שלהם השתנה. ההיסטוריה עכשיו לינארית.

מתי להשתמש?

✅ rebase מתאים כש:

  • ה-branch הוא שלכם בלבד ולא נדחף לשרת או לא משותף
  • אתם רוצים היסטוריה לינארית נקייה לפני merge ל-main
  • אתם רוצים לאחד / לערוך commits לפני PR

❌ rebase לא מתאים כש:

  • ה-branch כבר משותף עם מפתחים אחרים
  • ה-commits כבר נדחפו ל-shared branch
  • אתם לא בטוחים מה אתם עושים

🚫 כלל הזהב של rebase: לעולם אל תעשו rebase על branches משותפים שכבר נדחפו לשרת.

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

git rebase main              # rebase על main
git rebase --continue        # המשך אחרי פתרון קונפליקט
git rebase --abort           # ביטול ה-rebase
git rebase --skip            # דילוג על commit בעייתי

דוגמת זרימה: rebase פשוט

# אתה ב-feature/login שמבוסס על main מלפני שבוע
git switch feature/login
git fetch origin

# rebase על המצב העדכני של main
git rebase origin/main

# אם יש קונפליקטים - פותרים אותם, מסמנים ב-add
git add resolved-file.js
git rebase --continue

# בסוף - דחיפה (force-with-lease, כי שינית היסטוריה)
git push --force-with-lease

Interactive rebase

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

git rebase -i HEAD~5      # 5 commits אחרונים
git rebase -i main        # כל ה-commits מאז שהתפצלת מ-main

git יפתח עורך עם רשימת ה-commits:

pick a3f5c2d Add login form
pick b8e7f1a Add validation
pick c9d2e3b Fix typo
pick d1f4a5b Add logout
pick e2g5b6c Fix typo again

לכל commit אפשר להחליף את pick באחת מהפעולות:

פעולה משמעות
pick (p) להשתמש ב-commit כמו שהוא
reword (r) לערוך את ההודעה
edit (e) לעצור ולערוך את הקוד
squash (s) לאחד עם ה-commit הקודם
fixup (f) כמו squash, אבל בלי לערוך הודעה
drop (d) למחוק את ה-commit
reorder מספיק להזיז שורה

דוגמה: איחוד שני commits ל-1

pick a3f5c2d Add login form
fixup b8e7f1a Add validation     ← מאוחד עם הקודם
fixup c9d2e3b Fix typo            ← מאוחד עם הקודם
pick d1f4a5b Add logout
fixup e2g5b6c Fix typo again      ← מאוחד עם הקודם

אחרי שמירה - יישארו רק 2 commits נקיים.

rebase מול merge

merge rebase
יוצר merge commit ✅ ❌
משנה היסטוריה ❌ ✅
היסטוריה לינארית ❌ ✅
בטוח לbranches משותפים ✅ ❌
משמר את "מתי באמת קרה כל commit" ✅ ❌

הבעיה של force push אחרי rebase

אחרי rebase, ה-commits המקומיים שלכם לא מסתנכרנים עם השרת (כי הם קיבלו hash חדש). אתם צריכים force push:

git push --force-with-lease

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

דוגמה: rebase לפני PR

# 1. סיימת לעבוד על feature
git switch feature/dashboard
git status

# 2. רואים את ה-commits ב-branch
git log --oneline main..HEAD
# a3f5c2d Add dashboard
# b8e7f1a fix
# c9d2e3b WIP
# d1f4a5b WIP
# e2g5b6c Add dashboard charts

# 3. interactive rebase לאיחוד
git rebase -i main

# בעורך: מאחדים את ה-WIP commits ל-commit אחד נקי

# 4. דחיפה
git push --force-with-lease

בדקו את עצמכם

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

  1. מה הכלל החשוב של rebase?

    1. לא לעשות rebase לענף משותף שכבר נדחף
    2. תמיד להשתמש בו
    3. רק ב-main
    4. רק עם --force
    הצגת התשובה

    תשובה א. rebase כותב מחדש commits, ומי שעובד על הענף יקבל היסטוריה שלא מתאימה.

  2. מה היתרון של rebase על merge?

    1. הוא לא משנה כלום
    2. הוא מהיר יותר בשרת
    3. היסטוריה לינארית ונקייה, בלי commits של מיזוג
    4. הוא בטוח יותר
    הצגת התשובה

    תשובה ג. מתאים לענף אישי לפני שפותחים PR.