החלפה והרכבה
git replace אומר ל־git: בכל מקום שבו עמדת לקרוא את אובייקט A, קרא במקומו את B.
שום דבר לא נכתב מחדש. שום sha לא משתנה. כל קומיט נשאר בדיוק היכן שהיה — git פשוט
מסתכל למקום אחר בדרך.
זה נשמע כמו סקרנות עד שרוצים שכפול קטן יותר. אז זו האלטרנטיבה הישרה לכתיבה מחדש של היסטוריה: הרכיבו קומיט על אפס הורים וכל מה שלפניו נושר מה־log, מהגרף ומכל שכפול שנעשה משם — בעודו עדיין שמור, עדיין ניתן להבאה, ובמרחק ref אחד שנמחק מלחזור.
⌘K ← החלפה והרכבה.

הרכבה
| מה שתיתנו לה | ומה שתקבלו |
|---|---|
| קומיט, בלי הורים | הקומיט הזה הופך לתחילת ההיסטוריה |
| קומיט, הורה אחד או יותר | הוא מתחבר שם במקום היכן שהוא באמת יושב |
הצורה השנייה היא המעניינת. שמרו את ההיסטוריה המלאה במאגר ארכיון, קצרו את מאגר העבודה, והרכבה שמצביעה על קצה הארכיון תחבר את השניים מחדש — אותו טריק שבו GitHub משתמש כדי להגיש שכפול רדוד שעדיין אפשר להעמיק.
הרכבה על אפס הורים שואלת קודם, כי ״ההיסטוריה נעלמה״ ו״ההיסטוריה מוסתרת״
נראים זהים לגמרי מה־log ואינם אותו דבר בכלל. האובייקטים שורדים עד ש־gc יגזום
אותם; ראו תחזוקה.
לחיות עם זה
החלפות הן refs, תחת refs/replace/. לזה שלוש השלכות ששוות הכרה:
- הן מקומיות עד שדוחפים אותן:
git push origin "refs/replace/*"משתף אותן, וכל מי שמשכפל בלעדיהן רואה את ההיסטוריה שלא נגעו בה. - ביטול עובד — מחיקת ה־ref משחזרת את השושלת האמיתית מיד, ו־Gitcito מתעד את ההרכבה כפעולה הניתנת לביטול כמו כל דבר אחר.
core.useReplaceRefs=falseגורם ל־git להתעלם מכולן בבת אחת. המתג כאן כותב בדיוק את זה, והחלון אומר זאת כשהוא כבוי, כי מאגר שמתעלם בשקט מההחלפות של עצמו הוא מקום מבלבל.
משורת הפקודה, git --no-replace-objects log מציג את ההיסטוריה האמיתית בלי לשנות
שום הגדרה.
מתי להושיט יד לזה במקום לכתיבה מחדש
| מטרה | כלי |
|---|---|
| השכפול גדול מדי, ההיסטוריה בסדר | הרכבה — שום דבר לא נכתב מחדש, הפיך |
| סוד או בלוב ענק חייבים להיעלם | הסרת קובץ מההיסטוריה — כתיבה מחדש אמיתית |
| רק רוצים להוריד פחות פעם אחת | git clone --depth — רדוד, בלי refs לנהל |
הרכבה לא מסירה כלום. אם הסיבה שאתם רוצים את הקומיטים הישנים בחוץ היא שהם מכילים משהו שמעולם לא היה צריך להיכנס לקומיט, זה העמוד הלא נכון: האובייקטים עדיין שם, עדיין ניתנים להבאה לפי sha, ועדיין בכל שכפול קיים.
מגבלות ששווה להכיר
- מה שאתם רואים מפסיק להתאים למה ששמור. זו התכונה, וזו הסכנה. כל מי שמנפה באגים בשכפול עם החלפות צריך לדעת שהן קיימות.
- החלפות לא נוסעות כברירת מחדל, ולכן ה־
git logשל עמית ושלכם יכולים לחלוק זה על זה בצדק מלא. - החלפה יכולה להסתיר קומיט מכלים, לא מ־git.
git cat-fileוסייר האובייקטים עדיין פותחים את המקורי לפי sha. - Gitcito אינו מציע
git replace --edit(כתיבה מחדש של תוכן אובייקט ביד). זו עבודה של עורך טקסט על אובייקט גולמי, וכדור ברגל עם ממשק סביבו.
ראו גם: סייר האובייקטים · הסרת קובץ מההיסטוריה · תחזוקת המאגר