Merge - איחוד שתי תיקיות?

היי,

לא הבנתי איך הפונקציה merge גורמת לאיחוד של ה-commit הנוכחי (שעליו HEAD מצביע) עם ה-commit שהענף שהועבר לפונקציה מצביע עליו.

בתוך ה־staging_area, החליפו את הקבצים ששונו מאז הבסיס המשותף ועד BRANCH_NAME.
בצעו commit חדש כרגיל, והעבירו את HEAD, ואת ה־branch הפעיל ל־commit id החדש. אל תעבירו את BRANCH_NAME ל־commit id החדש.

האם ב-staging area כבר נמצאים הקבצים שיש ב-commit שעליו מצביע HEAD? אחרת ה-commit החדש שנוצר הוא רק העתק של הענף שהועבר לפונקציה.
ואם כן, אז כנראה ב-staging area יש גם קבצים שנוספו אחרי היווצרות שני ה- commit-ים שאנחנו רוצים לאחד. כך שיש שם גם קבצים שאין באף אחת מהתיקיות.

ועוד שאלת הבנה בסיסית, לא הבנתי איפה מצופה מהמשתמש לעבוד על הקבצים שהוא רוצה להוסיף\לשנות, ישירות בתוך תיקיית ה-commit שהוא רוצה או בתיקיית הבסיס (זו שנמצא בה .wit)?

לייק 1

merge הוא מיזוג של התיקיה הנוכחית עם הענף branch שהוא קיבל בפרמטר.

מצופה מהמשתמש לעבוד בתיקיה המקורית שלו.

2 לייקים

הבנתי את המטרה של merge, לא הבנתי בפועל איך היא מתקיימת לפי ההוראות שניתנו.
לפי מה שהבנתי, מה שנוצר זו תיקייה שכוללת קבצים מהענף שהועבר לפונקציה (כי הקבצים משם הועתקו ל-staging area) ועוד קבצים שכבר היו ב-staging area.

הבנת נכון.
התיקיה מכילה מיזוג של קבצים:
קבצים שנמצאים בstaging של הממזג
וקבצים שנוספו או שונו מאז הפיצול בין הממזג לענף שפוצל ממנו.(שאחרי שמצאת אותם אתה מעתיק לstaging)
בסוף מתקבל לך בstaging, קבצים שמכילים גם את הקבצים של הממוזג(הענף שקיבלת בפרמטר)

לייק 1

בדיוק עמדתי לכתוב שאלה ואז הבנתי את הפער שהיה לי.
רציתי לשאול מה קורה במצב שבו HEAD מצביע לא על ה-commit האחרון שבוצע, ואז עושים merge עם ענף מסוים. במקרה כזה, [חשבתי ש]ה- staging area מכיל גם קבצים של add-ים אחרים שבוצעו לאחרונה. ואז תיקיית האיחוד מכילה קבצים שלא נמצאים באף אחת מהתיקיות.
ואז נזכרתי שכאשר מבצעים checkout, כל תיקיית ה-staging area מתעדכנת לפי הענף/commit_id שהועבר (אני ממש מחקתי את התיקייה והעתקתי את כל הקבצים לתיקייה חדשה בשם זה). ולכן, בכל מצב, תכולת ה-staging_area זהה לתכולת תיקיית commit_id שעליה מצביע כרגע HEAD.
זה נכון?

כן, אלו זה קבצים שנמצאים בתיקיית ה־commit id שעליה HEAD מצביע, עם קבצים שנמצאים ב־commit id שקיבלנו כפרמטר ל־merge.
אנחנו מניחים שלא שינו את ה־staging area מאז ה־checkout האחרון (לא עשו add לקבצים חדשים).

זה מתקשר ומתחבר למה שאלון כותב בהודעה הבאה:

כן – צריך להכשיל את ה־merge אם תכולת ה־staging area שונה מהתכולת התיקייה של ה־commit id האחרון.

אוקיי אז אם הבנתי נכון,
יש לי שני קומיטים - האחד הפעיל שהhead נמצא עליו(נקרא לו A) והאחד שקיבלתי כפרמטר(נקרא לו B).

  • אני מחפש את המכנה המשותף שלהם ומוצא(נקרא לו C).
  • אני מוודא שהתוכן של staging_area והתוכן של A זהים.

עכשיו החלק שאני מתקשה להבין, אילו קבצים יועתקו לstaging_area לפני הקומיט?
ראיתי שכתוב להעתיק את הקבצים שהשתנו מאז אבל אני מנסה להבין מה אני מחפש.
נניח שאני משווה בין C לA, ורואה שבC יש שני קבצים שאין בA, וב-A יש שני קבצים שאין ב-C(אחרים).
מאיפה אני מעתיק את מצב הקבצים, מ-B?

תודה

למיטב הבנתי, הכוונה היא לקבצים ששונו בתוכנם (ובעלי אותו שם) ולקבצים שקיימים ב-B אך לא קיימים ב-A (קבצים שנוספו).

נגיד שיש לך תמונה ראשונה שקיימים בה:

Text1.py, Text2.py

יש לך תמונה אחרת שיש בו את:

Text1.py, Text2.py, Text3.py

המודגשים הם הקבצים ששונו בתוכנם.

שלבים:

  1. מצא את ההבדלים: Text1.py ו-Text3.py.
  2. העתק ל-staging_area את הקבצים האלו במקביל למה שכבר יש שם.
  3. בצע commit (פקודה כזו תייצר תמונה בעלת 2 הורים).
  4. שנה את הענף הפעיל והראש כך שיצביעו על התמונה החדשה.

לי יש שאלה אחרת אבל:
בגיט, כשאתה מבצע איחוד בין 2 תמונות שהראשונה היא האב של השנייה, לא נוצרת תמונה חדשה אלא מתבצעים כל השלבים על בסיס הקבצים של האב.
גם במימוש שלנו זה קורה, אבל בסוף ההנחייה היא לייצר תמונה חדשה בכל פעם.
יש צורך (במסגרת הנחיות התרגיל, לא לכיף :wink:) לממש את הפונקציה הזו? או שמהבחינה הזו התרגיל דורש ליצור תמונה חדשה בהכרח כל פעם?

ההתנהגות שאתה מדבר עליה נקראת fast-forward והיא לרוב לא כ"כ רצויה.
רוב מי שאני מכיר משתמש ב־flag בשם --no-ff כדי לנטרל את ההתנהגות הזו.
אין צורך לממש התנהגות כזו עבור התרגיל, תמיד תיווצר תמונה חדשה בדומה להתנהגות של no-ff

2 לייקים

אם אתה כרגע על A וביצעת merge עם B, וה־commit המשותף הקרוב ביותר הוא C, אתה צריך להביא את הקבצים ששונו בין A לבין C ואת הקבצים ששונו בין B לבין C.
את כל שאר הקבצים ב־A אתה פשוט מעתיק.

לייק 1

בין B ל-C הגיוני לי, למה בין A ל-B? הרי אין ביניהם באמת חפיפה.
מה שאני הבנתי בינתיים זה שאני עובד עם A ומעתיק אליו את הקבצים ששונו או התווספו בין C ל-B.
פספסתי משהו?

סליחה, הכוונה הייתה בין A ל־C ובין B ל־C. (ערכתי בהתאם)

לייק 1

תודה!
20202020202020