Genel olarak, git reset
iş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 B
oraya 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 B
koş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
. D
Bu 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 reset
sonraki 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
--hard
işinizi gerçekten kaybetmenize neden olabilir. Çalışma ağacınızı değiştirir.
git reset [options] commit
taahhütleri kaybetmenize (bir nevi) neden olabilir. Yukarıdaki oyuncak örneğinde, taahhüdü kaybettik C
. Hala depoda ve git reflog show HEAD
ya 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 reset
sı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 add
taahhütte bulunmaya hazırlanırken söylediğiniz şey orasıdır.
--hard
her ş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 --hard
demektir : git reset --hard HEAD
yani ş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
.
--mixed
varsayılan, yani git reset
anlamı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 ...
).
--soft
dizine 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 committed
git 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.
--merge
kı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 merge
aslı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 --merge
dizini sıfırlar ( --mixed
tü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. ( HEAD
birleş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 reset
iç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~1
ve 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^2
Taahhü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^^2
birinci ebeveyn ikinci üst HEAD
düzgün ya da HEAD^^^
denktir, HEAD~3
.