Ana şubemde bir "orta" kaydı açıp çöpe atmam gerekiyor. Nasıl yapabilirim?


96

Örneğin, aşağıdaki ana dalda, önceki yeniden temelden kaynaklanan ikinci işlem olan af5c7bf16e6f04321f966b4231371b21475bc4da işlemini çöpe atmam gerekiyor:

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Tue Apr 12 23:50:15 2011 +0200

    add generic config/initializers/omniauth.example.rb

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 00:15:50 2011 +0200

    show github user info if logged

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 17:20:48 2011 +0200

    add multiple .container at blueprint layout

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Thu Apr 21 19:55:57 2011 +0200

    add %h1 Fantastic Logo + .right for 'Sign in with Github'

Korumaya ihtiyacım var

  • İlk kaydetme 60b413512e616997c8b929012cf9ca56bf5c9113,
  • Üçüncü işleme e6523efada4d75084e81971c4dc2aec621d45530 ve
  • Son kaydetme 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

sadece İkinci commit af5c7bf16e6f04321f966b4231371b21475bc4da

Bunu nasıl yapabilirim? Şimdiden teşekkürler Luca

Yanıtlar:


103

Yeniden başlatma veya geri alma seçeneklerdir. Rebase aslında commit'i geçmişten kaldıracak, bu yüzden ikinci commit hiç var olmamış gibi görünecek. Ana dalı başka bir depoya ittiyseniz bu bir sorun olacaktır. Bu durumda bir yeniden temelden sonra itmeye çalışırsanız, git size hızlı ileri olmayan bir reddetme birleştirme hatası verir.

Revert, şube diğer depolarla paylaşıldığında doğru çözümdür. git revert af5c7bf16af5c7bf16'nın getirdiği değişiklikleri basitçe tersine çeviren yeni bir taahhütte bulunacaktır. Bu şekilde tarih yeniden yazılmaz, hatanın net bir kaydını tutarsınız ve diğer depolar zorlamayı kabul eder.

İşte silmenin iyi bir yolu: git rebase -i <commit>^ Bu sizi kaldırmak istediğiniz işlemin hemen önündeki işleme götürür. Etkileşimli düzenleyici size o noktaya kadar yapılan tüm işlemlerin bir listesini gösterecektir. Seçebilir, ezebilirsiniz, vb. Bu durumda silmek istediğiniz işlemin satırını kaldırın ve dosyayı kaydedin. Rebase işini bitirecek.


2
Rebase'i seçmem durumunda, rebase için doğru taahhüt nedir? Sadece bir saniye
bırakmam

@ BBJ3 Mipadi'nin cevabına bakın.
Prajwal Dhatwalia

34

Yeniden ödeme bir seçenekse, yeniden ödeme yapabilir ve iptal edebilirsiniz:

$ git rebase -i 414ceffc^

Rebase bir seçenek değilse, geri döndürebilirsiniz:

$ git revert af5c7bf16

eski dördüncü commit olan "git rebase 414ceffc" i alırsam, 'üçüncü e6523 ve ilk 60b41'i de kaybedeceğim?
Luca G.Soave

3
@Luca G. Soave: Bir yürütmeyi yalnızca özellikle iptal etmenizi söylerseniz git rebase( rebaseetkileşimli modda çalıştırıp girişini kaldırarak) "kaybedersiniz" .
mipadi

Teşekkürler mipadi, ben JCotton'a esasen kapsamlı açıklama için oy veriyorum, siz ikiniz de aynı şeyi söylediyseniz ... tekrar teşekkürler.
Luca G.Soave

30

Burada alınan orijinal yanıtların tüm övgülerine rağmen, soruyu tatmin edici bir şekilde yanıtlayacak bulamadım. Kendinizi tarihin ortasında bir taahhüt veya bir taahhütler koleksiyonunu kaldırmanız gereken bir durumda bulursanız, size önereceğim şey şudur:

  • Tüm taahhütleri içeren bir şubeden yeni bir şube oluşturun ve ona geçin.
  • Yeni şubeyi, yeni bir üsse başlamak istediğiniz noktaya geri döndürün.
  • Sonra, (işte kilit nokta) kiraz , bundan sonra uygulanmasını istediğiniz sonraki taahhütleri orijinal şubeden yenisine seçin ve artık istemediğiniz taahhütleri (yani sildiğiniz taahhütleri) atlayın.
  • İsterseniz, orijinal şubeyi eski kodunu gösteren bir adla yeniden adlandırın ve ardından yeni şubenizi orijinal adıyla yeniden adlandırın.
  • Son olarak, değişikliklerinizi uzak deponuza aktarın (bir tane kullanıyorsanız). Muhtemelen "zorunlu itme" kullanmanız gerekecek. Ortak çalışanlarınız revizyonları çekmede sorun yaşıyorsa, depoyu uzak kaynaktan tekrar klonlamak onlar için en kolayı olabilir. Öyle ya da böyle, yine de tarihinizin ortasından taahhütleri koparıyorsanız, muhtemelen onlarla konuşmak isteyeceksiniz!

İşte Cherry Picking ile ilgili bilgiler: Git ile bir commit'i kiraz toplamak ne anlama geliyor?

İşte bunu Tortoise Git ile yapmanın bir kısmı (az önce yaptığım gibi). Bu tür işlemler için bir gui aracı kullanmak kesinlikle daha kolaydır! TortoiseGit kullanarak kiraz toplama


6
Bu en iyi cevap olmalıydı!
MadOgre

Kiraz toplama kullanmanın güzel bir yolu, bu çözüm birden fazla kaydetmeyi "atlamak" istediğinizde daha da iyidir.
Johnny Willer

Orijinal soruyu gerçekten ele almıyor. Önerilen çözüm işe yarasa da, çok daha fazla zaman alıcı / garip ve IMO herhangi bir fayda sağlamıyor. Dal zaten itilmişse (ve vahşi ortamda kullanılmışsa), muhtemelen cevap geri dönüş stratejisidir. Değilse, etkileşimi yeniden temel alın ve sorun teşkil eden taahhüdü kaldırırdım. Eğer itildiyse, ancak kimse tarafından kullanılmadığını biliyoruz , yine de bir geri ödeme ve ardından bir zorlama ile kurtulabilirsiniz.
raduw
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.