Genel olarak, git resetişlevi geçerli dalı alıp başka bir yere işaret edecek şekilde sıfırlamak ve büyük olasılıkla dizin ve çalışma ağacını yan yana getirmektir. Daha somut olarak, ana dalınız (şu anda teslim alınmış) şu şekildeyse:
- A - B - C (HEAD, master)
ve ustanın C'yi değil B'yi göstermesini istediğinizi fark edersiniz, git reset Boraya taşımak için kullanırsınız :
- A - B (HEAD, master) # - C is still here, but there's no branch pointing to it anymore
Digression: Bu bir ödeme işleminden farklı. Eğer git checkout Bkoşsaydın şunu elde edersin:
- A - B (HEAD) - C (master)
Sonunda bağımsız bir HEAD durumuna geldiniz. HEAD, çalışma ağacı, dizinde tüm maç B, ancak ana şube geride kaldı C. DBu noktada yeni bir taahhütte bulunursanız , bunu elde edersiniz, bu muhtemelen istediğiniz şey değildir:
- A - B - C (master)
\
D (HEAD)
Unutmayın, sıfırlama işleminin taahhütte bulunmadığını, yalnızca farklı bir taahhüdü işaret edecek bir dalı (bir taahhüdün göstergesidir) günceller. Gerisi sadece endeksinize ve çalışma ağacınıza ne olduğuna dair detaylar.
Kullanım örnekleri
Bir git resetsonraki bölümdeki çeşitli seçeneklerin açıklamalarım dahilinde ana kullanım durumlarının çoğunu ele alıyorum. Gerçekten çok çeşitli şeyler için kullanılabilir; ortak iş parçacığı, hepsinin belirli bir taahhüdü işaret etmek / eşleştirmek için şube, dizin ve / veya çalışma ağacını sıfırlamayı içermesidir.
Dikkat edilmesi gerekenler
--hardişinizi gerçekten kaybetmenize neden olabilir. Çalışma ağacınızı değiştirir.
git reset [options] committaahhütleri kaybetmenize (bir nevi) neden olabilir. Yukarıdaki oyuncak örneğinde, taahhüdü kaybettik C. Hala depoda ve git reflog show HEADya da bakarak bulabilirsiniz git reflog show master, ama artık herhangi bir şubeden erişilebilir değil.
Git bu tür taahhütleri 30 gün sonra kalıcı olarak siler, ancak o zamana kadar C'yi bir şubeyi tekrar işaretleyerek kurtarabilirsiniz ( git checkout C; git branch <new branch name>).
Argümanlar
Man sayfasını açıklayan en yaygın kullanım, git reset [<commit>] [paths...]verilen yolların belirli bir taahhütten durumlarına sıfırlanacağı formdur . Yollar sağlanmazsa, tüm ağaç sıfırlanır ve taahhüt sağlanmazsa, HEAD (geçerli taahhüt) olarak alınır. Bu, git komutlarında (örn. Tam anlambilim farklı olsa da checkout, diff, log) yaygın bir kalıptır, bu yüzden çok şaşırtıcı olmamalıdır.
Örneğin, git reset other-branch path/to/foo/ dalında / foo yolundaki her şeyi diğer daldaki durumuna git reset -- .sıfırlar, geçerli dizini HEAD'deki durumuna git resetsıfırlar ve basit olan her şeyi HEAD'deki durumuna sıfırlar.
Ana çalışma ağacı ve dizin seçenekleri
Sıfırlama sırasında çalışma ağacınıza ve dizine ne olacağını kontrol etmek için dört ana seçenek vardır.
Unutmayın, endeks git'in "sahneleme alanı" dır - git addtaahhütte bulunmaya hazırlanırken söylediğiniz şey orasıdır.
--hardher şeyi sıfırladığınız işlemle eşleştirir. Muhtemelen anlaşılması en kolay olan budur. Tüm yerel değişiklikleriniz hızlanır. Birincil kullanım, işinizi havaya uçurmak, ancak anahtarları değiştirmemek git reset --harddemektir : git reset --hard HEADyani şubeyi değiştirmeyin, tüm yerel değişikliklerden kurtulun. Diğeri ise bir dalı bir yerden başka bir yere taşımak ve dizin / çalışma ağacını senkronize tutmak. Bu, gerçekten işinizi kaybetmenizi sağlayacak olanıdır, çünkü çalışma ağacınızı değiştirir. Çalıştırmadan önce yerel işleri atmak istediğinizden çok emin olun reset --hard.
--mixedvarsayılan, yani git resetanlamına gelir git reset --mixed. Dizini sıfırlar, ancak çalışma ağacını sıfırlamaz. Bu, tüm dosyalarınızın bozulmamış olduğu anlamına gelir, ancak orijinal işlem ile sıfırladığınız dosya arasındaki farklar git durumuna sahip yerel değişiklikler (veya izlenmemiş dosyalar) olarak görünür. Bunu bazı kötü taahhütlerde bulunduğunuzu fark ettiğinizde kullanın, ancak yaptığınız tüm işleri tutmak ve düzeltmek için devam etmek istiyorsunuz. Taahhüt etmek için dizine tekrar dosya eklemeniz gerekir ( git add ...).
--softdizine veya çalışma ağacına dokunmaz . Tüm dosyalarınız olduğu gibi sağlamdır --mixed, ancak tüm değişiklikler changes to be committedgit durumundaki gibi görünür (yani, işleme hazırlanırken kontrol edilir). Bazı kötü taahhütlerde bulunduğunuzu fark ettiğinizde bunu kullanın, ancak işin hepsi iyi - tek yapmanız gereken farklı bir şekilde tavsiye etmektir. Dizine dokunulmaz, böylece isterseniz hemen taahhütte bulunabilirsiniz - sonuçta elde edilen taahhüt, sıfırlamadan önce bulunduğunuz içerikle aynı olacaktır.
--mergekısa süre önce eklendi ve başarısız bir birleştirmeyi iptal etmenize yardımcı olmayı amaçlıyor. Bu gereklidir, çünkü git mergeaslında bu değişiklikler birleştirme işleminden etkilenmeyen dosyalarda olduğu sürece kirli bir çalışma ağacıyla (yerel değişikliklerle bir) birleştirmeye çalışmanıza izin verir. git reset --mergedizini sıfırlar ( --mixedtüm değişiklikler yerel değişiklikler olarak görünür ) ve birleştirme işleminden etkilenen dosyaları sıfırlar, ancak diğerlerini yalnız bırakır. Bu, umarım her şeyi kötü birleşmeden önceki haline geri getirir. Genellikle git reset --merge(anlam git reset --merge HEAD) olarak kullanırsınız çünkü aslında birleştirme işlemini sıfırlamak istiyorsunuz, aslında kolu hareket ettirmiyorsunuz. ( HEADbirleştirme başarısız olduğu için henüz güncellenmedi)
Daha somut olmak için, A ve B dosyalarını değiştirdiğinizi ve C ve D dosyalarını değiştiren bir dalda birleştirmeye çalıştığınızı varsayalım. Birleştirme bir nedenle başarısız olur ve iptal etmeye karar verirsiniz. Sen kullan git reset --merge. C ve D'yi bulundukları yere geri getirir HEAD, ancak birleştirme girişiminin bir parçası olmadığı için değişikliklerinizi yalnızca A ve B'ye bırakır.
Daha fazla bilmek ister misiniz?
Bunun man git resetiçin gerçekten çok iyi olduğunu düşünüyorum - belki de git onlar için gerçekten olsa batmak için çalışıyor yolu biraz bir his gerekir. Özellikle, dikkatlice okumak için zaman ayırırsanız, çeşitli seçenekler ve durumlar için dizin ve çalışma ağacındaki dosyaların durumlarını detaylandıran bu tablolar çok yararlıdır. (Ama evet, çok yoğundurlar - yukarıdaki bilgilerin çok büyük bir kısmını çok özlü bir şekilde aktarmaktadırlar.)
Garip gösterim
Bahsettiğiniz "garip gösterim" ( HEAD^ve HEAD~1), gibi bir karma adı kullanmak zorunda kalmadan, taahhütleri belirtmek için bir kısayoldur 3ebe3f6. Git-rev-ayrıştırma için man sayfasının "revizyonları belirleme" bölümünde , birçok örnek ve ilgili sözdizimiyle tam olarak belgelenmiştir . Şapka ve tilde aslında farklı şeyler ifade eder :
HEAD~kısaltmasıdır HEAD~1ve işlemin ilk ebeveyni anlamına gelir. HEAD~2, söz konusu taahhüdün ilk ebeveyninin ilk ebeveynidir. HEAD~n"HEAD'den önce n taahhütte bulunur" veya "HEAD'in n'inci nesil atası" olarak düşünün .
HEAD^(veya HEAD^1) aynı zamanda taahhüdün ilk ebeveyni anlamına gelir. HEAD^2Taahhüdün ikinci ebeveyni anlamına gelir . Unutmayın, normal birleştirme taahhüdünün iki ebeveyni vardır - ilk veli birleştirilen taahhüttür ve ikinci veli birleştirilen taahhüttür. Genel olarak, birleşmelerin keyfi olarak birçok ebeveyni olabilir (ahtapot birleşmeleri).
^Ve ~operatörler olarak, Yan yana dizilmiş olabilir HEAD~3^2, üçüncü nesil atası ikinci üst HEAD, HEAD^^2birinci ebeveyn ikinci üst HEADdüzgün ya da HEAD^^^denktir, HEAD~3.
