Çalışma kopyasını geçici olarak belirli bir Git taahhüdüne geçirme


248

Bundan sonra yapılan tüm taahhütleri kaybetmeden belirli Git taahhüdüne nasıl geçilir ?

Yerel dosyaların değiştirilmesini istiyorum, ancak taahhütlerin veritabanı bozulmadan kalacak, sadece geçerli konum işaretçisi seçili olan yürütmeye ayarlanmış.

Dosyaların durumunu belirli bir işleme koymak, projeyi çalıştırmak ve bittiğinde dosyaları son işleme geri yüklemek istiyorum.

Tüm projenin klasörünü sıkıştırmadan nasıl yapılır?


Yanıtlar:


344

Belli bir şubedeyseniz mybranch, devam edin ve git checkout commit_hash. Daha sonra şubenize geri dönebilirsiniz git checkout mybranch. Bugün aynı hatayı ikiye bölen aynı oyun vardı :) Ayrıca, git bisect hakkında bilmeniz gerekir .


6
Sadece git checkout commit_hashtemiz bir depoda iseniz ve dallanma yapmanız gerekmediğini unutmayın. Bazı kullanım durumları için (benimki gibi) daha kolay olabilir.
enderland

@enderland: HEAD normalde bir şubeye işaret ediyor :)
Alexander Pavlov

Kısmi bir onaylama kabul edilmediğinden, tüm sağlama karmasını kullanmak zorunda kaldığım bir sorun yaşadım.
mightyiam

6
Referans için oy verin git bisect; ne son derece kullanışlı bir araç!
Niek

54

İlk olarak, git loggünlüğü görmek için kullanın , istediğiniz taahhüdü seçin, taahhüdü tanımlamak için kullanılan sha1 karma değerini not alın. Sonra, koş git checkout hash. Bitirdikten sonra git checkout original_branch. Bu, KAFAYI hareket ettirmeme avantajına sahiptir, sadece çalışma kopyasını belirli bir işleme geçirir.


4
Bence demek istiyorsun git checkout <original_branch>. git checkout HEADetkili bir NOOP
Abe Voelker

3
git reset --hard <hash>geçerli şubenin KAFASINIZI git checkout <hash>değiştirirken, herhangi bir şubeyi değiştirmeyen müstakil bir ödeme alırsınız ve bu yanıtta gösterildiği gibi şubenizin orijinal karma kimliğini bilmeden kolayca geri dönebilirsiniz.
jofel

@Femaref Yeni Başlayanın sorusu: bu sorunun bağlamı göz önüne alındığında (geçici olarak daha önceki bir taahhüde geçme), KAFA hareket ettirmek veya hareket ettirmemek neden bir avantaj veya dezavantaj olsun?
natty hakkında ceviz

@nuttyaboutnatty Düzenlememin onaylandığı varsayılarak, sorunuzu cevaplamalıdır. HEAD aslında her durumda taşınır; ancak bir kasada HEAD'nin işaret ettiği dal referansı kendisi taşınmaz.
echristopherson

15

Buradaki diğer yanıtlara ek olarak, git checkout <the-hash-you-want>kullandığınız yere geri dönebileceğinizi bilmeye değer olduğunu gösteren :

git checkout @{-1}

Bu genellikle aşağıdakilerden daha uygundur:

git checkout what-was-that-original-branch-called-again-question-mark

Tahmin edebileceğiniz gibi, sizi git checkout @{-2}iki git checkoutsaniye önce bulunduğunuz şubeye götürecek ve benzer şekilde diğer numaralar için. Daha büyük sayılar için nerede olduğunuzu hatırlayabiliyorsanız, bunun için bir tür madalya almalısınız.


Ne yazık ki üretkenlik git checkout @{1}için sizi gelecekte olacağınız şubeye götürmez, ki bu bir utançtır.


1
Bunun git checkout -için stenografi takma adıdırgit checkout @{-1}
Nathanael

@Nathanael OMGOD , hiçbir şekilde ... bu her şeyi değiştirir! Güzel, teşekkürler! … Bunu yanıta dahil edecektim, ama genel @{n}sözdizimi hakkında bilgi sahibi olmak da çok faydalı . Cevabınızı kafa karıştırıcı olmadan yapmadan stenoyu eklemekte zorlandım. Bunun yerine yorumunuzu oyladım - umarım insanlar görecektir. Tekrar teşekkürler.
Benjohn

1
Sorun değil. Bu tartışma zaten asıl soruya teğet. Daha fazla bonus! Özellikleri bir sürümde birleştirmek için genellikle aynı sözdizimini kullanıyorum. örneğin git merge -, en son teslim aldığınız dalı şu anda teslim alınmış olan şubeyle birleştirmek için. Bu cd -bash gibi .
Nathanael
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.