בדיקות תקינות אחרי wit merge ו־commit עם הורים מרובים

תגיות:

היי,
במימוש האפשרי האחר, אחרי שמעתיקים ל־staging_area את BRANCH_NAME ועושים commit ל staging_area.
האם עדיין יש לוודא ש־graph, merge ושאר הפקודות שתלויות ב־parent עדיין מתפקדות כראוי? כיוון שברגע שבמימוש זה לא מחפשים את האב הכי קרוב לHEAD ול BRANCH_NAME לא נוצר commit עם יותר מparent אחד?

ושאלה נוספת בהקשר למימוש האפשרי האחר:
אם staging_area ו־HEAD לא זהים, הפעולה לא תתבצע או שבמקרה כזה יש לגרום להם להיות זהים?

תודה!

כן, יש לוודא ששאר הפקודות מתפקדות ולתקן אותן אם יש צורך (וכנראה שיש צורך).
צריך להתחשב במצב שבו יש יותר מ־parent אחד בכל מקרה.

אם הם לא זהים הפקודה merge לא אמורה להתאפשר בגדול (כי עושים commit)

הבנתי,
אפשר בבקשה לקבל דוגמה למצב בו ל commit האחרון יותר מ־parent אחד? כי commit מקבל את הparent שלו מה HEAD, ולכן אני לא מצליחה להבין כיצד יהיה מצב בו יש יותר מ parent אחד?

תודה

wit init
wit add a
wit commit
(נוצר commit מספר 000000)
wit add b
wit commit
(נוצר commit מספר 111111)
wit checkout 000000
wit branch meow
wit checkout meow
wit add c
wit commit
(נוצר commit מספר 222222)
wit checkout master
wit merge meow
(נוצר commit מספר 333333)

הוריו של ה־commit שמספרו 333333 הם 22222 ו־111111

לייק 1

עדיין מבולבלת,
אחרי שנעשה checkout 000000:
HEAD מעודכן להיות 000000.
יצרנו את ענף meow ולאחר מכן עשינו checkout meow , עכשיו ב HEAD מופיע 000000
לאחר מכן התבצע commit ונוצר 222222 (HEAD מעודכן להיות 222222.), לאחר מכן checkout master ועכשיו HEAD מצביע ל000000.
בסוף הגענו לmerge ונוצר 333333.
עדיין לא הבנתי לצערי איך 222222, 111111 הם ההורים של 333333.
אשמח לעוד הסבר בבקשה

master מצביע על 111111 :slight_smile:

לייק 1

כאן הפער, לדעתי: master הוא הענף הראשי אחרי שעושים wit init.
הוא רץ הלאה עם ה־commit עד שמפעילים ענף אחר.

לכן commit שיוצר את תמונה מספר 111111, master מתעדכן להצביע עליה.
ב־wit checkout master ה־HEAD יצביע על 111111.

עכשיו עושים wit merge, שיוצר commit חדש מ־111111 ומ־222222 :slight_smile:

לייק 1

נכון! סליחה פספסתי את commit 111111, אז עכשיו אני מסכימה שהאחד מהוריו של ה commit יהיה מורכב מ111111 (כי HEAD מצביע עליו) , ולגבי meow (שגם מרכיב את ה commit) הוא מצביע על 000000 , למה אם כך הוא לא אחד מהוריו של 333333 (במקום 222222)?

שימי לב שברגע ש-meow הפך להיות פעיל, התווית שלו מוצמדת ל-commit הבאים (עד שהוא מפסיק להיות פעיל/כשענף אחר מופעל). כלומר, הוא פעיל עד ה-checkout master, ובדיוק לפניו נוצר commit חדש (222222) :slight_smile:

2 לייקים

עכשיו נפל האסימון!
המון תודה לשניכם על כל ההסברים!

לייק 1

היי,
שאלה נוספת שעלתה לי, כל פעם שקוראים לפקודה merge מתבצע איחוד בין HEAD ו BRANCH_NAME , ולאחר מכן בתוך הפונקציה merge קוראים לפונקציה commit, כלומר בהכרח ל commit האחרון יהיו 2 הורים ולא יותר (כיוון שמאחדים רק ענף אחד עם head ולא כמה ענפים בכל פעם)?
תודה!

כן, זה נכון :slight_smile:

2 לייקים

שאלה נוספת בנושא זה-
אם הפונקציה merge אמורה לקרוא בתוכה לפונקציה commit,
האם שורת הפקודה של merge אמורה להיות כך:
“python path/to/wit.py merge BRANCH_NAME MESSAGE”?
תודה

שאלה טובה. בגדול אפשר ליצור הודעה אוטומטית כדי לחסוך את הטרחה, משהו בסגנון “Merge branch: BRANCH_NAME”

לייק 1

עוד שאלה על merge -
כשאתה כותב ש"לבדוק את התקינות של graph אחרי merge " אתה מתכווין שיראו בגרף את הhead החדש יוצא משני ההורים ?

כן, זו הכוונה :slight_smile:

לייק 1

בפקודה של commit, אם staging_area ו-HEAD זהים אז לא מתבצע commit (כי אין שום דבר חדש), ואם הם לא זהים אז מתבצע commit. לא?

איך שחשבתי על merge:

  • נרצה שהפעולה תיכשל אם יש משהו ב-“changes not staged for commit” (? אלא אם כן זה באחריות המשתמש לעשות add לכל הקבצים הלא מעודכנים ב-staging_area)
  • בודקים אילו קבצים שונים (כולל כאלו שנוספו) מאז הבסיס המשותף ועד ל-BRANCH_NAME.
  • מוודאים שאין קבצים משותפים בין ה-HEAD לאלו מסעיף קודם. אם יש, הפעולה תיכשל (אלא אם כן מטפלים ב-collisions, כפי שרשום בבונוס). אם אין, מעתיקים אותם (אלו של סעיף קודם) ל-staging_area
  • אם יש משהו ב-“changes to be commited”, השינויים האלו כבר ייכנסו ל-commit ביחד עם מה שיש ב-BRANCH_NAME
  • מבצעים commit תוך עדכון שני ההורים.

מה כאן חסר / לא נכון?

השורה התתונה היא שה־merge קורה בין הקומיט שאנחנו ממש עליו (HEAD), לבין הקומיט שעליו מצביע BRANCH NAME, ואסור שיאבד מידע כלשהו שהמשתמש עשה.
אם מידע עלול להאבד, תכשיל את הפעולה.

אין צורך לעדכן את ההורים עצמם, אלא רק לתת אליהם הפנייה בשדה parent.