Git geri döndürme neden eksik -m seçeneği hakkında şikayet ediyor?


185

Bu yüzden diğer insanlarla bir proje üzerinde çalışıyorum ve üzerinde çalışılan birden fazla github çatal var. Birisi bir problemi düzeltti ve çatalıyla birleştim, ama sonra daha iyi bir çözüm bulabileceğimi fark ettim. Az önce yaptığım taahhüdü geri almak istiyorum. Bunu ile denedim git revert HEADama bana bu hatayı verdi:

fatal: <SHA1> işleminin bir birleşimidir, ancak -m seçeneği verilmemiştir.

Bu ne anlama geliyor? Birleştirip işlem yaptığımda, "<username> ile birleştirildi" demek için -m seçeneğini kullandım.

Burada neyi yanlış yapıyorum?

Yanıtlar:


217

Varsayılan git revertolarak, gerçekte ne anlama geldiğinin belirsiz olması nedeniyle bir birleştirme taahhüdünü geri almayı reddeder. Sanırım HEADaslında bir birleştirme taahhüdü.

Birleştirme taahhüdünü geri almak istiyorsanız, birleştirmenin hangi üst öğesinin ana gövde olduğunu, yani neye geri dönmek istediğinizi belirtmek zorundasınız.

Genellikle bu bir numaralı üst öğe olacaktır, örneğin , açıksanız masterve yaptıysanız git merge unwantedve birleştirmeyi geri almaya karar verdiyseniz unwanted. İlk ebeveyn, birleştirme öncesi masterdalınız ve ikinci ebeveyn ise ipucu olacaktır unwanted.

Bu durumda şunları yapabilirsiniz:

git revert -m 1 HEAD

4
Tamam teşekkürler. Birleştirme işleminden etkilenen iki dosyayı değiştirmeyi ve sonra da diğer bazı değişiklikleri yapmayı daha kolay buldum.
icnhzabot

43
-M1 veya -m2, ... kullanmam gerekip gerekmediğini nereden öğrenebilirim?
Patrick Cornelissen

34
git cat-file -p [MERGE_COMMIT_ID]Ana şubeleri sırayla gösterir. Listelenen ilk -m 1, ikincisidir -m 2.
nostromo

2
git revert [HASH] -m 2bana şube 1.x-1.x hiçbir şey taahhüt, çalışma dizini temiz ama benim taahhüt geri alınmıyor.
jenlampton

3
Yani (10 git başka bir geliştiriciden değişiklikleri her çektiğinizde otomatik olarak bir birleştirme gerçekleştirir beri oldukça muhtemeldir) geçmiş birleştirme geri dönmek gerekirse Ben her bir birleştirme için bunu yapmak zorunda? Git hayranlarının yeniden basmaya bu kadar istekli olmasının nedeni budur, çünkü geri dönüş temel olarak işe yaramaz mı?
Neutrino

46

Diyelim ki diğer adam foo'nun üstünde bar yarattı, ama bu arada baz oluşturdunuz ve sonra birleştiniz,

$ git lola
* 2582152 (HEAD, master) Birleştirme dalı 'otherguy'
| \  
| * c7256de (otherguy) çubuğu
* | b7e7176 baz
| /  
* 9968f79 foo

Not: git lola standart olmayan ancak kullanışlı bir takma addır.

İle zar yok git revert:

$ git revert HEAD
ölümcül: 2582152 taahhüdü ... bir birleştirme, ancak -m seçeneği verilmedi.

Charles Bailey her zamanki gibi mükemmel bir cevap verdi . Olduğu git revertgibi kullanma

$ git revert --no-edit -m 1 BAŞLIK
[master e900aad] "Şubeyi 'otherguy' birleştir"
 0 dosya değişti, 0 ekleme (+), 0 silme (-)
 silme modu 100644 çubuğu

etkili bir şekilde siler barve üretir

$ git lola
* e900aad (HEAD, master) "Şubeyi birleştir 'otherguy'"
* 2582152 'otherguy' dalını birleştir
| \  
| * c7256de (otherguy) çubuğu
* | b7e7176 baz
| /  
* 9968f79 foo

Ama birleştirme taahhüdünü atmak istediğinizden şüpheleniyorum :

$ git reset --hard HEAD ^
HEAD şimdi b7e7176 baz'da

$ git lola
* b7e7176 (KAFA, master) baz
| * c7256de (otherguy) çubuğu
| /  
* 9968f79 foo

Belgelendiği gibi git rev-parsemanuel

<rev>^, örneğin HEAD ^,v1.5.1^0
Bir ^revizyon parametresinin soneki , söz konusu tamamlama nesnesinin ilk üst öğesi anlamına gelir. n- ebeveyni ^<n>anlamına gelir ( yani eşdeğeri ). Özel bir kural olarak, komutun kendisi anlamına gelir ve bir komut nesnesine başvuran bir etiket nesnesinin nesne adı ne zaman kullanılır . <rev>^<rev>^1<rev>^0<rev>

bu yüzden çağırmadan önce git reset, HEAD^(veya HEAD^1) b7e7176 ve HEAD^2c7256de idi, yani birleştirme işleminin sırasıyla birinci ve ikinci ebeveynleri.

Dikkatli olun git reset --hardçünkü işi yok edebilir.


3
Bu karışık, karışık, dünyayı sarstı. Lola hariç. Bu harika takma ad için bir milyon teşekkürler.
Barney

lolaGit komutlarınıza eklemenin kolay yolu :git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"
D. Gibbs

8

Bu sorunu yaşadım, çözüm taahhüt grafiğine (gitk kullanarak) bakmak ve aşağıdakilere sahip olduğumu görmekti:

*   commit I want to cherry-pick (x)
|\  
| * branch I want to cherry-pick to (y)
* | 
|/  
* common parent (x)

Şimdi yapmak istediğimi anlıyorum

git cherry-pick -m 2 mycommitsha

Bunun nedeni -m 1, ortak ebeveyne -m 2dayalı birleştirme, y dalına dayalı birleştirme olarak , kiraz almak istediğim şeydir.


1
Muhtemelen bununla ilgili olmadığı için git-revert, bu sorunun konusu budur.
pnomolos

1
Bence bu soru -mseçenekle ilgili, sadece değil git merge. Yani, -mseçeneğin kullanımının ardındaki mantık , geri dönüşler ve kiraz seçimleri için benzer görünmektedir. Bu doğru değilse, lütfen bize bildirin. Özellikle kiraz toplama kullanımını ele alan başka bir soru bulamadığım için, muhtemelen bu soruyu ve yararlı, ilgili tartışmayı bulmama yardımcı olan google'ı yönlendiren bu cevap için teşekkürler!
nealmcb
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.