SORU
27 Mart 2010, CUMARTESİ


&Quot;git reset" düz İngilizce ne yaptığını açıklayabilir misin?

interesting posts git reset hakkında inceliklerini açıklayan görmedim.

Bu konuda daha fazla bir şey okudum ne yazık ki, daha tam olarak anlamadığım gibi görünüyor. SVN bir geçmişim var gel ve Git tamamen yeni bir paradigma. Mercurial kolayca aldım ama Gıt çok daha teknik.

git reset hg revert, bulunur ama farklılıklar var gibi görünüyor bence.

Tam olarak git reset ne yapar? Lütfen detaylı açıklamalar hakkında şunları içerir:

  • seçenekleri --hard, --soft --merge;
  • kullanın HEAD^ HEAD HEAD~1; . garip gösterimde
  • beton kullanım durumları ve iş akışı;
  • çalışma kopyası, HEAD ve genel stres seviyesi sonuçları.

CEVAP
27 Mart 2010, CUMARTESİ


Doktorlar bunun için gerçekten çok iyi olduğunu düşünüyorum - belki de git onları gerçekten de anlaşılmak için çalıştığını bir anlamda biraz ihtiyacım var. Eğer dikkatlice okumak için zaman ayırın, özellikle de bu tablolar, çeşitli seçenekleri ve durumlar için dizin ve çalışma ağacındaki dosyaların Birleşik Devletleri detaylandırma faydalıdır. (Ama evet, çok yoğun çalışıyorlar - ben sadece onları okumak ve onaylamak için biraz zaman alır zaten bildiğim bir şeyi söylemek.)

Genel olarak, git reset fonksiyonu mevcut şube alıp başka bir yere nokta sıfırlamak ve muhtemelen dizin ve çalışma ağacı boyunca getir. Eğer ana şube (teslim alınmış) böyle ise daha somut olarak,:

- A - B - C (HEAD, master)

ve master C git reset B oraya taşımak için kullanamazsınız B işaret etmek istediğini fark:

- A - B (HEAD, master)      # - C is still here, but there's no branch pointing to it anymore

Anlatılanlar: Bu bir ödeme farklıdır. Eğer git checkout B, çalıştırmak istiyorsanız bu olsun istiyorum:

- A - B (HEAD) - C (master)

Müstakil bir devletin BAŞKANI oldu. 20**, iş ağaç, dizin tüm B maç ama ana şube C geride kaldı. Eğer bu noktada D taahhüt yaparsanız, istediğiniz şey muhtemelen değil bu alırsınız:

- A - B - C (master)
       \
        D (HEAD)

Unutmayın, sıfırlama, sadece bir şube güncelleştirmelerini tamamlar yapmaz işlemek için bir işaretçi () farklı işlemeye işaret. Gerisi sadece dizini ve çalışma ağaç ne detay.

Durumlarda kullanın

Bir sonraki bölümde çeşitli seçenekler benim açıklamaları içinde git reset ana kullanım durumları çok koruyorum. Öyle olduğu için çok çeşitli şeyler; ortak iplik tüm almalarını sıfırlama Şubesi, dizin ve/veya iş tree point/maç verilen bir taahhüt.

Şey dikkatli olmak

  • --hard gerçekten işe kaybetmesine neden olabilir. İş ağacı değiştirir.

  • git reset [options] commit çeşit taahhüt kaybetmesine neden olabilir. Oyuncak yukarıdaki örnekte, C taahhüt kaybettik. Hala repo ve git reflog show HEAD ya da aslında herhangi bir şube erişilebilir değil ama git reflog show master, artık bakarak bulabilirsiniz.

  • Git 30 gün sonra kalıcı olarak tamamlar, ama yine de bir şube üzerine C kurtarabilirsiniz kadar böyle (git checkout C; git branch <new branch name>) siler.

Argümanlar

Man sayfasına Paraphrasing, en yaygın kullanım şekli şöyledir verilen commit durumlarına verilen yolları sıfırlar git reset [<commit>] [paths...],. Eğer yolları sağlanan değilse, tüm ağacı sıfırlanır ve eğer sağlanan değil mi eğer işlemek, KAFASI (geçerli tamamlama) aldı. Bu gıt komutları (örneğin ödeme, fark, günlük, tam anlamı değişir gerçi) arasında ortak bir desen, çok da şaşırtıcı olmamalı.

Örneğin, git reset other-branch path/to/foo sıfırlar her şey yolunda//foo için haliyle diğer-şube, git reset -- . sıfırlar geçerli dizini için kendi devlet BAŞKANI ve basit git reset sıfırlar herşeyi yerli Devlet BAŞKANI.

Ana ağaç ve dizin seçenekleri çalışma

Sıfırlama sırasında iş ağaç ve dizin ne olacağını kontrol etmek için dört ana seçenek vardır.

Unutmayın, dizin gıt "alan" bunları hazırlık git add taahhüt dediğimde. eylemi yapıyor

  • --hard her şey için sıfırlayın. taahhüt maç yapar. Bu en kolay anlamak için, muhtemelen. Yerel değişiklikleri her dayak yemişe döndüm. Bir birincil kullanımı işinizi fırlatıp, ama taahhüt geçiyor: git reset --hard 39*, yani* şube değişikliği yok ama tüm yerel değişiklikleri kurtulmak. Diğeri de sadece bir yerden başka bir yere bir şube taşıma ve dizin/senkronize ağaç iş tutuyor.Bu gerçekten işe ağacınızı değiştirir, çünkü seni kaybetmek iş yapabilir.reset --hard çalıştırmadan önce yerel çalışma atmak istiyorum çok çok emin olun.

  • --mixed varsayılan, 42 *yani* demek 43**. Endeks, ama iş ağaç sıfırlar. Bu tüm dosyaları sağlam olduğu anlamına gelir, ama orijinal uygulayın ve bir sıfırlama arasında herhangi bir fark yerel değişiklikler (ya da izlenmeyen dosyaları) gıt durumu olduğu gibi görünecektir. Bazı kötü tamamlar mı hayal ettin bunu kullanın, ve yeniden değerlendirmeyi çözebilir, yaptığın işe devam etmek istiyorum. Tamamlamak için, dizini yeniden (git add ...) dosya eklemek gerekir.

  • --soft dizin dokunmazyaağaç iş. Tüm dosyaları --mixed ama tüm değişiklikleri gıt durumu (yani işlemek için hazırlık kontrol) changes to be committed olarak göstermek gibi sağlam. Bazı kötü işleyen yaptığınızın farkına ne zaman bu kullanmak, ama işin iyi - tüm yapmanız gereken farklı bir şekilde uygulanır. Endeks Eğer isterseniz hemen işleyebilirsin dokunulmamış, - sonuç işlemek önce reset neredeydin olarak hepsi aynı içeriğe sahip olacak.

  • --merge en son eklenen ve başarısız bir birleştirme iptal size yardımcı olmaktır. Bu git merge aslında kirli bir iş, bir ağaç (yerel değişiklikler) ile birleştirme girişimi bu değişiklikleri dosyaları ile birleştirme etkilenmemiş olduğu sürece izin verir, çünkü bu gereklidir. git reset --merge dizin (--mixed - tüm değişiklikler yerel değişiklikler olarak göstermek gibi) sıfırlar ve dosyalar etkilenen birleştirme, ama yalnız Diğerleri yaprakları sıfırlar. Umarım bu kötü birleştirme önce ne kadar her şey geri gelecektir. Sadece birleştirme uzakta sıfırlama, aslında Şubesi taşımak istemiyorum çünkü genellikle git reset --merge olarak kullanırsın (git reset --merge HEAD anlamına gelir). (HEAD birleştirme başarısız oldu bu yana henüz güncelleme, olmadı)

    Daha somut, varsayalım ... değiştirilmiş dosyaları A ve B, ve girişimi için birleştirme bir şube olan değiştirilmiş dosyaları C ve D birleştirme başarısız olması için bir neden ve karar iptal. git reset --merge kullanın. C ve D HEAD, onlar nasıl geri getiriyor ama denenen bir parçası değillerdi beri yalnız B, birleştirme için değişiklikler bırakır.

Garip gösterimde

"Gösterim" (HEAD^ 58*) söz sadece taahhüt belirtmek için kısaltma, 3ebe3f6 gibi karma bir isim kullanmak zorunda kalmadan. garip Tam örnekler ve sözdizimi ile ilgili bir sürü git-rev-ayrıştırmak için man sayfasına, "specifying revisions" section belgelenmiştir. Şapka ve tilde aslında different things demek

  • HEAD~ HEAD~1 kısa ve taahhüt ilk veli demektir. HEAD~2 commit ilk ebeveynin ilk üst anlamına gelir. HEAD~n gibi düşün "n BAŞ önce tamamlar" veya "KAFA inci nesil atası".
  • HEAD^ (ya da HEAD^1) da tamamlama ilk veli demektir. HEAD^2 bu taahhüt anlamına gelirikinciüst. Unutmayın, birleştirme işlemek normal bir iki veli, ilk üst - birleştirilmiş tamamlama ve ikinci üst birleştirilmiş olduğunu taahhüt. Genel olarak, birleştirir aslında keyfi olarak birçok anne-baba (ahtapot birleştirir).
  • ^ ~ operatörler olabilir birlikte sinirli gibi HEAD~3^2, ikinci ebeveynin üçüncü nesil atası HEAD, HEAD^^2 ikinci ana ortaklığın ilk ana HEAD hatta HEAD^^^ eşdeğerdir HEAD~3.

caret and tilde

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DominicFear

    DominicFear

    30 Kasım 2006
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • 趣味そうこ♪

    趣味そう

    3 Mart 2010