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
בדקו את עצמכם
נסו לענות לבד לפני שאתם פותחים את התשובה.
-
מה הכלל החשוב של rebase?
הצגת התשובה
תשובה א. rebase כותב מחדש commits, ומי שעובד על הענף יקבל היסטוריה שלא מתאימה.
-
מה היתרון של rebase על merge?
הצגת התשובה
תשובה ג. מתאים לענף אישי לפני שפותחים PR.