Git'teki en son sürüme nasıl dönülür?


303

Son zamanlarda SVN'den Git'e geçtim ve bir şey hakkında biraz kafam karıştı. Bir komut dosyasının önceki sürümünü bir hata ayıklayıcı aracılığıyla çalıştırmam gerekiyordu, bu yüzden yapmam git checkout <previous version hash>ve yapmam gereken şeyi yaptım.

Şimdi en yeni sürüme geri dönmek istiyorum, ama bunun karmasını bilmiyorum. Yazarken git loggörmüyorum.

Bunu nasıl yapabilirim? Ayrıca, sürümleri değiştirmenin karma yazmaktan daha kolay bir yolu var mı - "iki sürümü geri git" veya "en kronolojik olarak en yeni sürüme git" gibi bir şey mi?

Yanıtlar:


371

git checkout masterhile yapmalı. İki versiyona geri dönmek için benzer bir şey söyleyebilirsiniz git checkout HEAD~2, ancak o zamana göre geçici bir şube oluşturmak daha iyidir ,git checkout -b temp_branch HEAD~2


7
Güzel! git checkout mastertam olarak bir şubeden nasıl geçiş yaptığımdır. Bu, önceki bir sürüme baktığımda, aslında bir şube oluşturduğum anlamına mı geliyor?
Nathan Long

4
@Nathan: Git'te bir dal, çoğunlukla belirli bir revizyonun hareketli bir göstergesidir. Yani kavramsal olarak, bir çeşit dal oluşturuyorsunuz, ama git'in dalları düşündüğü anlamında değil.
DLH

2
Yani, en basit durumda, bir dizi doğrusal değişiklikim var, daha önceki bir revizyona git logbaktığımda , HEAD işaretçisini oraya taşıyorum, yani o noktaya göre görüntülenecek? Master'ı kontrol ettiğimde, işaretçiyi ana dalın en son sürümüne mi taşıyorum?
Nathan Long

7
@Nathan: Kesinlikle. HEAD, sembolik ref olarak adlandırılan bir şeydir - genel olarak başka bir ref'ye (şu anda teslim alınmış dal) bir işaretçi. git checkoutKAFA hareket etmenin bir yoludur. HEAD'ı ayırdığınızda, doğrudan verilen taahhüde işaret ettiniz; master'a tekrar baktığınızda master'a geri döner. (Ve pek çok komut git logaslında HEAD varsayılan olarak bir düzeltme aralığı alır.)
Cascabel

3
Evet - HEAD, "Çalışma dizinindeki kodun sürümü" olarak adlandırılan "zamir" dir. Aynı zamanda "Sonra ne yaparsanız yapın ebeveyni" için zamir
Ana Betts

54

Belirli bir işleme ödeme yaptığınızda git ayrık bir dal oluşturur. Yani, eğer ararsanız:

$ git branch 

Gibi bir şey göreceksiniz:

* (detached from 3i4j25)
  master
  other_branch

Ana şube kafasına geri dönmek için ana şubenize tekrar ödeme yapmanız yeterlidir:

$ git checkout master

Bu komut, ayrılmış dalı otomatik olarak siler.

Eğer git checkoutişe yaramazsa, büyük olasılıkla şubeler arasında çakışan dosyaları değiştirmişsinizdir. Kodunu kaybetmemek için git bu dosyalarla uğraşmanızı gerektirir. Üç seçeneğiniz var:

  1. Değişikliklerinizi saklayın (daha sonra açabilirsiniz):

    $ git stash
    
  2. Sökülen dalı sıfırlayarak yapılan değişiklikleri atın:

    $ git reset --hard
    
  3. Önceki değişikliklerle yeni bir şube oluşturun ve taahhüt edin:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

Bundan sonra ana dalınıza geri dönebilirsiniz (en son sürüm):

$ git checkout master

36

Bu benim için hile yaptı (hala ana daldaydım):

git reset --hard origin/master

34
reset --hard aşırıya kaçmaktır ve yaptığınız değişikliklerin farkında olmadığınızı gösterir. Bu kodu kaybetmesine neden olabilir.
Thomio

1
Benim durumumda, kazara işlenen yanlışlıkla yapılan değişikliklerden kurtulmak istedim. Bunu başarmak için başka yöntemler olabileceğini biliyorum. Kabul edilmemiş taahhütlerinizi kaybetmek istemiyorsanız, bu veri kaybıdır.
Csaba Toth

8

En son sürüme geri dönmek için:

git checkout <branch-name> 

Örneğin, git checkout masterveyagit checkout dev


7

Bir şey için şube adlarını kullanarak kontrol edebilirsiniz.

HEAD'ı hareket ettirmenin birkaç yolu olduğunu biliyorum, ama onları numaralandırmak için bir git uzmanına bırakacağım.

Sadece önermek istedim gitk --all- git ile başlarken son derece yararlı buldum.


7

Ben sadece çok emin eğer doğru anlamak, Git ineceğinize başlıyorum ama OP'ın soruya doğru cevap çalıştırabileceğiniz olduğunu düşünüyorum git log --allböyle bir biçim şartnameye: git log --all --pretty=format:'%h: %s %d'. Bu, mevcut kullanıma alınmış sürümü olarak işaretler (HEAD)ve listeden bir sonrakini alabilirsiniz.

BTW, .gitconfigbiraz daha iyi bir formatla buna benzer bir takma ad ekleyin ve şunları çalıştırabilirsiniz git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

Göreceli sürümlerle ilgili olarak, bu gönderiyi buldum , ancak sadece eski sürümlerden bahsediyor, muhtemelen daha yeni sürümlere atıfta bulunacak hiçbir şey yok.


6

Buradaki bazı cevaplar, daha eski bir taahhütte bulunmaya karar vermeden önce ana dalda olduğunuzu varsayar. Bu her zaman böyle değildir.

git checkout -

Sizi daha önce bulunduğunuz şubeye yönlendirir (master olup olmadığına bakılmaksızın).


Bir dal gerekli değildir, KAFA'yı daha önce işaret ettiği yere yönlendirecektir; daha git checkout hash2sonra yaptıysanız git checkout hash1, git checkout -sizi geri götürecektir hash1.
Mikhail Vasin

3

Önceki bir sürüme geri döndüğünüzde,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

Bu durumda bile özellik günlüğünüzü (karma) bu komutla görebilirsiniz;

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master başka bir şube adıyla değiştirilebilir.

Ardından kullanıma alın, özelliğe geri dönebilirsiniz.

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34

1

Git 2.23+ (Ağustos 2019) ile en iyi uygulama kafa karıştırıcı komut git switchyerine kullanmak olacaktır .git checkout

Eski bir sürüme dayalı yeni bir şube oluşturmak için:

git switch -c temp_branch HEAD~2

Geçerli ana şubeye geri dönmek için:

git switch master

0

Daha zarif ve basit bir çözüm kullanmaktır

git stash

Şubenin en yeniden gönderilen yerel sürümüne dönecek ve değişikliklerinizi saklamak üzere saklayacaktır, bu nedenle bu işlemi geri almak isterseniz:

git stash apply

Çok eski olduğunu biliyorum ama bu konuda bir yorum yapmak zorundayım (çünkü bu çözüm kullanılmaması gerektiğini düşünüyorum) - Bu sorunu kullanmaz çünkü bu sorunu değil farklı bir sorunu çözer. bir önceki işlem için her ödeme yapmak istediğinizde bu saklamak çözüm ile aslında bu durumda çok gereksiz verileri "kaydetmek". Doğru ve daha zarif bir yol (daha önce belirtildiği gibi) sadece <branch> ödeme yapmaktır.
Maayao
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.