Git detached HEAD: לשמור commits לפני שעוזבים
הקטעים מתארים מקרים שונים, לא סקריפט אחד. בחרו את המקרה המתאים והחליפו שמות ענפים, נתיבים ו-VERIFIED_COMMIT לפני השימוש. פקודות ביטול שייכות רק לפעולה הפעילה המתאימה; אין לבצע את שני החלופות.
התשובה הקצרה
detached HEAD אומר ש-HEAD מצביע ישירות ל-commit במקום לעקוב אחרי ענף מקומי. אפשר לבדוק, לבנות ולבצע commits. כדי לשמור עבודה חדשה, צרו ענף בקצה הנוכחי לפני העזיבה. המצב עצמו אינו אובדן; השארת commits ללא הפניה קבועה יוצרת את סיכון השחזור.
הדוגמה והתנאים
הדוגמה היא checkout זמני של גרסה ישנה עם שני commits שיש לשמור כענף תיקון. זה שונה מ-rebase פעיל או submodule מנותק בכוונה. קראו status וסיימו או בטלו במודע פעולה פעילה לפני שימוש במסלול הזה.
בדיקת המצב לפני שינוי
במצב מנותק רגיל branch --show-current ריק. status מסביר את המצב ו-log מציג את ההיסטוריה הנוכחית. רשמו את מזהה HEAD. שם ריק אינו אומר שאין ענפים או שהקבצים אינם מנוטרים; הפניה ותוכן תיקיית העבודה עונים לשאלות שונות.
git status
git branch --show-current
git log -3 --oneline
git rev-parse HEADשמירת הפניה או checkout נפרד
צרו rescue/detached באמצעות switch -c כשאתם עדיין ב-commit הרצוי. הענף שומר את ההיסטוריה נגישה, אך אינו הופך עריכות מקומיות ל-commit. בדקו ושמרו אותן בנפרד כשצריך. השתמשו בשם חדש בלי להחליף ענף קיים באפשרות כפייה.
git switch -c rescue/detached
git branch --show-currentהמסלול הראשון
אמתו שם ענף, commits ושינוי. אפשר להמשיך שם או לשלב תיקון עם merge או cherry-pick. cherry-pick מעתיק שינוי ל-commit חדש; merge מחבר היסטוריות. בחרו לפי המשימה ובדקו תוצאה. יציאה בטוחה מ-detached HEAD אינה מחייבת push אוטומטי.
git log -3 --oneline --decorate
git show --stat HEADבחירה מכוונת בתוצאה אחרת
אם כבר עזבתם, בדקו reflog מקומי ומועמדים עם show. בחרו לפי שינוי והורה וצרו rescue/recovered במזהה המאומת. VERIFIED_COMMIT הוא מציין מקום להחלפה. HEAD@{1} אינו תמיד ה-commit שאבד, כי פעולות מאוחרות משנות את הרשומה הרלוונטית.
git reflog --date=iso
git show VERIFIED_COMMIT
git branch rescue/recovered VERIFIED_COMMITמגבלות וחריגים
reflog מתעד תנועת הפניות מקומיות, לא ארכיון מרוחק. רשומות ועצמים לא נגישים עשויים לפוג או להימחק. עריכות ללא commit מעולם לא נרשמו בו כ-commits. חפשו עותק קודם כגון גיבוי עורך או stash מאומת, בלי להבטיח שחזור של תוכן קבצים לא שמור בעזרת reflog.
התנגשויות וניקוי
submodule נמצא לעיתים ב-detached HEAD כדי לצרוך את ה-commit שקיבע האב, וזה תקין לשימוש בתלות. לפיתוח במאגר הבן צרו ענף בתוכו ופעלו בתהליך התרומה שלו. ענף באב אינו נותן אוטומטית שם ל-commits של הבן; ההפניות וההיסטוריות נפרדות.
אימות התוצאה
לפני מחיקת החילוץ, בדקו שענף קבוע או merge שנבדק עדיין מגיע ל-commits הדרושים. בדקו מצב ושינוי ביעד ושמרו הפניה בזמן סקירה. שם ענף שומר היסטוריית commits, לא עותק פיזי שני של כל הקבצים ולא הוכחת בדיקות מוצלחות.
git log --oneline --decorate rescue/detached
git status --shortשאלות נפוצות
האם זו שגיאה? לא כשבודקים בכוונה commit, tag או submodule מקובע. אפשר לבצע commit? כן, אך תנו שם להיסטוריה לפני עזיבה. ניתן לשחזר מאוחר יותר? לפעמים, אם העצמים והראיות המקומיות נשארו; בדקו מועמדים בלי הבטחת שמירה לנצח.
בדיקת הפעולה ב-FluxGit
השתמשו בהיסטוריה החזותית ובתצוגת השינויים של FluxGit לבדיקת הפעולה וה-commits הרלוונטיים. שמרו את בדיקות הענף, השיתוף והקבצים המקומיים מהדוגמה. דף ההורדה מציג גרסאות ופלטפורמות זמינות כעת.