קונפליקטים בגיט - איך פותרים אותם בלי פאניקה¶
זוכר את הפעם הראשונה שראיתי קונפליקט בגיט. המסך התמלא בסימנים משונים, <<<<<<< ו-======= ו->>>>>>>, והתחושה הראשונה הייתה שבירה משהו קריטי. סגרתי את הטרמינל, פתחתי אותו שוב, ותקווה שזה ייעלם. זה כמובן לא נעלם.
אם זה קרה גם לכם, אני רוצה שתדעו משהו חשוב - קונפליקט הוא לא תקלה. הוא בעצם גיט שעושה בדיוק את מה שהוא אמור לעשות - לעצור ולבקש מכם החלטה אנושית, כי הוא לא יכול לקבל אותה בעצמו.
למה קונפליקט קורה בכלל¶
git טוב מאוד בלמזג שינויים אוטומטית. אם אתם שיניתם שורה בתחילת הקובץ ומישהו אחר שינה שורה בסוף אותו קובץ, git ישלב את שני השינויים בלי לשאול אתכם כלום, כי אין כאן שום סתירה.
קונפליקט קורה כשגיט מגלה ששני אנשים (או אתם בשני branches שונים) שינו את אותה שורה בדיוק, בדרכים שונות. גיט פשוט לא יכול לנחש איזו גרסה נכונה - זו החלטה שדורשת הבנה של הכוונה מאחורי הקוד, וזה בדיוק מה שבני אדם עושים ומחשבים לא.
זה קורה הכי הרבה בשני תרחישים - כשמנסים למזג שני branches שהתפתחו זמן רב זה בלי זה, וכשעושים pull ומגלים שמישהו אחר כבר שינה בדיוק את השורות שגם אתם שיניתם.
איך זה נראה בפועל¶
כשקורה קונפליקט, git עוצר את המיזוג ומסמן בתוך הקובץ עצמו איפה בדיוק הבעיה:
<<<<<<< HEAD
פונקציה שמחזירה True אם המשתמש מחובר
=======
פונקציה שבודקת תוקף session ומחזירה בוליאני
>>>>>>> feature-login
הקטע בין <<<<<<< HEAD לבין ======= הוא הגרסה שלכם, ה-branch שאתם נמצאים עליו כרגע. הקטע בין ======= לבין >>>>>>> feature-login הוא הגרסה שמנסים למזג פנימה. שני הצדדים נמצאים שם ביחד, וזה תפקידכם להחליט מה נשאר.
איך פותרים את זה, שלב אחר שלב¶
שלב ראשון - אל תיבהלו ואל תמחקו כלום בלי להסתכל. הקובץ לא שבור, הוא רק מציג לכם שתי גרסאות זו לצד זו.
שלב שני - קראו את שני הצדדים והבינו מה כל אחד מנסה לעשות. לפעמים התשובה היא לקחת גרסה אחת במלואה, ולפעמים התשובה היא לשלב בין השתיים.
שלב שלישי - ערכו את הקובץ ידנית. מחקו את הסימנים <<<<<<<, ======= ו->>>>>>>, והשאירו רק את הקוד הסופי הנכון, בין אם זה גרסה אחת, השנייה, או שילוב שכתבתם בעצמכם.
שלב רביעי - סמנו את הקובץ כפתור.
שלב חמישי - סיימו את ה-commit.
git כבר יזהה שזה commit שמסיים מיזוג, ויציע הודעה מתאימה. זהו, הקונפליקט נפתר.
כלים שהופכים את זה לקל בהרבה¶
עריכה ידנית של קובץ עם סימני קונפליקט זה אפשרי, אבל לא הכי נוח. עורכי קוד כמו VS Code מציגים את הקונפליקט בצורה ויזואלית, עם כפתורים ברורים כמו "קבל את הגרסה שלי", "קבל את הגרסה הנכנסת", או "קבל את שתיהן". זה חוסך המון טעויות הקלדה, ומומלץ מאוד להשתמש בזה במקום לערוך את הסימנים ידנית.
איך מונעים קונפליקטים מיותרים מלכתחילה¶
אי אפשר למנוע קונפליקטים לגמרי, וזה גם לא המטרה. אבל אפשר להפחית אותם משמעותית:
- תעשו pull לעיתים קרובות, לא רק פעם בשבוע. ככל שהקוד שלכם רחוק יותר מהגרסה העדכנית, כך גדל הסיכוי לקונפליקט.
- תעבדו ב-branches קטנים וממוקדים, שחיים זמן קצר ומתמזגים מהר, ולא נשארים פתוחים שבועות.
- תתקשרו עם הצוות כשאתם עובדים על אותו קובץ בערך באותו זמן - לפעמים שיחה של דקה חוסכת קונפליקט שלם.
מי שרוצה לתרגל את זה על פרויקט אמיתי, בלי לחץ ובקצב שלכם, כדאי שיתחיל מהיסודות.
התחילו את קורס התכנות הבסיסי כאן
לסיכום¶
קונפליקט הוא לא אויב, הוא גיט שמבקש מכם דעה. הפעם הראשונה תמיד מרגישה מפחידה, אבל ברגע שפתרתם קונפליקט אחד בעצמכם, כל השאר נראים הרבה יותר פשוטים.
נתקעתם באמצע קונפליקט ולא בטוחים איך להמשיך? זה בדיוק הזמן לשאול בדיסקורד לפני שאתם עושים משהו שאתם לא בטוחים לגביו.