'Git reset --hard HEAD ~ 1' ve 'git reset --soft HEAD ~ 1' arasındaki fark nedir?


Yanıtlar:


184

git resetbeş "mod" biliyor: yumuşak, karışık, sert, birleştirme ve tutma. İlk üçünden başlayacağım, çünkü bunlar genellikle karşılaşacağınız modlar. Bundan sonra güzel bir küçük bonus bulacaksınız, bu yüzden bizi izlemeye devam edin.

yumuşak

Kullanırken git reset --soft HEAD~1geçerli daldan son yürütmeyi kaldırırsınız, ancak dosya değişiklikleri çalışma ağacınızda kalır . Ayrıca değişiklikler dizininizde kalacaktır, bu nedenle a ile takip etmek, git commitdaha önce "kaldırdığınız" kaydetme ile aynı değişikliklerle bir kayıt oluşturacaktır.

karışık

Bu varsayılan moddur ve soft ile oldukça benzerdir. git reset HEAD~1Sizinle bir yürütmeyi "kaldırırken" , değişiklikleri çalışma ağacınızda tutacak, ancak dizinde tutmayacaksınız; bu nedenle, kaydetmeyi "yeniden yapmak" istiyorsanız, kaydetmeden git addönce değişiklikleri ( ) eklemeniz gerekir .

zor

Kullanırken git reset --hard HEAD~1, olur tüm uncommited değişiklikleri kaybetmek son gerçekleşen değişiklikler taahhüt ek olarak. Değişiklikler çalışma ağacınızda git statuskalmayacaktır, bu nedenle bir komut vermek size deponuzda herhangi bir değişiklik olmadığını söyleyecektir.

Bununla dikkatli olun. Asla takip edilmeyen git(konuş: taahhüt edilmiş veya en azından dizine eklenmemiş) beklenmeyen değişiklikleri yanlışlıkla kaldırırsanız , bunları tekrar kullanmanın bir yolu yoktur git.

Bonus

Tut

git reset --keep HEAD~1ilginç ve kullanışlıdır. Yalnızca geçerli HEAD ve verilen commit arasında farklı olan dosyaları sıfırlar . Bu dosyalardan herhangi birinde değişiklik yapılmamışsa sıfırlamayı iptal eder. Temelde daha güvenli bir versiyonu gibi davranır hard.

Bu mod, bir dizi değişikliğiniz olduğunda ve bu değişiklikleri kaybetmeden farklı bir şubeye geçmek istediğinizde (örneğin, yanlış dalda çalışmaya başladığınızda) özellikle yararlıdır.


Git reset belgelerinde bunun hakkında daha fazla bilgi edinebilirsiniz .

Not
Bir commit'i git resetkaldırmak için yaptığınızda , commit gerçekten kaybolmaz, sadece ona veya çocuklarından herhangi birine işaret eden bir referans yoktur. "Silinen" bir kaydı, git resetSHA-1 anahtarını bularak, örneğin git reflog.


1
Genelde kullanmamız gerekenlerin bu 3 olduğuna katılmıyorum. Bunlar ilk mevcut olan 3'tü , bu yüzden insanlar bu 3 hakkında daha fazla konuşuyorlar, ancak --hardneredeyse hiçbir zaman yapılacak doğru şey değil, çünkü --keepçok daha güvenli ve --hardişe yarayan senaryoların çoğu için geçerli . Parmaklarınızı kullanmak için eğitmek --keepsizi bir gün kurtarabilir ...
Matthieu Moy

Bence önermek deneyin vermedi gereken bu bir karşılaştığında çoğu zaman komutlar vardır sadece o, bunları kullanın. Cevabı uygun gördüğünüz şekilde düzenlemekten çekinmeyin.
Sascha Wolf

Biraz daha fazla ayrıntı eklemek için git reset --soft HEAD ~ 1'den sonra, son kaydetmeyi burada gösterildiği gibi korunmuş eski dizinle yeniden kullanmak için git commit --reuse-message = HEAD @ {1} kullanın. Stackoverflow.com/a/ 25930432/2883282
englealuze

3
@MatthieuMoy, üç yıl geç ama üzerine bir bölüm ekledim keep. ;)
Sascha Wolf

Son kaydetmeyi nasıl geri alabilirim? Lütfen yardım et. Git reset --soft HEAD ~ 1 kullanırsam şunu alırım: ölümcül: belirsiz bağımsız değişken 'HEAD ~ 1': bilinmeyen revizyon veya çalışma ağacında olmayan yol. Yolları revizyonlardan ayırmak için '-' kullanın, şunun gibi: 'git <command> [<revision> ...] - [<file> ...]'
elvis

8

Git sıfırlamanın 5 ana modu vardır: yumuşak, karışık, birleştirilmiş, zor, sakla . Aralarındaki fark, baş, aşama (dizin), çalışma dizini değiştirmek veya değiştirmemektir .

Git reset --hard baş, dizin ve çalışma dizinini değiştirecektir.
Git reset --soft yalnızca başlığı değiştirir. Dizinde değişiklik yok, çalışma dizini.

Diğer bir deyişle, taahhüdünüzü geri almak istiyorsanız, --soft yeterince iyi olmalıdır. Ancak bundan sonra hala dizininizde ve çalışma dizininizde hatalı işlemeden değişiklikler var. Dosyaları değiştirebilir, düzeltebilir, dizine ekleyebilir ve yeniden kaydedebilirsiniz.

--Hard ile, projenizde tamamen temiz bir sayfa açarsınız. Sanki son işlemden itibaren herhangi bir değişiklik olmamış gibi. İstediğinizin bu olduğundan eminseniz, ilerleyin. Ancak bunu yaptığınızda, son taahhüdünüzü tamamen kaybedeceksiniz. (Not: Kayıp kaydı kurtarmanın hala yolları vardır).


5

Bu, reset komutunun açıklamasını grafik olarak gösteren faydalı bir makaledir.

https://git-scm.com/docs/git-reset

Sıfırla - sabit, kontrol etmeden çalışma kopyanızın üzerine yazdığı için oldukça tehlikeli olabilir, bu nedenle dosyayı hiç teslim etmediyseniz, yok olur.

Kaynak ağacına gelince, taahhütleri geri almanın hiçbir yolu yok. Yine de büyük olasılıkla kapakların altında sıfırlama kullanırdı


Resmi belgelere bağlantı için +1. Ayrıca git reset --help(bence) bu beş modu veya en azından OP tarafından sorulan ikisini oldukça iyi açıklayanlardan da bahsedeceğim .
ThanksForAllTheFish

1
Bağlantı koptu. Muhtemelen şu anki sürüm budur: git-scm.com/docs/git-reset
Kiki Jewell

1

Git reset --hard ve git reset --soft arasındaki temel fark budur:

--soft

İndeks dosyasına veya çalışma ağacına hiç dokunmaz (ancak tüm modların yaptığı gibi, kafayı sıfırlar). Git statüsünün dediği gibi bu, tüm değiştirilmiş dosyalarınızı "Değişiklikler yapılacak" olarak bırakır.

--hard

Dizini ve çalışma ağacını sıfırlar. O zamandan beri çalışma ağacındaki izlenen dosyalarda yapılan tüm değişiklikler atılır.


1
Aradığım buydu. Kısa ve öz.
Kasım
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.