שחזור ורשת ביטחון

שחזור וה־reflog

git כמעט אף פעם לא מאבד שום דבר. החלק הקשה הוא למצוא את זה שוב.

Reflog

כל תזוזה של HEAD — ושל כל ענף — עם מה שגרם לה: צ׳קאאוט, איפוס, ריבייס, תיקון, הבאה כפויה. מכל רשומה בעבר אפשר לעשות לה צ׳קאאוט, להסתעף ממנה, או לאפס אליה איפוס קשה.

מציג ה־reflog

זה כפתור ה״בדיוק איפסתי את הענף הלא נכון״.

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

עבודה שלא נכנסה לקומיט היא הדבר היחיד שה־reflog לא יכול להציל, ולכן Gitcito מצלם אותה: כל עץ העבודה — קבצים ששונו, קבצים בסטייג׳ וקבצים שאינם במעקב — נכנס לקומיט דרך אינדקס חד־פעמי ומוצמד תחת refs/gitcito/wip. לא האינדקס האמיתי שלכם ולא רשימת הסטאשים שלכם נפגעים.

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

שלושה דברים לוקחים אחת:

טריגר מתי
השומר אוטומטית, רגע לפני פעולה הרסנית — השלכת שינויים, ניקוי, איפוס קשה, שחזור מקומיט. פעיל כברירת מחדל; אפשר לכבות ולהדליק אותו בדו־שיח תמונות המצב.
טיימר כל 5 / 15 / 30 דקות כל עוד המאגר פתוח.
ביד כפתור צלם תמונת מצב עכשיו.

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

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

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

bisect מודרך

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

bisect מודרך

תנו לפקודה להחליט

ברגע שהטווח נזרע, תנו לפקודה להחליט מוסר את כל החיפוש ל־git bisect run. git עושה צ׳קאאוט לכל מועמד, מריץ את הפקודה שלכם, וקורא את קוד היציאה שלה:

קוד יציאה פירושו
0 טוב — הבאג לא כאן
125 אי אפשר לבדוק את זה; דלגו
כל דבר אחר רע

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

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

למה לשים לב. הפקודה רצה על כל קומיט ש־git בודק, ולכן פקודה שפורסת, מפרסמת או כותבת מחוץ למאגר תעשה זאת כמה וכמה פעמים. השאירו אותה למשהו שרק קורא ומדווח. עצירה הורגת את הריצה ומשאירה את הסשן פתוח, כך שתוכלו להמשיך לסמן ביד; ביטול מסיים את ה־bisect לגמרי.

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

קובץ נעילה שנשאר מאחור

‏git מניח קובץ .lock לצד מה שהוא עומד לכתוב, ומסיר אותו כשהכתיבה מסתיימת. תהליך שמת כשהוא אוחז בו — עורך שקרס, מסוף שנסגר באמצע git commit, fetch שנהרג תוך כדי גיזום הפניות מרוחקות — משאיר את הנעילה, ומאותו רגע כל כתיבה נכשלת באותה שורה:

error: could not delete references: cannot lock ref 'refs/remotes/origin/x':
Unable to create '…/refs/remotes/origin/x.lock': File exists.

המאגר אינו פגום. פשוט יש קובץ שחוסם את הדרך.

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

הגיל הוא כל הטיעון. נעילה צעירה מ־30 שניות נחשבת שייכת ל־git שעדיין עובד, ו־ Gitcito מסרב למחוק אותה — הוא מציע להמתין ולנסות שוב. הישנות יותר מוצעות למחיקה, מהישנה ביותר ומטה, והחלון אומר בפירוש מה לבדוק לפני שמסכימים: שאף עורך, מסוף או לקוח Git אחר אינו עובד כרגע במאגר הזה. משיכת נעילה מתחת לכתיבה חיה היא הדרך לאינדקס קרוע.

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

ביטול / ביצוע מחדש

רוב הפעולות דוחפות רשומה למחסנית הביטול, ולכן ⌘Z מהפך את האחרונה במקום ש־git מרשה.

ראו גם: מה השתנה מאז · סטאשים

שיפור התרגום הזה ב־GitHub