Yanıtlar:
Bu üç komutun tamamen farklı amaçları vardır. Uzaktan bile benzer değiller.
git revert
Bu komut, önceki bir işlemdeki değişiklikleri geri alan yeni bir işlem oluşturur. Bu komut projeye yeni geçmiş ekler (mevcut geçmişi değiştirmez).
git checkout
Bu komut, depodaki içeriği denetler ve çalışma ağacınıza koyar. Komutun nasıl çağrıldığına bağlı olarak başka efektler de olabilir. Örneğin, şu anda üzerinde çalıştığınız dalı da değiştirebilir. Bu komut geçmişte herhangi bir değişiklik yapmaz.
git reset
Bu komut biraz daha karmaşık. Aslında nasıl çağrıldığına bağlı olarak birkaç farklı şey yapar. Dizini değiştirir ("hazırlama alanı" olarak adlandırılır). Veya şu anda bir şube başkanının işaret ettiği şeyi değiştirir. Bu komut mevcut geçmişi değiştirebilir (bir dalın başvurduğu taahhüdü değiştirerek).
Projenin tarihinde bir yerde bir taahhüt yapılmışsa ve daha sonra taahhüdün yanlış olduğuna ve yapılmaması gerektiğine karar verdiyseniz, git revert
iş için bir araçtır. Geçmişteki "geri al" ı kaydederek, kötü taahhüdün getirdiği değişiklikleri geri alır.
Çalışma ağacınızdaki bir dosyayı değiştirdiyseniz, ancak değişikliği taahhüt git checkout
etmediyseniz, dosyanın depodan yeni bir kopyasını teslim almak için kullanabilirsiniz .
Bir taahhütte bulunduysanız ancak başkalarıyla paylaşmadıysanız ve istemediğinize karar verirseniz git reset
, geçmişi yeniden yazmak için kullanabilirsiniz , böylece bu taahhüdü hiç yapmamışsınız gibi görünür.
Bunlar olası kullanım senaryolarından sadece birkaçıdır. Bazı durumlarda yararlı olabilecek başka komutlar da vardır ve yukarıdaki üç komutun başka kullanımları da vardır.
git reset
ve git checkout
yapabileceği birçok durum var . "Uzaktan bile benzer olmadıklarını" söylemek sadece aşırı abartı değildir: uzaktan bile doğru değildir. Bu iki komut, bazıları tamamen çakışan birçok farklı şey yapabilir. Örnek: git reset --hard
ve git checkout -- .
aynı şeyi yapacak. Ve mantıklı konuşmak gerekirse, git reset --hard <path>
ve git checkout <path>
ayrıca aynı şeyi yapmalıdır - git ancak bunu yaparken engeller. Bu iki komutu karıştırmak ÇOK kolaydır.
git reset --hard <path>
senin gibi git checkout <path>
iki komutları bir şey yapmak kesin çünkü tamamen farklı. git reset
Git'e HEAD'e farklı bir taahhüde geçmesini söyler. git checkout
Öte yandan Git'ten HEAD ile hiçbir şey yapmasını istemiyor. HEAD'i yalnız bırakır ve yalnızca bir dosyayı denetler. Evet, onları benzer etkilere sahip olacak şekilde üretebilirsiniz. Ama aslında yaptıkları tamamen farklı.
Diyelim ki taahhütleriniz vardı:
C
B
A
git revert B
, değişiklikleri geri alan bir taahhüt oluşturur B
.
git revert A
, değişikliklerin geri alınmasını sağlayan A
, ancak değişikliklerinB
Değişiklikler eğer unutmayın B
değişikliklere bağlıdır A
, bir geri dönme eğilimi A
mümkün değildir.
git reset --soft A
, taahhüt tarihini ve deposunu değiştirecek; evreleme ve çalışma dizini hala durumunda olacaktır C
.
git reset --mixed A
, taahhüt geçmişini, havuzu ve sahnelemeyi değiştirecek; çalışma dizini hala durumunda olacak C
.
git reset --hard A
, taahhüt geçmişini, havuzu, sahnelemeyi ve çalışma dizinini değiştirecek; A
tamamen durumuna geri döneceksiniz .
git revert
önceki bir taahhüdü geri almak için kullanılır. Git'te, daha önceki bir taahhüdü değiştiremez veya silemezsiniz. (Aslında yapabilirsiniz, ancak sorunlara neden olabilir.) Bu nedenle, önceki taahhüdü düzenlemek yerine, eski bir önceliği düzenlemek yerine geri döndürme yeni bir taahhüdü tanıtır.git reset
henüz çalışmayan dizindeki değişiklikleri geri almak için kullanılır.git checkout
bir dosyayı başka bir işlemden geçerli çalışma ağacınıza kopyalamak için kullanılır. Dosyayı otomatik olarak işlemez.git reset --soft
yalnızca git reset --hard
HEAD'i, HEAD'i ve çalışma dizini sıfırlar.
git checkout
çalışma ağacınızı değiştirir,git reset
üzerinde bulunduğunuz şubeye hangi referansı işaret ettiğini değiştirir,git revert
taahhütte bulunmayı geri alma değişiklikleri ekler.git reset
yalnızca bir dalın işaret ettiği taahhüdü değiştirmekle kalmaz , aynı zamanda dosyaları dizinden çıkarmak için kullanılır ve çalışma kopyasını git reset --mixed
(varsayılan) ile değiştirebilir .
Reset (Sıfırlama) - Devreye sokma seviyesinde sıfırlama, bir şubenin ucunu farklı bir işleme geçirmenin bir yoludur. Bu, geçerli daldaki taahhütleri kaldırmak için kullanılabilir.
Geri Al - Geri alma , yeni bir taahhüt oluşturarak bir taahhüdü geri alır. Bu, değişiklik geçmişini yeniden yazma şansı olmadığından değişiklikleri geri almanın güvenli bir yoludur. Bunu mevcut varoluş geçmişini değiştiren git reset ile karşılaştırın. Bu nedenle, genel bir şubedeki değişiklikleri geri almak için git geri döndürme kullanılmalı ve özel bir şubedeki değişiklikleri geri almak için git reset ayrılmalıdır.
Bu bağlantıya bir göz atabilirsiniz - Sıfırlama, Ödeme ve Geri Dön
Ağacı bozduysanız ancak kodu işlemediyseniz, kullanabilirsiniz git reset
ve yalnızca bir dosyayı geri yüklemek istiyorsanız, kullanabilirsiniz git checkout
.
Ağacı kırıp kodu işlediyseniz kullanabilirsiniz git revert HEAD
.
http://book.git-scm.com/4_undoing_in_git_-_reset,_checkout_and_revert.html