הפיכת מיזוג Git: מדריך עם דוגמאות

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

במאמר זה, אני יעיל לך דרך השימוש בgit revert על מנת לבטל בבטיחות את המתאימות הזו, ולוודא שההיסטוריה של ההגשות נשארת מושלמת והיושרת של הפרוייקט נשארת בתשורה.

איך git revert עובד

אנחנו יכולים לחשוב על git revert כעל גיטס של פקודת בטל. אך הפקודה git revert אינה ממחישה את ההגשה או מעברת למצב העמוד הקודם. במקום זה, היא יוצרת הגשה חדשה שמבטלת את השינויים מההגשה הספציפית.

הסינתק לבטיל את ההגשה עם השביל <commit_hash> הוא:

git revert <commit_hash>

אנחנו יכולים לרשום את ההגשות ביחד עם השבילים שלהם בעזרת הפקודה git log. הייצוא של git log מרשם את ההגשות מההגשה האחרונה ועד להגשה הקדומה, כך:

לדוגמה, כדי לבטל את ההגשה שמיישמת את הפונקציית ההתרחסקות, אנחנו נשתמש בפקודה:

git revert 7ba24a3e62d4d37182428ccfaa070baa222b1151

בעזרת git revert אנחנו יכולים לבטל את השינויים של ההגשה הספציפית בלי להשפיע על ההיסטוריה של ההגשות.

שימו לב שgit revert אינו קסם, ותלוי בהיסטוריה של הקומיטים, זה יכול להוביל לקונפליקט שצריך להיפתר באופן ידני.

יתרונות של git revert מעל שינויים ידניים

למה git revert שימושי אם אנחנו עלולים להיאלץ לפתור קונפליקט באופן ידני? האם לא יהיה קל יותר לבטל שינויים באופן ידני? בואו נראה את יתרונותיו:

  • שימור היסטוריה: git revert יוצר קומיט חדש שבוטל את השינויים של קומיט מסוים, תוך שימור כל ההיסטוריה של הקומיטים. זה עוזר לשמור על היסטוריה שקופה של שינויים וביטולים.
  • ביטול אטומי: הוא מבטיח שהביטולים הם אטומיים ויציבים. כשאנחנו מוחקים שינויים ומקבלים אותם באופן ידני, יש סיכון לטעות אנושית.
  • מודעות לקונפליקטים: הוא מבטיח שנודע לנו על קונפליקטים אם יש אינטגרציות או שינויים שתלויים בקומיט המקורי. זה עשוי להיראות לא נוח, אבל זה מגן מפני תוצאות לא מכוונות.
  • מטאדאטה: הקומיט החדש שנוצר על ידי git revert כולל מטאדאטה והודעת קומיט שמתארת בהקשר מה הושב.

ביטול מיזוג במצבים שונים

בחלק זה, אנחנו לומדים איך לבטל מיזוג. למטרת דוגמה, אנחנו מניחים שאנחנו ממזגים ענף בשם feature לענף main ומבצעים את הפקודה מהענף main:

git merge feature

מה שאנחנו לומדים כאן יכול להיות מותאם לשני ענפים כלשהם על ידי החלפת השמות בהתאם.

שינוי שלישי שאין לו התקשורת עם ההגשה

הפקודה git merge אינה תמיד מייצרת הגשה חדשה. הגשה נוצרת רק אם העבר העיקרי main התפרץ מעבר לעבר העיקרי feature. בגלל שהפקודה git revert דורשת הגשה כדי לפעול, אנחנו לא יכולים להשתמש בה במקרה זה.

העברים main ו feature מתפרצים כשיוצאות הגשות חדשות על העבר main שאינן אבות של העבר feature. במילים אחרות, יוצאות הגשות חדשות נוצרות על העבר main אחרי שהעבר feature נוצר.

אם העברים לא מתפרצים, כשאנחנו מבצעים את הפקודה git merge feature על העבר main, Git ישתמש בדרך הגלדה מהירה כדי לשלב. זה אומר שהוא מעביר את ראש HEAD של העבר main לאותו המקום בו היה ראש HEAD של העבר feature.

אנחנו יכולים לומר שזה קרה באופן קל על-ידי הסתכלות על תוצאות הפקודה git merge:

כדי לבטל את השלישי הזה, אנחנו רק צריכים להעביר את ראש HEAD של העבר main חזרה למקום הקודם. על מנת זאת, אנחנו:

  1. זה מצביע על הגשה הקודמת HEAD בעזרת הפקודה git reflog
  2. בהחלט את ה HEAD לקודם בעזרת git reset --hard <previous_head>, ומחליף <previous_head> בשם ה HEAD הקודם.

היצאת התוצאות של git reflog תיראה כך:

אנחנו יכולים לזהות את ה HEAD הקודם על-ידי הבט בשורה שאומרת "checkout: moving from feature to main" (זה כותב feature ו main בגלל שאלהם שמות הענףים שלנו).

במקרה זה, ה HEAD הקודם הוא fe59838. על מנת להגיע חזרה ל HEAD של הענף main ולבטל את השלידות, אנחנו משתמשים בפעם בפקודה:

git reset --hard fe59838

שינוי שלידות שייך להצלעה

אם הענף main וענף feature התפרץ, אז כשאנחנו משלבים שני ענפים, נוצרת הוצאה חדשה, שנקראת הצלעה של השלידות.

ההצלעה של השינויים מאחד ענף לשני בעזרת ההצלעה. במקרה זה, השינויים בענף feature ניתנים לענף main.

על מנת לבטל את השינויים בענף main, אנחנו משתמשים ב git revert על ההצלעה הזו. זה ייצר הוצאה חדשה שתבטל את השינויים שנבעות מההצלעה לענף main, בעובדה שתשחזר את מצב main למה שהיה לו לפני ההצלעה.

ראשית, עלינו לזהות האש של ההצטברות הזאת. אנחנו יכולים לעשות זאת בעזרת הפקודה git log:

בגלל שלהצטברות הזאת יש שני הורים, התבנית של git revert קצת שונה. אנחנו צריכים להשתמש באפשרות -m 1 כדי ל指定 שאנחנו רוצים להפיל חזרה את השינויים בהתבסס על הסיבה main:

git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

התמונה בסדרה מתנגשת בזמן ההפיל החזרה של ההגיעה

לפעמים, קונפליקטים עלולים להתרחש בזמן ההפיל החזרה של ההגיעה, בעיקר אם ההגיעה המדורסת מתנגשת עם שינויים אחרים בקוד הבסיס. במקרים כאלה:

  1. גיט יעצם את ההפילה: אנחנו צריכים לפתור יחד קונפליקטים. גיט יסמן את הקודמים המתנגשים וידרש פעילות ידנית.
  2. פתרון קונפליקטים: אנחנו פתורים כל קודם הקונפליקטים, פתורים את הקונפליקטים המסמלים על ידי גיט, ושומרים את השינויים.
  3. עיצוב הקבצים הפתורים: git add <file-path>
  4. ממשיך בהפילה: git revert --continue

סיכום

שימוש בgit revert על מנת לבטל הצטברות מובטל בהגיעות מובטל את כל השינויים והתיקונים בהיסטוריית ההגיעות.

בנוסף, הבנה של ההקשרים המתאימים לשימוש ב git reset בעולם וב git revert עוזרת לנו להחליט טוב יותר, בעיקר כשאנחנו מתייחסים לעבודות שיתוף פעולה או לשינויים שנעשים רק במחשבה מקומית.

ניתן לקרוא עוד על הנושא בחלק השאלות המקריות הבא. אם אתה רוצה ללמוד עוד על Git, אני ממליץ את המשאבים הבאים:

Source:
https://www.datacamp.com/tutorial/git-revert-merge