Geçmiş kaydetmeyi eksik bir dosyayı içerecek şekilde nasıl değiştirebilirim?


98

Bir değişiklik yaptım ve değişiklik kümesine bir dosya eklemeyi unuttum. Diğer HEAD^4kaydetmelerden sonra, dosyanın bir kaydetmede artık eksik olduğunu fark ettim .

Eksik dosyayı dahil etmek için önceki bir kaydı nasıl yeniden yazarım?


bu 4 kaydı zorladın mı?
mvp

@mvp hayır, sadece yerel git depomda bulunuyorlar.
kolrie

Yanıtlar:


54

Değiştirmek istediğiniz işlem için seçeneği kullanın git rebase --interactive HEAD~4ve ayarlayın edit.

Uzak depoya bu şekilde gönderilen commit'leri değiştirmemeniz gerektiğini unutmayın . Bu durumda eksik dosya ile yeni bir kayıt eklemek daha iyidir.


Teşekkürler. Uzak deponun tek kullanıcısı ben olsam bile durum bu mu? git push -fYukarı akışın değişmediğinden emin olursam , bunu yapmama izin vermez mi ?
kolrie

1
Uzak deponun tek kullanıcısı sizseniz, zorunlu zorlamayı yapmakta sorun yoktur.
Rafał Rawicki

7
Bu talimatların yeterince ayrıntılı olmadığını düşünüyorum. İlk kez denediğimde bana "Yeniden yüklenemiyor: Dizininiz taahhüt edilmeyen değişiklikler içeriyor." addEksik dosyaları zaten doldurmuştum, bu yüzden mesaj olarak "xxx" ile bir işlem yaptım. Sonra rebase komutunu yaptım ve "xxx" yürütmeyi "seç" ten "düzenle" ye değiştirdim. Sonra "git rebase --continue" yaptım. Şimdi geçmişe baktığımda en son kaydetme olarak "xxx" var ve onları eklemek istediğim önceki işlem değişmedi! Acaba hatam nerede?
Darren Cook

2
Son kaydı ezmek dosyayı HEAD ~ 4'e koymaz.
Justin

1
git editedFiles ekle; git commit -m "Blah"; git rebase -i HEAD ~ 5; // şimdi yeni commit eklendiğinden, 4 yerine 5 ile yeniden temel oluşturmamız gerekiyordu. Şimdi "Blah" commit'i ikinci satıra taşıyın ve onu "Pick" dan "s" (squash) olarak değiştirin ki bu HEAD ile commit'i ezecek ~ 5 komutlar yukarıdan aşağıya doğru yürütüldüğünde
zstring

277

İnsanların daha basit bir cevap bulmak için Google'ı arayarak buraya gelebileceğini biliyorum : Ya bu sadece son işlemse? (OP'nin sorusu, tarihteki 4. kesinliği düzeltmek içindir)

Hemen bir dosya eklemeyi unuttuğunuzu anlarsanız, şunları yapın :

# edited file-that-i-remember.txt
git add file-that-i-remember.txt
git commit

# realize you forgot a file
git add file-that-i-forgot.txt
git commit --amend --no-edit

--no-editAynı commit mesajı nerede saklanacak.

Basit!


22
Cevap bu.
Adam Bittlingmayer

5
Taahhütler uzaktan kumandaya itilmezse, bahsetmeye değer.
Ram Patra

1
Evet, buraya yorum söz etmek gerekiyor: Daha önce kullanan içindir itme . Bunu gösterdiğin için teşekkürler.
DrBeco

2
Bir uyarı, önceki ve sonraki --amend
kaydetmelerin

6
Teşekkürler, ama olamaz: OP sordu HEAD^4. Olduğu gibi tamam, referans için bir ek olarak. ;)
DrBeco

11

Bu 4 işlemi GERÇEKLEŞTİRMEDENİZ, aşağıdaki şekilde yapabilirsiniz:

Tüm bu kayıtlar için yama dosyaları oluşturun:

git format-patch -4

4 kaydetme ile geri sar:

git reset --hard HEAD~4

Eksik dosyayı ekleyin:

git add missing-file

Şununla taahhüt et --amend:

git commit --amend

Kaydedilen tüm yamaları geri uygulayın:

git am *.patch

Eğer ittiyseniz, bu yöntemi KULLANMAMALISINIZ. Bunun yerine, hatanızı kabul edin ve HEAD üzerine bu sorunu çözen bir işlem daha oluşturun.


Bunu adım adım yapmak istiyorsanız, değiştirilmiş olan işlemden sonra onları bir yama olarak dışa aktarmaktan daha kolaydır.
Rafał Rawicki

1
Bu zevk meselesi. Sevdiğim git format-patch/ git amçok daha iyi. En önemlisi, bir şeyi batırırsanız size daha fazla güven verir - fiziksel dosyada yama olarak kaydedilen işlem, en iyi güvenlik ağınızdır.
mvp

Aslında gerçek güven, bir git deposunda çalışırken hiçbir şeyi kaldırmamanızdır. Siz git gc
koşana

Bu sizin ve benim için önemsiz ve açık. Ancak, yeni başlayan ve muhtemelen git hakkında hiçbir şey anlamayan kullanıcılar için bu gerçek hiç de açık değil.
mvp

2
Bu talimatlar uzun soluklu görünüyordu, ancak oldukça basit ve takip edilmesi kolaydı. Teşekkürler. (Sadece son bir adım eklemek istiyorum: rm *.patch)
Darren pişirin

9

Kabul edilen cevap doğru olsa da, bir yeniden ödeme işlemi sırasında bir taahhüdü düzenlemenin nasıl gerçekleştirileceğine ilişkin ayrıntılı talimatlardan yoksundur.

  • İlk olarak, bir yeniden ödeme süreci başlatın:

    git rebase --interactive HEAD~4
    
  • Bir kaydetme listesi sunulacak, kelimeyi pickolarak değiştirerek düzenlemek istediğiniz kaydı seçin editve dosyayı kaydedin.

  • Kodunuzda gerekli değişiklikleri yapın ( git addyeni dosyalar için çağırmayı unutmayın )

  • Tüm değişiklikler yapıldıktan sonra, yayınla git commit --amend- bu, olarak işaretlenmiş bir taahhüdü değiştirecektiredit

  • git rebase --continueİşlemi tamamlayacak çağrı yapın (olarak işaretlenen daha fazla editkaydetme varsa, yukarıdaki adımların tekrarlanması gerekir)

Önemli notlar:

  • pickDüzenlemek istemediğiniz olarak işaretlenmiş satırları SİLMEYİN - olduğu gibi bırakın. Bu satırların silinmesi, ilgili kayıtların silinmesine neden olacaktır

  • GIT stash, çalışma dizininiz temiz değilse sizi yeniden oluşturmadan önce zorlar ; Ancak git stash pop / git stash apply, yeniden ödeme sırasında, bu değişiklikleri (yani, yeniden ödeme sürecine başlamadan önce saklanan değişiklikler) olarak işaretlenmiş bir taahhüde değiştirmek için yapabilirsiniz.edit

  • Bir şeyler ters giderse ve yeniden ödeme işlemi sırasında yapılan değişiklikleri tamamlanmadan önce geri döndürmek istiyorsanız (yani, yeniden temellemeyi başlatmadan önceki noktaya dönmek istiyorsanız), şunu git rebase --abortda okuyun: --abort olmazsa etkileşimli bir yeniden taban nasıl iptal edilir ' t çalışmak?

  • Kabul edilen cevapta söylendiği gibi:

    Uzak depoya bu şekilde gönderilen commit'leri değiştirmemeniz gerektiğini unutmayın. Bu durumda eksik dosya ile yeni bir kayıt eklemek daha iyidir.

    Bunun cevabı Git Kitabında (" Yeniden Satış Tehlikeleri " başlıklı paragraf ):

    Deponuzun dışında bulunan kayıtları yeniden sunmayın.

    Bu yönergeye uyarsanız, iyi olacaksınız. Yapmazsan, insanlar senden nefret edecek ve arkadaşların ve ailen tarafından aşağılanacaksın.

    Bir şeyleri yeniden sıraladığınızda, mevcut taahhütleri terk ediyorsunuz ve benzer ancak farklı olan yenilerini oluşturuyorsunuz. Bir yere commit'leri ittirirseniz ve diğerleri onları aşağı çeker ve üzerlerinde çalışmayı temel alırsa ve daha sonra bu commit'leri git rebase ile yeniden yazar ve onları tekrar yükseltirseniz, işbirlikçilerinizin çalışmalarını yeniden birleştirmeleri gerekecek ve denediğinizde işler karışacak işlerini kendinize geri çekin.

    [...]

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.