Belirli bir düzeltmeye git


582

Belirli bir projenin git deposunu klonladım. Dosyaları başlangıç ​​durumuna getirebilir miyim ve dosyaları incelerken en son revizyon 2, 3, 4 ... 'e gider miyim? Projenin nasıl geliştiğine dair bir genel bakış istiyorum.

Yanıtlar:


874

git checkout <sha1>Belirli bir taahhüdü kontrol etmek için kullanın .


2
Bunu yapabilirsin git log -n1. Ancak git checkoutbaşarısız olmadıkça , bu bir çaba kaybıdır.
Marcelo Cantos

2
İşe yarıyor. Tam sha1 (kısmi değil) kullanmak zorunda kaldım. Ve projeyi ikinci revizyona koymak istersem? git logşimdi sadece ilk taahhüdü gösteriyor, bir sonraki taahhüdün sha1'ini bulabilir miyim?
xralf

6
Benzersizliği garanti etmek için sadece sha1'den yeterli miktarda yararlanmanız gerekir. Belki şanssız bir tesadüfünüz vardı. Git'in "sonraki" taahhüdü hakkında bir fikri yoktur; tarih, tüm oklar geriye dönük bir DAG'dır. git log --onelineÇıktıyı referans için bir metin dosyasına çalıştırmalı ve yapıştırmalısınız (sağladığı kısaltılmış sha1 toplamlarının benzersiz olması garanti edilmektedir). Başka bir seçenek, geçmişiniz doğrusal ise, ilk işlemden sonuna kadar kaç işlem olduğunu masterve git checkout master~543(543 işlem varsa), o zaman git checkout master~542vb
Marcelo Cantos

20
ve "git checkout <sha1>" adresinden mevcut işleme nasıl geri dönülür?
ス レ ッ ク ス

6
@AlexanderSupertramp Şubeyi kontrol edin.
Marcelo Cantos

50

Belirli bir sürüme gitmek için aşağıdaki komutları çalıştırın. HASH-CODE alabilirsinizgit log --oneline -n 10

git reset --hard HASH-CODE

Not - git pull --rebaseAtılan tüm taahhütleri geri getirmek isterseniz, belirli bir sürüme / yüklemeye sıfırladıktan sonra çalıştırabilirsiniz .


1
Bir o Not resetsadece o da hareket edecektir grafiğinde belirli bir noktaya ödeme yok senin şu anda şube teslim
Liam

Ayrıca reset, beklemedeki tüm değişiklikleriniz de silinir.
WilliamKF

2
-hard bayrağı dedi karma sonra herhangi bir taahhüt silecektir .... muhtemelen bu küçük tid bit eklemek istiyorum. Eminim insanlar tarihi kaybetmiş ve nedenini merak etmişlerdir.
Urasquirrel

git pull --rebasesadece depo için bir uzaktan kumandanız varsa ve güncelse çalışır.
Keith Thompson

19

Gibi araçlarla proje geçmişinin grafiksel bir görünümünü elde edebilirsiniz gitk. Sadece koş:

gitk --all

Belirli bir şubeye göz atmak istiyorsanız:

git checkout <branch name>

Belirli bir taahhüt için, şube adı yerine SHA1 karmasını kullanın. (Bkz Treeishes içinde Git Topluluk Kitabı iyi bir okuma olduğunu, ağaç gezinmek için diğer seçenekleri görmek için.)

git log ayrıntılı veya özet geçmişini de görüntülemek için bir dizi seçeneğe sahiptir.

Taşınmanın kolay bir yolunu bilmiyorum Bir taahhüt tarihinde ilerlemenin . Doğrusal bir geçmişe sahip projeler muhtemelen o kadar yaygın değildir. SVN veya CVS'de yaptığınız gibi bir "revizyon" fikri Git'te bu kadar iyi eşleşmiyor.


2
Unutmayın: git size projenin tek bir doğrusal geçmişini vererek yalan söylemeyecektir. Proje aslında bu şekilde gelişmedikçe bu gerçekleşir.
Andres Jaan Tack

Bir ilerleme "geleceğe" atıfta bulunmadığından, ilerlemek mantıksal olarak anlamsızdır (doğrusal bir tarihte bile). En iyi ihtimalle, söz konusu taahhüdü bir ebeveyn olarak tanımlayan tüm taahhütleri tanımlayabilirsiniz. Unutmayın, geri gitmek, birleşme nedeniyle de önemsiz bir egzersiz değildir.
Marcelo Cantos

5

Bir taahhüdün SHA1 anahtarını kullanarak aşağıdakileri yapabilirsiniz:

  • İlk olarak, belirli bir dosya için istediğiniz taahhüdü bulun:

    git log -n <# commits> <file-name>

    Bu, sizin <# commits> belirli bir dosya için taahhütlerin bir listesini oluşturur.

    İPUCU: emin aradığınızı taahhüt değilse, iyi bir yol aşağıdaki komutu kullandığını öğrenmek için: git diff <commit-SHA1>..HEAD <file-name>. Bu komut, bir kesinliğin geçerli sürümü ile belirli bir dosyaya yönelik bir kesinliğin önceki sürümü arasındaki farkı gösterir.

    NOT: Bir taahhüdün SHA1 anahtarı git log -n'listesinde listelenir:

işlemek <SHA1 id>

  • İkincisi, istediğiniz sürüme göz atın:

    İstediğiniz taahhüt / sürümü bulduysanız, şu komutu kullanın: git checkout <desired-SHA1> <file-name>

    Bu, belirttiğiniz dosyanın sürümünü hazırlama alanına yerleştirir. Hazırlama alanından çıkarmak için şu komutu kullanmanız yeterlidir:reset HEAD <file-name>

Uzak deponun işaret edildiği yere geri dönmek için şu komutu kullanmanız yeterlidir: git checkout HEAD <file-name>


2

Bir ana dalımızın olduğu bir durumdaydım ve sonra 17.0 adında başka bir dal vardı ve bu 17.0 içinde "XYZ" diyen bir taahhüt karması vardı . Ve XYZ revizyonuna kadar müşteriye bir yapı verilir. Şimdi bir hatayla karşılaştık ve bunun o müşteri için çözülmesi gerekiyor. Bu yüzden, o "xyz" karmasına kadar bu müşteri için ayrı bir şube oluşturmamız gerekiyor. İşte böyle yaptım.

İlk önce yerel makinemde o müşteri adına sahip bir klasör oluşturdum. Bu klasör oluşturulduktan sonra müşteri adı "AAA" deyin, bu klasördeki komutu takip ederek sorun:

  1. git init
  2. git clone Bu komuttan sonra ana dalda olacaksınız. Yani istediğiniz şubeye geçin
  3. git checkout 17.0 Bu işlem sizi taahhütlerinizin mevcut olduğu şubeye götürecektir
  4. git checkout Bu, karma işleminizi gerçekleştirene kadar deponuzu alacaktır. O taahhüt karma no değiştirildi ur dalının adı bakın. Şimdi bu karmaya bir şube adı verin
  5. git branch ABC Bu, yerel makinenizde yeni bir dal oluşturur.
  6. git checkout ABC
  7. git push origin ABC Bu dalı uzak depoya gönderir ve git sunucusunda bir şube oluşturur. Bitirdiniz.

1

Bunun bir yolu, yamalara yapılan tüm taahhütleri oluşturmak olacaktır. İlk taahhüdü kontrol edin ve yamaları okuduktan sonra sırayla uygulayın.

kullan git format-patch <initial revision>ve sonragit checkout <initial revision> . yamalar olan dört basamaktan başlayarak yönetmeninizde bir yığın dosya almalısınız.

revizyonunuzu okumayı bitirdiğinizde, git apply <filename>hangisi gibi görünmeli git apply 0001-*ve sayılmalıdır.

Ama neden sadece yamaları okumak istemeyeceğinizi merak ediyorum? Lütfen bunu yorumlarınıza gönderin çünkü merak ediyorum.

git kılavuzu da bana bunu verir:

git show next~10:Documentation/README

Documentation / README dosyasının içeriğini, bir sonraki şubenin 10. son işleminde geçerli oldukları gibi gösterir.

Ayrıca, git blame filenameher satırın bir kesin karma + yazarla ilişkilendirildiği bir liste veren bir göz atabilirsiniz .


1

Belirli bir taahhütlü koda ulaşmak için söz konusu taahhüdün karma koduna ihtiyacınız vardır . Bu karma kodu iki şekilde alabilirsiniz:

  1. Bunu github / gitlab / bitbucket hesabınızdan alın. (Bu, taahhütlü URL'nizde , yani: github.com/user/my_project/commit/ commit_hash_code ) veya şunları yapabilirsiniz:
  2. git logve o daldaki son taahhütlerinizi kontrol edin. Taahhütünüzün karma kodunu ve kodunuzu işlerken bıraktığınız mesajı gösterecektir. Sadece kopyala ve sonra yapgit checkout commit_hash_code

Bu koda geçtikten sonra, üzerinde çalışmak ve değişiklik yapmak istiyorsanız, başka bir dal yapmanız gerekir git checkout -b <new-branch-name>, aksi takdirde değişiklikler korunmaz.


0

Bir taahhüdü kontrol etmek için (nb geçmişe bakıyorsunuz!).

  • git checkout "commmitHash"

Bir taahhütten acımasızca yeniden başlamak ve muhtemelen batırdığınız daha sonraki dalları silmek için.

  • git reset --hard "commmitHash"
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.