Replace ve graft
git replace git'e şunu söyler: A nesnesini okumak üzere olduğun her yerde
onun yerine B'yi oku. Hiçbir şey yeniden yazılmaz. Hiçbir sha değişmez. Her
commit tam olarak olduğu yerde kalır — git yalnızca yolunun üzerinde başka bir
yere bakar.
Daha küçük bir klon isteyene kadar bu kulağa bir merak konusu gibi gelir. O noktada geçmişi yeniden yazmanın dürüst alternatifidir: bir commit'i hiçbir ebeveyne graft'layın, ondan öncesi log'dan, grafikten ve oradan yapılan her klondan düşer — üstelik hâlâ saklanır, hâlâ fetch edilebilir ve geri gelmesi silinmiş tek bir ref uzaklıktadır.
⌘K → Replace ve graft.

Graft'lama
| Ona verdiğiniz | Elde ettiğiniz |
|---|---|
| Bir commit, ebeveyn yok | O commit geçmişin başlangıcı olur |
| Bir commit, bir veya daha fazla ebeveyn | Gerçekte durduğu yer yerine oraya bağlanır |
İlginç olan ikinci biçim. Tam geçmişi bir arşiv deposunda tutun, çalıştığınız depoyu kısaltın ve arşivin ucuna işaret eden bir graft ikisini yeniden birleştirsin — GitHub'ın, yine de derinleştirilebilen bir sığ klon sunmak için kullandığı numaranın aynısı.
Hiçbir ebeveyne graft'lamak önce sorar, çünkü "geçmiş gitti" ile "geçmiş
gizlendi" log'dan bakınca birebir aynı görünür ve hiç de aynı şey değildir.
Nesneler bir gc onları budayana kadar hayatta kalır; bkz.
bakım.
Onunla yaşamak
Değiştirmeler ref'tir, refs/replace/ altında. Bunun bilmeye değer üç
sonucu var:
- Push edilene kadar yereldir:
git push origin "refs/replace/*"onları paylaşır ve onlarsız klonlayan herkes dokunulmamış geçmişi görür. - Geri alma çalışır — ref'i düşürmek gerçek soy ağacını anında geri getirir ve Gitcito graft'ı da her şey gibi geri alınabilir bir eylem olarak kaydeder.
core.useReplaceRefs=falsegit'in hepsini birden yok saymasını sağlar. Buradaki anahtar tam olarak bunu yazar ve kapalıyken pencere bunu söyler, çünkü kendi değiştirmelerini sessizce yok sayan bir depo kafa karıştırıcı bir yerdir.
Komut satırından git --no-replace-objects log hiçbir ayarı değiştirmeden gerçek
geçmişi gösterir.
Yeniden yazma yerine ne zaman buna uzanmalı
| Amaç | Araç |
|---|---|
| Klon çok büyük, geçmişte sorun yok | Graft — hiçbir şey yeniden yazılmaz, geri alınabilir |
| Bir sır ya da devasa bir blob yok olmalı | Bir dosyayı geçmişten kaldırma — gerçek bir yeniden yazma |
| Sadece bir kerelik daha az indirmek | git clone --depth — sığ, yönetilecek ref yok |
Graft hiçbir şeyi kaldırmaz. Eski commit'leri istemenizin sebebi hiç commit'lenmemesi gereken bir şey içermeleriyse, burası yanlış sayfa: nesneler hâlâ orada, hâlâ sha ile fetch edilebilir ve mevcut her klonun içinde.
Bilmeye değer sınırlar
- Gördüğünüz şey saklananla örtüşmeyi bırakır. Özellik de budur, tehlike de. Değiştirmeler içeren bir klonda hata ayıklayan herkesin bunların varlığını bilmesi gerekir.
- Değiştirmeler varsayılan olarak yolculuk etmez, dolayısıyla bir meslektaşınızın
git logçıktısıyla sizinki haklı olarak birbirini tutmayabilir. - Bir değiştirme, bir commit'i araçlardan gizleyebilir, git'ten gizleyemez.
git cat-fileve nesne gezgini orijinali sha ile hâlâ açar. - Gitcito
git replace --editsunmaz (bir nesnenin içeriğini elle yeniden yazmak). O, ham bir nesne üzerinde bir metin editörünün işidir ve etrafına arayüz konmuş bir ayak kurşunlama aracıdır.
Ayrıca bakınız: Nesne gezgini · Bir dosyayı geçmişten kaldırma · Depo bakımı