Son git eklentisini nasıl geri alabilirsiniz?


193

O değişikliği (işlememiş) aşamalı sondan unstage mümkün mü Git ? Mevcut dalda, bazıları sahnelendi, bazıları değil, çok sayıda dosya olduğunu varsayalım. Bir noktada, bazı aptal programcılar yanlışlıkla yürütülür:

git add -- .

...onun yerine:

git checkout -- .

Bu programcı şimdi son değişikliklerini sihirli bir git komutuyla değiştirebilir mi? Yoksa ilk etapta denemeden önce işini yapmalı mıydı?


Heh. Bununla ilgili yararlı bir soru ve cevap aldık.
steveha


Bunun kopya olmadığını düşünüyorum. Diğer soruda OP, bunu geri almanın veya bu dosyaları taahhütten kaldırmanın bir yolunu soruyor. Tam olarak ve sadece son git addkomutla eklenen değişiklikleri , özellikle önceden hazırlanmış değişiklikleri olan ve geri alınacak, sahnelenmemiş olan bazı değişikliklerin olduğu dosyalar için geri almak istiyorum (ed) . Diğer sorunun yine de ilgili olmadığını söyleyemeyiz.
Septagram

1
Belki de ilk etapta denemeden önce yapması / bağlı olması gerekirdi.
android.weasel

@ android.weasel evet, bu yıllar önce oldu ...
Septagram

Yanıtlar:


299

Kullanabilirsiniz git reset. Bu, son işleminizden sonra eklediğiniz tüm dosyaları 'bozar'.

Yalnızca bazı dosyaların bozulmasını istiyorsanız kullanın git reset -- <file 1> <file 2> <file n>.

Ayrıca, dosyadaki bazı değişiklikleri kullanarak da bozmak mümkündür git reset -p.


3
Ne kadar üzücü. Ne de olsa benim taahhüt işlerimde yanlış bir şey var sanırım. Bu cevabı kabul ettiğiniz için -panahtardan bahsettiniz . Teşekkürler! :)
Septagram

(Benim için) hatasını oluşturur: ölümcül: 'HEAD' geçerli bir ref olarak çözümlenemedi. Henüz yeni bir şey yapmadım (yeni repo) git add add. ve pişman oldum. Tüm eklentiyi sıfırlamak istemiyorum, sadece bir dizin. git reset - dir /*.* yukarıdaki hatayı oluşturur.
Francis Davey

... Ah, benim için neler olduğunu anlıyorum. HEAD'ın henüz göstereceği hiçbir şeyim yoktu ve bu yüzden git reset başarısız oldu (çünkü HEAD üzerinde çalışıyor).
Francis Davey

42

En son git eklentisini geri alamazsınız, ancak son işlemden addbu yana tüm işlemleri geri alabilirsiniz . git resetbir taahhüt bağımsız değişkeni olmadan dizini sıfırlar (değişmezlik aşamalı değişiklikler):

git reset

2
"En son git eklentisini geri alamazsınız ": Vay canına, bu şaşırtıcı ve potansiyel olarak acı verici. Bunun kesin bir kaynağı var mı? Ayrıca, böyle olması için iyi bir neden var mı? Teşekkürler!
Andrew Moylan

@ AndrewMoylan: Bunu yapmanın otomatik bir yolu yok. Her zaman resettek bir dosya kullanabilir veya reset -pbelirli bir yığını bozmak için kullanabilirsiniz .
knittl

15

Yani gerçek cevap

Bu programcı şimdi son değişikliklerini sihirli bir git komutuyla değiştirebilir mi?

aslında: Hayır, sadece sonuncuyu değiştiremezsiniz git add.

Bu, soruyu aşağıdaki durumda olduğu gibi yorumlarsak:

İlk dosya:

void foo() {

}

main() {
    foo();
}

İlk değişikliği takiben git add:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

İkinci değişikliği takiben git add:

void foo(int bar, String baz) {
    print("$bar $baz");
}

main() {
    foo(1337, "h4x0r");
}

Bu durumda, git reset -pen küçük ayrıntı düzeyi çizgiler olduğu için yardımcı olmaz. gitara durumu hakkında bilmiyor:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

artık.


Yeni bir git kullanıcısı olarak, arkadaşlarımın "iyi checkin hijyeni" olarak tanımladıklarını vurgulayan gerçekten önemli bir ayrım ... kişisel deneyimim - "carpooling" (kötü!)
benc


3

Gitte şu tarihte sorulur:

  1. use "git rm --cached <file>..." to unstagedosyalar depoda olmasaydı. Onları orada tutan dosyaları bozar.
  2. use "git reset HEAD <file>..." to unstagedosyalar repodaysa ve değiştirilmiş olarak ekliyorsanız. Dosyaları oldukları gibi tutar ve bunlardan etkilenmez.

git add --Bildiğim kadarıyla geri alamazsınız, ancak yukarıda belirtildiği gibi bir dosya listesini bozabilirsiniz.


2
  • Dosyayı dizinden kaldırın, ancak çalışan kopyada taahhüt edilmeyen değişikliklerle sürümlü ve solda bırakın:

    git reset head <file>
    
  • Değişiklikleri geri alıp dizinden kaldırarak dosyayı HEAD'den son duruma sıfırlayın:

    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    Bu, git reset --hard HEADtek dosyalarla çalışmadığından gereklidir .

  • <file>Dizin ve sürüm oluşturma işleminden kaldırın , sürümlenmemiş dosyayı çalışma kopyasındaki değişikliklerle birlikte saklayın:

    git rm --cached <file>
    
  • <file>Çalışan kopyadan ve sürümden tamamen kaldırın :

    git rm <file>
    

2

Taahhüt için eklenen tüm dosyaları git'den kaldırmak istiyorsanız

git reset

Tek bir dosyayı kaldırmak istiyorsanız

git rm <file>

1

Kullanabilirsiniz

git reset

son eklenen yerel dosyaları geri almak için

 git reset file_name

belirli bir dosyadaki değişiklikleri geri almak için


0

Zorluğun boyutuna ve ölçeğine bağlı olarak, bir çizik (geçici) dal oluşturabilir ve mevcut işi orada yapabilirsiniz.

Ardından orijinal şubenize geçin ve ödünç alın ve sıfırdan taahhütten uygun dosyaları seçin.

En azından çalışılacak mevcut ve önceki durumların kalıcı bir kaydına sahip olursunuz (bu sıfırlama dalını silene kadar).

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.