אין דבר מעצבן יותר למפתח או למהנדס נתונים מאשר למחוק בטעות ענפי גיט או לאפס התחייבויות כשלא רציתם. לכן אני שמח לשתף משהו שלמדתי מניסיוני שלי ורציתי שלמדתי אותו מוקדם יותר, שזה איך להשתמש ב-git reflog
. git reflog
הוא אחת מהטכניקות שכדאי בהחלט ללמוד; אם תשקיעו קצת זמן עכשיו, תוכלו לחסוך כאב ראש גדול בהמשך.
בעוד שאני אראה לכם את git reflog
, שלדעתי מאוד מועיל בניווט ושיחזור מטעויות, אני גם רוצה להמליץ על הקורסים שלנו יסודות של גיט ו-מבוא למושגי גיט הוב כדי ללמוד הכל על בקרת גרסאות.
מהו git reflog?
Git reflog, או יומן הפניות, הוא מנגנון מעקב מקומי שמקליט עדכונים על קצוות ענפים וההפניה הראשית במאגר גיט. (בהקשר של גיט, HEAD מתייחס להתחייבות הנוכחית שעליה מתבססים תיק העבודה ואזור הבמה שלכם.)
בניגוד ל-git log
, שמציג את היסטוריית ההתחייבויות בהתבסס על אבות, מראה כיצד התחייבויות מחוברות בענף, git reflog
קוטע את כל התנועות של HEAD, כולל החלפת ענפים, ריבייסים, איפוסים והתחייבויות. זה הופך את reflog למועיל בשחזור התחייבויות אבודות ולדיבוג פעולות האחרונות.
מתי נוצרות רשומות reflog?
נכנסים הזנים נוצרים בכל פעולה שמשנה את מצב ה-HEAD או ההפניית הענפית. סצינריואים נפוצים כוללים את הבאים:
-
ביצוע שינויים באמצעות
git commit
. -
החלפת ענף שונה באמצעות
git checkout branch_name
. -
יצירת ענף חדש באמצעות
git branch new_branch
. -
Rebasing
git rebase
-
איפוס להתחילה לקודמת
git reset --hard
. -
מיזוג ענפים באמצעות
git merge
.
הנה הקוד שבו אתה משתמש כדי לעקוב אחרי עדכונים במאגר המקומי:
git reflog
שימוש ב-git reflog כדי לעקוב אחרי עדכונים במאגר המקומי. תמונה מאת המחבר.
איך אתה מפרש את הפלט של git reflog?
אתה יכול לפרש את הפלט כך:
-
HEAD@{0}
: הפעולה האחרונה הייתה המעבר לסניף HEAD. -
HEAD@{1}
: לפני כן, שיניתי את סוג הקובץ מ־.xlxs
לתבנית.csv
. -
HEAD@{2}
: ביצעתי את הקומיט הראשון בעת דחיפת הקבצים למאגר.
כל רשומה מציגה:
-
ה־commit hash (
fa82776
) -
אינדקס ה-reflog (
HEAD@{0}
,HEAD@{1}
וכו') -
תיאור של הפעולה שננקטה (התחייבות, בדיקה, rebasing)
איך להשתמש ב-git reflog
פקודת Git reflog מספקת דרך לעקוב אחרי עדכוני הפניות ולהחזיר את מצבי המאגרים הקודמים שלך. על ידי הבנת איך לנווט בין רשומות reflog, תוכל לשחזר קומיטים שאבדו, לבטל שינויים, ולהשוות גרסאות קודמות של העבודה שלך.
פקודת reflog בסיסית של git
להלן הפקודה הבסיסית של reflog:
git reflog
הפקודה למעלה מציגה רשימה של פעולות אחרונות שעידכנו את HEAD או הפניות של הענפים, כולל קומיטים, החלפות ענפים, איפוסים, rebases ועוד. כל רשומה ממוספרת, כגון HEAD@{0}
ו-HEAD@{1}
, כדי לייצג את מקומה בהיסטוריית reflog.
הפניה למצבים קודמים
רישום ה-reflog של Git משמש כרשומה של עדכוני התייחסות קודמים, מה שמאפשר לנו לאתר ולשחזר נקודות קודמות בהיסטוריה של מאגר הנתונים שלנו. בלי זה, התייחסויות אלו לא היו קיימות, והיינו זקוקים להאשטאגים מדויקים של קומיטים כדי לחזור למצב ספציפי מהעבר. עכשיו, בואו נחקור איך Git מאפשר לנו לנווט בין מצבים קודמים בעזרת git checkout
.
HEAD@{n}
: מתייחס לפריט reflog ספציפי, כאשר n
הוא האינדקס. לדוגמה, HEAD@{2}
מתייחס למצב השלישי הכי עדכני של HEAD.
git checkout HEAD@{2}
שימוש ב-git checkout כדי לעקוב אחרי שינויים קודמים. תמונה מאת המחבר.
branch@{time}
: מתייחס למצב של סניף בזמן ספציפי. לדוגמה, main@{1.week.ago}
מתייחס למצב של הסניף הראשי לפני שבוע, בעוד שfeature@{yesterday}
מתייחס למצב של סניף הפיצ'רים אתמול.
git checkout main@{1.week.ago}
שימוש ב-git checkout למעקב אחרי שינויים קודמים. תמונה מאת המחבר.
מאפייני זמן
git reflog
לא רק עוזר לנו לשחזר מצבים קודמים אלא גם מאפשר לנו להשוות ביניהם. מכיוון שreflog
עוקב אחרי עדכוני הפניות, אנו יכולים להשתמש בו כדי לראות כיצד המאגר שלנו השתנה עם הזמן. עכשיו, נסתכל כיצד git diff
עושה שימוש בנכ entries reflog כדי להשוות בין מצבים קודמים להווה.
הבאים הם דוגמאות למאפייני זמן המקלות עלינו לשחזר את המאגר לנקודה ספציפית בזמן במקום להסתמך רק על מספרי אינדקס של reflog.
git checkout HEAD@{1.minute.ago} # מצב לפני דקה אחת
git checkout HEAD@{1.hour.ago} # מצב לפני שעה אחת
git checkout HEAD@{1.week.ago} # מצב לפני שבוע אחת
git checkout HEAD@{yesterday} # מצב מהאתמול
git checkout HEAD@{2024-01-01.12:00:00} # מצב בנקודת זמן מסוימת
השוואת מצבים קודמים עם git diff
אתה יכול להשוות מצבים קודמים באמצעות פקודות כמו git diff
. הפקודה הבאה משווה את המצב הנוכחי של הענף הראשי main@{0}
עם המצב שלו לפני יום אחד, main@{1.day.ago}
. הפלט יראה כל שינוי בין שתי התמונות הללו.
git diff main@{0} main@{1.day.ago}
השוואת מצבים קודמים עם git diff. תמונה מאת המחבר.
שימושים נפוצים ב-Git Reflog
Git reflog הוא כלי שאין לו תחליף לשחזור שינויים אבודים, לביטול טעויות ולתיקון בעיות נפוצות ב-Git. להלן כמה תסריטים מעשיים שבהם git reflog
יכול לעזור.
ביטול reset לא טוב
אם בטעות ביצעת reset לענף שלך באמצעות git reset --hard
, תוכל להשתמש ב-reflog כדי לשחזר את מצבך הקודם.
git reset --hard HEAD@{3}
שחזור קבוצות אבודות
אם נמחקה סניפה בטעות או אם אבדו קבוצות עקב איפוס או rebase, ניתן למצוא את הקומיט האבוד באמצעות git reflog
.
git reflog
איתור גיבוב הקומיט מתוצאות ה-reflog וביצוע checkout:
git checkout <commit-hash>
לאחר אימות הקומיט האבוד, ניתן ליצור סניפה חדשה לשמירה עליו:
git branch recovered-branch <commit-hash>
תיקון rebase פגום
אם ריבייס לא עובר היטב, ניתן להשתמש ב- git reflog
כדי למצוא את הקומיט לפני הריבייס ולאפס את הענף שלך. זהה את הקומיט לפני הריבייס ואפס אותו.
git reset --hard HEAD@{3} # התאם את המספר בהתאם לפלט של reflog
שחזור ענף שנמחק
אם נמחק לך ענף בטעות, ניתן לשחזר אותו בעזרת git reflog
. מצא את הקומיט האחרון שנודע עבור הענף שנמחק ובנה אותו מחדש:
git branch restored-branch <commit-hash>
מעקב אחר היסטוריית ה- stash
ניתן גם להשתמש ב-git reflog כדי להציג את ההיסטוריה של ה- stash. הפקודה למטה מפרטת את פעולות ה- stash, מאפשרת לך לשחזר stash ישנים ככל שצריך.
git reflog stash
כדי להחיל רשומה קודמת מהמאגר, השתמש בצו הבא:
git stash apply stash@{2}
עיין במדריך שלנו Git Pull Force: כיצד לדרוס סעיף מקומי עם מרוחק כדי ללמוד את הפרקטיקות הטובות ביותר לדריסת שינויים מקומיים.
תתי פקודות ואופציות של Git Reflog
Git מספק מספר תתי פקודות ואופציות לניהול ואינטראקציה עם reflogs.
תתי פקודות של Git reflog
להלן פירוט מסודר של תתי הפקודות העיקריות git reflog
והשימוש שלהן.
git reflog show
: מציג את רשומות ה-reflog עבור HEAD כברירת מחדל או עבור הפנייה ספציפית כמו סעיף.
git reflog show
שימוש ב- git reflog show כדי להציג רשומות עבור ההתייחסות המצוינת. תמונה מאת הכותב.
git reflog list
: פקודה זו מציגה את כל ההתייחסויות עם reflog. זה מועיל לזיהוי ענפים והתייחסויות HEAD עם רשומות reflog שמאוחסנות.
git reflog list
git reflog delete <ref>@{<specifier>}
: מנקה רשומות reflog ישנות שחורגות מהגבול הזמן המצוין. לדוגמה, הפקודה הבאה מסירה רשומות מגילם של 30 ימים.
git reflog expire --expire=30.days.ago
git reflog delete <ref>@{<specifier>}
: מוחק רשומת reflog מסוימת על סמך ההתייחסות והמיקום שלה. הפקודה להלן מסירה את רשומת ה-reflog באינדקס 2
עבור HEAD
.
git reflog delete HEAD@{2}
git reflog קיים <ref>
: מאמת האם יש reflog עבור פנימה מסוימת. לדוגמה, הפקודה למטה מחזירה הצלחה אם לסניף הראשי יש reflog.
git reflog exists main
אפשרויות עבור פקודות משנה של git reflog
הנה האפשרויות הזמינות עבור פקודות המשנה של git reflog
ושימושן.
--expire-unreachable=<זמן>
: מנקה רק את רשומות ה-reflog שאינן נגישות מכל פנימה. לדוגמה, הפקודה למטה מסירה רשומות reflog שאינן נגישות יותר מ-7 ימים.
git reflog expire --expire-unreachable=7.days.ago
--all
: מעבד reflogs עבור כל הפניות, ולא רק HEAD
. הפקודה למטה מנקה את כל רשומות ה-reflog הישנות מ-60 ימים בסניפים הכוללים.
git reflog expire --expire=60.days.ago --all
--dry-run
: מדמה ביצוע פקודה, מראה מה יימחק מבלי למחוק שום דבר בפועל. לדוגמה, הפקודה למטה מציגה אילו פריטים יוסרו.
git reflog expire --expire=30.days.ago --dry-run
--verbose
: מספקת פלט מפורט על הפעולות שביצעה הפקודה. הפקודה למטה מציגה פרטים מפורטים בזמן שתוקפים רשומות reflog ישנות.
git reflog expire --expire=90.days.ago --verbose
Git Reflog מול Git Log: הבדלים מרכזיים
גם git log
וגם git reflog
מספקים תובנות על היסטוריית המאגר, אך הם משמשים למטרות שונות. נבחן את ההבדלים הללו כדי להבין כיצד כל אחד מהם יכול לשמש עבור ניהול גרסאות ואסטרטגיות שחזור.
-
git log
מציגה את היסטוריית הקומיטים על ידי מעקב אחר אבות הקומיטים בענף. היא מספקת מבט כרונולוגי על האופן שבו התוכן של המאגר התפתח. -
git reflog
מרשום עדכונים לכתובות כמו HEAD, ענפים ו-stashes, כולל פעולות כמו החלפות ענפים, איפוסים, rebases ועוד. זה מעקב אחר שינויים שעשויים שלא להיות חלק מהשושלת של ה-commit. -
git reflog
הוא מקומי בצורה מוחלטת על המחשב שלך ואינו משותף עם מאגרים מרוחקים. -
בעוד
git log
לא יכול לשחזר קומיטים שכבר אינם חלק מהזנבות של הענף,git reflog
יכולה לעזור לשחזר קומיטים "אבודים" על ידי מעקב אחר עדכוני ההפניה, גם אם אלה הקומיטים כבר לא נגישים מכל ענף.
הטבלה למטה מסכמת את ההבדלים המרכזיים הללו.
Feature | git log | git reflog |
---|---|---|
מעקב אחר קומיטים | כן | לא |
מעקב אחר עדכוני הפנייה | לא | כן |
משותף במרחוק | כן | לא |
אפשר לשחזר קומיטים אבודים | לא | כן |
שיטות עבודה מומלצות לשימוש ב-Git Reflog
Git reflog הוא כלי עוצמתי לשחזור קומיטים אבודים ולתיקון בעיות היסטוריה, אך השימוש בו בצורה אפקטיבית דורש זהירות. הנה כמה שיטות עבודה מומלצות לעקוב אחריהן כשעובדים עם reflog.
-
השתמשו ב-Reflog לשחזור ודיבוג: אם בטעות reset או rebased סניף בצורה לא נכונה, בדקו את
git reflog
כדי למצוא הפניה קודמת ולשחזר אותה. -
היה זהיר עם
git reset --hard
:git reset --hard
עשוי להסיר לצמיתות שינויים שלא נשמרו. תמיד יש לבדוק את ה־reflog תחילה על מנת לוודא שניתן לשחזר אם משהו הולך לאיבוד. -
השג גיבויים לפני ביצוע פעולות מושחתות: כדי להגן על אובדן נתונים, עליך ליישם גיבויים אוטומטיים של המאגרים שלך ב־Git. תמיד יש לאחסן את הגיבויים במקום מאובטח מחוץ לאתר על מנת להבטיח את השחזוריות במקרה של כשל חומרה או אסונות אחרים.
-
אל תסתמך באופן בלעדי על Reflog לשחזור ארוך טווח:כברירת מחדל, רשומות ה-reflog שמורות למשך 90 ימים. לאחר תקופה זו, ייעשה איסוף אשפה ויתכן שהן יהיו בלתי משיבות. יש לשלוח באופן קבוע את ה-commitים שלך לריפוזיטורי רחוק כדי להבטיח את שמירתם מעבר ל-reflog המקומי שלך.
-
השתמש ב־
git reflog expire
כדי לנהל רשומות ישנות: אם רשומות ה-reflog של המאגר שלך מתמלאות, ניתן לזקק רשומות ישנות או לא נגישות באמצעותgit reflog expire
.
סיכום
ניהול יעיל של היסטוריית פרויקט ב-Git דורש יותר מפקודות בסיסיות. חקירה בכלים מתקדמים שמעקבים אחר עדכוני ההפנייה עשויה לספק רשת ביטחון יקרה לשחזור התחייבויות אבודות, שחזור ענפים שנמחקו ותיקון טעויות. רכישת ניסיון ידיים עם כלים אלה, יחד עם פקודות כמו git reset
, git checkout
, ו־git revert
, עשויה לשפר באופן משמעותי את הידע והמיומנות שלך בשליטה בגרסאות.
ללמוד בקורסים שלנו הוא לא רק דרך נהדרת ללמוד, אלא גם דרך טובה להעביר הודעה למעסיקים שאתה לוקח פיתוח תוכנה ברצימות. לכן, אני ממליץ ללמוד את הפוסט שלנו על 20 שאלות ראיון על Git ותשובות לכל הרמות ולבצע את מסלול המיומנויות החדש שלנו ב-Git כדי להפוך למומחה בכל נושאי Git.