היי, במימוש האפשרי האחר, אחרי שמעתיקים ל־staging_area את BRANCH_NAME ועושים commit ל staging_area.
האם עדיין יש לוודא ש־graph, merge ושאר הפקודות שתלויות ב־parent עדיין מתפקדות כראוי? כיוון שברגע שבמימוש זה לא מחפשים את האב הכי קרוב לHEAD ול BRANCH_NAME לא נוצר commit עם יותר מparent אחד?
ושאלה נוספת בהקשר למימוש האפשרי האחר:
אם staging_area ו־HEAD לא זהים, הפעולה לא תתבצע או שבמקרה כזה יש לגרום להם להיות זהים?
כן, יש לוודא ששאר הפקודות מתפקדות ולתקן אותן אם יש צורך (וכנראה שיש צורך).
צריך להתחשב במצב שבו יש יותר מ־parent אחד בכל מקרה.
אם הם לא זהים הפקודה merge לא אמורה להתאפשר בגדול (כי עושים commit)
adi1
הבנתי,
אפשר בבקשה לקבל דוגמה למצב בו ל commit האחרון יותר מ־parent אחד? כי commit מקבל את הparent שלו מה HEAD, ולכן אני לא מצליחה להבין כיצד יהיה מצב בו יש יותר מ parent אחד?
תודה
Yam
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
adi1
עדיין מבולבלת,
אחרי שנעשה checkout 000000:
HEAD מעודכן להיות 000000.
יצרנו את ענף meow ולאחר מכן עשינו checkout meow , עכשיו ב HEAD מופיע 000000
לאחר מכן התבצע commit ונוצר 222222 (HEAD מעודכן להיות 222222.), לאחר מכן checkout master ועכשיו HEAD מצביע ל000000.
בסוף הגענו לmerge ונוצר 333333.
עדיין לא הבנתי לצערי איך 222222, 111111 הם ההורים של 333333.
אשמח לעוד הסבר בבקשה
adva.alkalay
master מצביע על 111111
לייק 1
Yam
כאן הפער, לדעתי: master הוא הענף הראשי אחרי שעושים wit init.
הוא רץ הלאה עם ה־commit עד שמפעילים ענף אחר.
לכן commit שיוצר את תמונה מספר 111111, master מתעדכן להצביע עליה.
ב־wit checkout master ה־HEAD יצביע על 111111.
עכשיו עושים wit merge, שיוצר commit חדש מ־111111 ומ־222222
לייק 1
adi1
נכון! סליחה פספסתי את commit 111111, אז עכשיו אני מסכימה שהאחד מהוריו של ה commit יהיה מורכב מ111111 (כי HEAD מצביע עליו) , ולגבי meow (שגם מרכיב את ה commit) הוא מצביע על 000000 , למה אם כך הוא לא אחד מהוריו של 333333 (במקום 222222)?
adva.alkalay
שימי לב שברגע ש-meow הפך להיות פעיל, התווית שלו מוצמדת ל-commit הבאים (עד שהוא מפסיק להיות פעיל/כשענף אחר מופעל). כלומר, הוא פעיל עד ה-checkout master, ובדיוק לפניו נוצר commit חדש (222222)
2 לייקים
adi1
עכשיו נפל האסימון!
המון תודה לשניכם על כל ההסברים!
לייק 1
adi1
היי,
שאלה נוספת שעלתה לי, כל פעם שקוראים לפקודה merge מתבצע איחוד בין HEAD ו BRANCH_NAME , ולאחר מכן בתוך הפונקציה merge קוראים לפונקציה commit, כלומר בהכרח ל commit האחרון יהיו 2 הורים ולא יותר (כיוון שמאחדים רק ענף אחד עם head ולא כמה ענפים בכל פעם)?
תודה!
Yam
כן, זה נכון
2 לייקים
zoharya
שאלה נוספת בנושא זה-
אם הפונקציה merge אמורה לקרוא בתוכה לפונקציה commit,
האם שורת הפקודה של merge אמורה להיות כך:
“python path/to/wit.py merge BRANCH_NAME MESSAGE”?
תודה
Yam
שאלה טובה. בגדול אפשר ליצור הודעה אוטומטית כדי לחסוך את הטרחה, משהו בסגנון “Merge branch: BRANCH_NAME”
לייק 1
yosefco3
עוד שאלה על merge -
כשאתה כותב ש"לבדוק את התקינות של graph אחרי merge " אתה מתכווין שיראו בגרף את הhead החדש יוצא משני ההורים ?
Yam
כן, זו הכוונה
לייק 1
d104
בפקודה של 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 תוך עדכון שני ההורים.
מה כאן חסר / לא נכון?
Yam
השורה התתונה היא שה־merge קורה בין הקומיט שאנחנו ממש עליו (HEAD), לבין הקומיט שעליו מצביע BRANCH NAME, ואסור שיאבד מידע כלשהו שהמשתמש עשה.
אם מידע עלול להאבד, תכשיל את הפעולה.
אין צורך לעדכן את ההורים עצמם, אלא רק לתת אליהם הפנייה בשדה parent.