Git School · FluxGit

ענף Git התפצל: לבחור merge או rebase

FluxGit ·

הקטעים מתארים מקרים שונים, לא סקריפט אחד. בחרו את המקרה המתאים והחליפו שמות ענפים, נתיבים ו-VERIFIED_COMMIT לפני השימוש. פקודות ביטול שייכות רק לפעולה הפעילה המתאימה; אין לבצע את שני החלופות.

התשובה הקצרה

ענף diverged כאשר לקצה המקומי ול-upstream יש commits שחסרים בצד השני. בצעו fetch, בדקו שניהם ובחרו שילוב. merge משמר היסטוריה; rebase מחיל commits מקומיים על upstream ומשנה מזהים. האזהרה מתארת את הגרף ולא מוכיחה אובדן קבצים.

הדוגמה והתנאים

הדוגמה היא main שעוקב אחרי origin/main, עם שני commits מקומיים ואחד מרוחק. בדקו שמות ו-upstream אמיתיים. fetch מעדכן הפניה למעקב מרוחק בלי לשלב אוטומטית בענף הנוכחי. remote בשם אחר או בלי upstream דורש התאמת פקודות.

בדיקת המצב לפני שינוי

קראו status ו-branch -vv לפני fetch origin. ספירת שני צדי HEAD...origin/main מציגה commits ייחודיים לכל צד. בדקו גרף ושינויים: שניים מול אחד לא אומר אם שינו אותה פונקציה. הפניה ישנה או ספירה לבדה אינן אבחון מספיק.

git status --short
git branch -vv
git fetch origin
git rev-list --left-right --count HEAD...origin/main
git log --oneline --graph --decorate HEAD origin/main

שמירת הפניה או checkout נפרד

לפני שילוב צרו rescue/before-sync בקצה המקומי ושמרו עבודה ללא commit בנפרד. ענף שומר היסטוריה מאושרת; stash מאומת מכסה אחרת קבצים מנוטרים, חדשים ומוחרגים. בדקו את העותק. שילוב מעל עריכות זרות מקשה על הבנת התנגשויות ושחזור.

git branch rescue/before-sync HEAD

המסלול הראשון

בחרו merge לשימור היסטוריה, במיוחד אם המקומיים כבר שותפו. merge origin/main משלב את מה שהורד עם הענף הנוכחי ובפיצול רושם בדרך כלל שני הורים. בדקו diff ובדיקות הפרויקט לפני פרסום. שילוב שהושלם לא מבטיח קוד משולב נכון.

git merge origin/main

בחירה מכוונת בתוצאה אחרת

בחרו rebase רק ל-commits שהצוות מאפשר לשכתב. rebase origin/main מחיל את העבודה מחדש מעל הקצה שהורד, בדרך כלל עם מזהים חדשים. אחרים עשויים להסתמך על הישנים. גרף ישר אינו הרשאה לשכתב ענף משותף או לעקוף הגנות.

git rebase origin/main

מגבלות וחריגים

בהתנגשות merge קראו status, פתרו והכינו קבצים וסיימו; merge --abort מבטל כשמתקיימים התנאים. ב-rebase פתרו את השלב הנוכחי ו-rebase --continue; ייתכנו כמה עצירות. rebase --abort מבטל את הפעולה הפעילה. אל תערבבו את המסלולים.

git status
git merge --abort
git rebase --abort

התנגשויות וניקוי

reset --hard origin/main אינו פתרון כללי: הוא מסיר מהענף את ההיסטוריה המקומית הנפרדת ועלול לדרוס קבצים מנוטרים. זו החלטת ויתור, בעוד כאן משלבים היסטוריות רצויות. אם רוצים לוותר, בדקו commits ושמרו עותקים נחוצים במסלול נפרד.

אימות התוצאה

בדקו גרף סופי, מצב, הבדל מ-origin/main ובדיקות הפרויקט. push רגיל עשוי להידחות אם המרוחק התקדם אחרי fetch. הורידו ובדקו את המצב החדש, בלי לעבור אוטומטית ל-force push. שמרו חילוץ עד סקירת השילוב והשפעותיו.

git status --short
git log -8 --oneline --graph --decorate
git diff origin/main HEAD

שאלות נפוצות

מדוע pull מבקש אסטרטגיה? הוא משלב fetch עם בחירת שילוב שיכולה להיות לא ברורה. merge ו-rebase שניהם עלולים להתנגש. rebase אינו תמיד טוב יותר; שיתוף commits ומדיניות הצוות חשובים מהעדפה כללית.

בדיקת הפעולה ב-FluxGit

השתמשו בהיסטוריה החזותית ובתצוגת השינויים של FluxGit לבדיקת הפעולה וה-commits הרלוונטיים. שמרו את בדיקות הענף, השיתוף והקבצים המקומיים מהדוגמה. דף ההורדה מציג גרסאות ופלטפורמות זמינות כעת.

תיעוד Git הרשמי

מסלולים קשורים

הורדת FluxGit