Git Revert, Checkout ve Reset arasındaki fark nedir?


274

Ben geri veya geri alma dosyaları ve projeleri bir önceki durumuna ve arasındaki farkı anlamıyorum nasıl öğrenmeye çalışıyorum git revert, checkoutve reset. Görünüşe göre aynı amaç için neden 3 farklı komut var ve ne zaman biri diğerinden daha fazla seçmeli?

Yanıtlar:


461

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).

Bu komutları kullanma

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 revertiş 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 checkoutetmediyseniz, 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.


13
Bu yüzden üç komut bir işi UNDO için kullanılabilir, bu da onların "tamamen farklı" olmadıkları anlamına gelir. Aynı kavram, farklı bağlamlar.
Bruno Santos

16
@BrunoSantos: Şamdanlar, kurşun borular, hançerler ve ip, insanları öldürmek için kullanılabilir, ancak bu, bunların hiçbirinin özellikle benzer olduğu anlamına gelmez.
Dan Moulding

12
@Dan Mounlding - Aslında, aynı şeyi yapabileceği git resetve git checkoutyapabileceğ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 --hardve 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.
DanGordon

5
@DanGordon Muhtemelen burada sadece bir fikir farkımız olacağını fark ediyorum. Yine de, bir açıklama yapmam gerektiğini hissediyorum. Sen yapamaz git reset --hard <path>senin gibi git checkout <path>iki komutları bir şey yapmak kesin çünkü tamamen farklı. git resetGit'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ı.
Dan Moulding

46

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 Bdeğişikliklere bağlıdır A, bir geri dönme eğilimi Amü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; Atamamen durumuna geri döneceksiniz .


1
Çok sezgisel cevap .. nasıl ödeme hakkında
MJ Studio

29
  • 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 checkoutbir 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.

7
"Git reset" konusunda yanıldığınıza inanıyorum. "git reset", HEAD'inizi önceki işlemlerden birine sıfırlar, çalışma dizininizi sıfırlamaz. Çalışma dizini "git checkout [dosyaadı]" ile "sıfırlandı"
luigi7up

11
git reset --softyalnızca git reset --hardHEAD'i, HEAD'i ve çalışma dizini sıfırlar.
Ehryk

git reset --mixed (varsayılan): uncommit + staj değişiklikleri
NattyC

21
  • 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.

4
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 .

git reset --soft: tamamlanmamış değişiklikler, değişiklikler aşamalı olarak bırakılır (dizin). git reset --mixed (varsayılan): uncommit + unstage değişiklikleri, değişiklikler çalışma ağacında bırakılır. git reset --hard: uncommit + untage + delete değişiklikleri, hiçbir şey kalmadı.
NattyC

6

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.