Git: Rebase sırasında "Önceki bir kaydetme olmadan 'ezilemez' hatası


103

Yapılacak iş metninde aşağıdakiler var git rebase -i HEAD~2:

pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link

# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...

Şimdi, birincisini ( 56bcce7) ezmeye ve ikincisini birincinin önüne "s" ekleyerek seçmeye çalıştığımda şu hatayı alıyorum:

Cannot 'squash' without a previous commit

Birisi bana bunun ne anlama geldiğini ve nasıl yapacağımı açıklayabilir mi?

İlk commit'i ( 56bcce7) ezmek ve ikinci kaydı ( ) "seçip yeniden ifade e43cebaetmek" istiyorum


1
Gerçekten ezmek istiyorsanız HEAD ~ 2'yi HEAD ~ 3 olarak değiştirin.
ElpieKay

1
HEAD ~ 2 ilk taahhüdünüzse muhtemelen --root'u kullanın: stackoverflow.com/a/598788/2444812
Sybille Peters

Yanıtlar:


90

Etkileşimli geri ödeme, taahhütleri, kullanırken alıştıklarınızın tersi sırayla sunar git log. git rebase -ikaydedilen yeniden ödeme talimatları dosyasında listelendikleri sırayla (yukarıdan aşağıya) seçilen taahhütleri yeniden oynatır. Squashing sırasında, squashing için seçilen commit, (düzenlenen) listedeki (düzenlenmiş) listeden önce gelen kayıt ile, yani önceki satırdaki commit ile birleştirilir. Sizin durumunuzda - için önceden bir taahhüt yoktur 56bcce7. Aşağıdakilerden birini yapmalısınız

  • git rebase -i HEAD~3(Eğer ezmek istiyorsanız 56bcce7içine 684f917)
  • Birleştirmek demek durumunda 56bcce7olan e43cebave e43cebabağlı değildir 56bcce7, o zaman sadece onlara sipariş:

    r e43ceba Lint.py: Replace deprecated link
    s 56bcce7 Closes #2774
    

    GÜNCELLEME : Gus'ın aşağıdaki cevabı , iki işlemi yeniden düzenlemeden aynı şeyi yapmanın daha iyi bir yolunu önerir:

    r 56bcce7 Closes #2774
    s e43ceba Lint.py: Replace deprecated link
    

    Bu, iki kaydı bir araya sıkıştıracak / birleştirecektir. Etkileşimli Rebase için mesaj taahhüt yeniden sayılır bir isteyince 56bcce7, birliği açıklar mesajı taahhüt sağlamak 56bcce7ve e43ceba.


1
Ben ezmek istiyorum 56bcce7 içine e43ceba. Peki, burada 1. Adımı nasıl yapacağım?
Dawny33

89

Aşağıdaki gibi çözdüğüm benzer bir problemim vardı:

Ezmek istediğim taahhüt grubu bu:

1 s 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 pick 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

Gördüğünüz gibi hayır istedim. 4 fakat 1, 2 ve 3 daha önce taahhüt vardı içine kabak . Bu nedenle, önceki bir kesinleştirme hatası olmadan "ezilemez" .

Benim çözümüm şu rseçeneği kullanmaktı :# r, reword = use commit, but edit the commit message

Yani taahhüt listem şöyle görünüyordu:

1 r 01cc5a08 Removes open div
2 s a2b6eecf Restores old fonts
3 s 603479ff Cleans left out div
4 s 5afdbc33 Update: show logo on landing page
5 s 04c1cb13 change version of dev and prod from 1 to 2
6 s bbe6a8f8 Update: show logo on landing page if they have one
7 s c0d6008a Adds check for C users

Kaydettikten sonra, etkileşimli kabuk benden seçilen işlemenin yeniden yazılmasını istedi.

Bundan sonra, kaydetme günlüğüm daha temiz bir kaydetme geçmişiyle sonuçlanan tek bir işlemeyle sonuçlandı.


2
benim gibi hata aldığınızda, yeniden ifade etmek veya seçmek için herhangi bir işlem seçmediğiniz için hata aldıysanız (soru üzerine), git rebase --edit-todobu yanıta atıfta bulunarak yapmanız ve düzeltmeniz gerekecek ve sonragit rebase --continue
yaşlı keşiş

Bu cevap kısa ve
özdü

20

Bu sorunu yaşadım ve benim durumumda bunun olmasının nedeni, eski taahhütleri yeni bir commit ile ezemezsiniz. İşte 3 kaydetmeniz olduğunu söyleyen bir örnek:

1 pick 01mn9h78 The lastest commit
2 pick a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

Şimdi söylersen git rebase -i HEAD~3ve şöyle bir şey yaparsan

1 pick 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 s 093479uf An old commit i made a while back

Bu, hataya neden olur:

hata: önceki bir commit olmadan 'ezilemez' Bunu 'git rebase --edit-todo' ile düzeltebilir ve sonra 'git rebase --continue' komutunu çalıştırabilirsiniz. Ya da yeniden temellemeyi 'git rebase --abort' ile iptal edebilirsiniz.

Çözüm :

Squashing commits olduğunda, son commit'leri eskilere ezmelisiniz, tersi değil, bu nedenle örnekte şöyle bir şey olacaktır:

1 s 01mn9h78 The lastest commit
2 s a2b6pcfr A commit before the latest
3 pick 093479uf An old commit i made a while back

Bu iyi çalışacak, eğer tüm commit mesajlarınızı istiyorsanız , squash yerine fixup öneririm .


5
Teşekkürler - Kayıtları sık sık ezmem ve en eski commit'i seçme tavsiyesi, bana yardımcı olmayan bir git hatasını atlatmamı sağladı.
0x574F4F54

4

Ters mantıkla ezin . Daha sonraki adımda istenen kaydetme mesajını seçebileceksiniz.

  • pickcommit mesajını istemediğiniz ilk commit .
  • squashveya fixupgerçekten istediğiniz commit mesajına sahip olana kadar birleştirmek istediğiniz commit (ler).
pick 56bcce7 Closes #2774
squash e43ceba Lint.py: Replace deprecated link
  • değişikliği onayla ( :x)
  • istemediğiniz commit mesajını / mesajlarını silin ve sadece istediğiniz commit mesajını bırakın (bu durumda :)Lint.py: Replace deprecated link .
  • seçimi onayla ( :x)

Umarım birisi için daha net olur ✌🏽


2

En iyisi, commit'leri içeren etkileşimli düzenleyicide, git her zaman aşağıdan yukarıya doğru ezilir ve aşağıdan squash almak için yukarıdan bir "seç" girişi bırakılmalıdır.


2

Bu yaklaşımı yeni denedim.

git log -n3

Bu, bana en son işlemin ne olduğu ve hangisinin daha önce gittiği konusunda fikir verecek olan son 3 kaydı gösterir. Şimdi yeniden yapılanma belirtildi,

git rebase -i HEAD ~ 3

Üstüne diğer ikisini ezmemiz gereken en son kaydı seçin. Temel kesinleştirme olarak seçilen kesinleştirme kimliği şöyle olacaktır:

commit_id seç

Diğer iki commit kimliği için bunları şu şekilde değiştirin:

squash commit_id

ya da sadece,

s commit_id


0

Ben de şu anda bu problemle zaten karşılaştım, bu sadece dikkatsiz. Problemi bir sonraki gibi çözebilirsiniz: ilkini ezmeye çalıştığınızda (56bcce7) ikincisini seçip ikinci satırdan önce "s" eklemelisiniz ama ilki değil. ayrıca bir sonraki web sitesine de başvurabilirsiniz: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html


1
Selam ! Stack overflow'da gelecekteki girişimler için Minimal, Complete ve Doğrulanabilir bir örnek nasıl oluşturulur'a göz atarsanız daha iyi olur . -Teşekkürler
Momin
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.