Önceki bir taahhüdü kontrol ettikten sonra en son taahhüdüne nasıl geri dönülür?


476

Bazen incelemek veya test etmek için kodun bazı önceki sürümlerine bakarım. Önceki taahhütleri değiştirmek istersem ne yapacağım hakkında talimatlar gördüm - ancak hiçbir değişiklik yapmıyorum. Örn git checkout HEAD^. Yaptıktan sonra, şubenin ucuna nasıl geri dönebilirim? .. git logartık en son taahhüdün SHA'sını göstermiyor.


11
İlgili git logSorunuzun cümle, her zaman çalıştırabilirsiniz git log --all(daha anlamlı ya git log --oneline --graph --all).
Wildcard

Yanıtlar:


605

Geri dönmek istediğiniz taahhüdün bir şubenin başı olduğunu veya etiketlendiğini biliyorsanız,

git checkout branchname

git reflogGeçmişte HEAD'inizin (veya başka bir referansınızın) başka ne taahhüt ettiğini görmek için de kullanabilirsiniz .


Eklemek için düzenlendi:

Git'in daha yeni sürümlerinde, yalnızca bir kez koştuysanız git checkoutveya bir kerenizi taşımak için başka bir şey HEADyaparsanız,

git checkout -

son ödemeden önceki herhangi bir yere geri dönmek için. Bu, cd -daha önce içinde bulunduğu çalışma dizinine geri dönmek için kabuk deyimine benzetilerek motive edildi .


27
Tipik bir örnek "git checkout master" olacağını belirtmek isterim. Git'i kullanmayı öğrendiğim zorluklardan biri, "şube adı" gibi yer tutucu kelimeler yerine hangi anahtar kelimelerin (örn. "Ana") yerine geçebileceğimi bilmiyordu.
AbePralle

3
mastergerçekten herhangi bir anahtar kelime değil, yol HEAD. Yeni bir depodaki varsayılan dal adıdır. git branchDeponuzdaki dalların git tag -llistesini ve etiketlerin listesini almak için çalışabilirsiniz . Benzer şekilde, originbir havuzun klonlandığı uzaktan kumandanın varsayılan adıdır, ancak bu konuda özel bir şey yoktur.
Phil Miller

3
Net değilse, git reflogsize kullanabileceğiniz bir karma listesi verir git checkout [commit-hash].
jbnunn

Bir dosyayı sildim ve komutu denedim, ancak tamamen sıfırlamıyor. Her şeyden önce, özyinelemeli değil. Sonra bunu sildiğim dosyada denediğimde git sonra bana HEAD'ın ayrıldığını söylüyor. Ne yapalım?
Daniel S.

1
@DanielS .: Dosyalar hakkında konuşurken soru ve cevabım taahhütlerle ilgili. Git onlara daha farklı davranır.
Phil Miller

27

git ödeme yöneticisi

Master ipucu veya son taahhüttür. gitk size o sırada yalnızca ağacın neresinde olduğunuzu gösterir. git reflog tüm taahhütleri gösterecektir, ancak bu durumda sadece ipucunu istersiniz, bu yüzden git checkout master.


1
Bu. Veyagit checkout branchname
Alex

19

Bu soruya şimdi geldim ve ekleyecek bir şeyimiz var

En son işleme gitmek için:

git checkout $(git log --branches -1 --pretty=format:"%H")

Açıklama:

git log --branchestüm yerel şubelerden gelen taahhütlerin günlüğünü
-1tek bir işlemle sınırlandırır →
--pretty=format:"%H"yalnızca son karma işleminin
git checkout $(...)çıkış karması çıktısını çıkış argümanı olarak göstermek için gösterir

Not:

Bu, kopuk bir kafaya neden olacaktır (çünkü doğrudan taahhütte ödeme yaparız). Bu, sedaşağıda açıklanan şube adını çıkararak önlenebilir .


En son taahhüdün şubesine gitmek için:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

Açıklama:

git log --branchesgösterileri tüm yerel şubeleri gelen kaydedilmesini ait log
-1biri En son işlemek → işlemeye sınırlamak
--pretty=format:"%D"sadece formatında ref adlarını gösterir
| sed 's/.*, //g'tüm görmezden ancak birden hakemlerimizle son (*)
git checkout $(...)ödeme için argüman olarak alt kabuğa kullanılması çıkışı

*) Önce HEAD ve uzak dallar listelenir, yerel dallar en son alfabetik olarak azalan sırayla listelenir, böylece geri kalan dallar alfabetik olarak ilk dal adı olur

Not:

Bu her zaman (alfabetik olarak) ilk dal adını yalnızca söz konusu taahhüt için birden fazla varsa kullanır.


Her neyse, bence en iyi çözüm, nerede ödeme yapacağınızı bilmek için en son taahhüt için ref adlarını görüntülemek olacaktır:

git log --branches -1 --pretty=format:'%D'

Örneğin git top, bu komut için diğer ad oluşturun .


1
Her nasılsa ikinci komutu körükledim ... Düzeltti, şimdi en son taahhüdün şubesini doğru bir şekilde kontrol edecek.
816-8055

Bash / zsh takma adı ile başa dönalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel

9

Grafik GUI'ye bir göz atın ... gitktüm taahhütleri gösterir. Bazen grafik çalışmak daha kolaydır ... ^^


Evet, aslında bunu geçmişte böyle yaptım - ama şu anda
GUI'm yok

7

Bunun için aşağıdaki git komutundan birini kullanabilirsiniz:

git checkout master
git checkout branchname

4

tüm şubeleri göster ve
git loguna git --branches --oneline

son kaydı göster
git log --branches -1 --oneline

son işlemden önce göster
git log --branches -2 --oneline


İlk komut şu anda hangi kodun hazırlandığını işleyecek mi yoksa bunu yanlış mı yazıyorum?
Lazerbeak12345

3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>

0

Master'dan farklı bir şubeniz varsa, kolay bir yol bu dalı kontrol etmek, ardından master'ı kontrol etmektir. Voila, efendinin ucuna geri döndün. Muhtemelen daha akıllı yollar var ...


0

Sadece yapabilirsin git pull origin branchname. En son taahhüdü tekrar getirecektir.


Yukarı akıştan çekmek istemiyorsanız bunu önermiyorum. Birleşme çatışmalarını ancak hazır olduklarında ele almak gerekir.
Lazerbeak12345

Peki, bu durumda, en son taahhüdü kontrol etseniz bile kafa bağımsız durumda kalacaktır.
Ankit Singh

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.