git: iletiyi yazarken tamamlamayı iptal et


131

Bağlılığın ortasındayım. Taahhüt mesajımı vim'de yazdım. Şimdi bir şeyi değiştirmem gerektiğini hatırladım. İstediğim şeyi başarmak için başka seçenekler olduğunun farkındayım, ancak kaydetmeyi iptal etmenin bir yolu olup olmadığını bilmek istiyorum, ancak şimdiye kadar yazdığım commit mesajını yine de saklamak istiyorum.

Yanıtlar:


85

Evet. Kaydetme mesajını farklı bir dosyaya ( :w /some/other/path.txt) yazın. Ardından ( :q!) kaydetmeden düzenleyiciden çıkın . Dosyayı daha önce orijinal yoluna kaydettiyseniz, her şeyi silin ve önce boş dosyayı yazın (boş bir tamamlama mesajı kaydetmeyi iptal eder).

Şimdi, "gerçek için" işlemeye hazır olduğunuzda, alternatif yola kaydettiğiniz mesaj dosyasını kullanın.

Alternatif olarak, commit mesajını vim'in tamponlarından birine kopyalayın.

Bunu gerçekten yapmak zorunda olmadığınızı belirtmekte fayda var : commit --amendcommit'i yapıldıktan sonra değiştirmenize izin verir, bu yüzden kolay çözüm, elinizdekiyle commit'i üretmek ve sonra onu zorlamadan önce düzeltmektir. İşlemi bozuk durumunda bile bitirebilir reset HEAD~(sizi işlemden önceki çalışma kopyanızın durumuna sıfırlar), çalışan kopyanızı düzeltebilir ve ardından commit -a -c HEAD@{1}eski commit mesajını kullanabilirsiniz.


7
Not: ": q!" Kullanarak vim'den çıkılıyor. otomatik doldurulan bir birleştirme çakışması mesajı varsa, kaydetmeyi iptal etmez. Bunun yerine kayıt devam edecek ve mesaj hangi dosyaların çakışması olduğunu listelemeyecektir.
stephenbez

write the empty file (an empty commit message will abort the commit)bölüm bir cazibe gibi çalıştı, teşekkürler!
Саша Давиденко

182

Düzenleyiciniz bir hata koduyla çıkabilirse - Git yürütmeyi iptal eder. VIM kullanırken, yazın

:cq

sıfır olmayan bir hata koduyla çıkmak ve kaydetmeyi iptal etmek için.


5
Bu, commit --amendaksi halde mevcut commit mesajını ve :wq.
Alex Jasmin

2
İyi numara! Ancak soru, commit mesajının silinmesi değil, nasıl kaydedileceğiydi.
Elijah Lynn

peki svn bunu nasıl başarır? çıkış kodunun yanı sıra neye bakıyor?
Chaim Geretz

1
interaktif bir rebase yani
squashing

Rebase sırasında git commit --amendyerine a yaptığımda hayatımı kurtardım git rebase --continue.
Weishi Zeng

68

Taahhüt mesajınızı yazmak için vim'i açtıysanız sadece # ile başlamayan satırları silin ve git kaydetme işleminizi iptal edecektir

Aborting commit due to empty commit message.

11
Bu özellikle bir git commit --amend'i iptal etmek istediğinizde kullanışlıdır.
edsko

1
Soru, commit'in nasıl iptal edileceği, ancak commit mesajının nasıl kaydedileceğiydi. # İle başlamayan satırların silinmesi commit mesajını etkili bir şekilde siler, commit mesajını kaydetmez. Bunun nasıl bu kadar çok olumlu oyu olduğundan emin değilim.
Elijah Lynn

2
ggdGmesajın tüm içeriğini kesecek, daha sonra bir dahaki sefer çalıştırdığınızda vimsadece Pönceden kestiğiniz metni yapabilirsiniz .
oromoiluig

nano kullanarak çalışır, tüm satırları ctrl + k, ardından kaydetme ve çıkma işlemi iptal eder
Juh_

9

Kaydetmeyi iptal edebilirsiniz, ancak başka bir yaklaşım daha sonra kaydetmeyi değiştirmektir . Mevcut çalışmanızı tamamlayın, ardından istediğiniz ek değişiklikleri yapın git add, sonra çalıştırın git commit --amend. Kaydetme mesajı düzenleyicisine geri yerleştirileceksiniz ve kaydettiğinizde, kaydetme ek değişiklikleri ve yeni kaydetme mesajınızı içerecek şekilde değiştirilecektir.


7

Evet mümkün. Kaydetmek için, editörünüz commit mesajını dosyaya yazmalı .git/COMMIT_EDITMSGve 0 durum kodu ile çıkmalıdır.

Dolayısıyla, VI / VIM kullanıyorsanız, aşağıdakileri yapmak isteyebilirsiniz ...

  1. Kaydetme mesajınızı yazın.
  2. Kaydetme mesajını şununla :wkaydedin (varsayılan olarak bu, mevcut içeriği şuraya kaydeder .git/COMMIT_EDITMSG)
  3. Editörden bir hata ile çıkın :cq
  4. ... yapmanız gerekeni yapın ... hatta hazırlama alanına dosya ekleyin / kaldırın.
  5. Mevcut kaydetme mesajınızı düzenlemeye devam edin git commit -eF .git/COMMIT_MESSAGE

-F /path/to/file/ Dosyaya gelen / yolu herhangi bir içerik / ile editör dolduracaktır. Ancak, düzenleme-e için ek olarak bayrağı sağlamazsanız, varsayılan olarak bu işlem anında gerçekleştirir .


bu çalışır, ancak daha az tercih edilir çünkü 1) CWD'nin .git klasörünün olduğu yer olduğunu varsayar 2) git çalışma ağaçlarını kullanıyorum ve git çalışma ağaçlarıyla .git aslında gerçek .git klasörünün nerede olduğunu söyleyen bir dosyadır .
Alexander Bird

@AlexanderBird bu doğru değil ... 5. adımda eski commit mesajını almak istediğinizde, sadece göreceli bir yol belirtmeniz gerekir (diyelim ki /foo/bar/dizinde olduğunuzu, projelerin kök dizinine göre)git commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek

@AlexanderBird havalı, gitte birden fazla çalışan ağaç özelliği ile henüz fark etmedim. İpucu için teşekkürler! Bence bunun tek dezavantajı, kafanızda genel bir bakış bulundurmanız gerektiğidir, bu da gerçek koda odaklanmanızı engeller. Ve sadece "bıraktığım yerden" taahhüt mesajını almak için biraz ağır :)
Rudolf Tucek

1
@AlexanderBird o zaman :wdo :sav committmpve yerinegit commit -eF committmp
Hashbrown

0

Genellikle taahhütlerimi IntelliJsağlanan terminalleri kullanarak yapıyorum . Maalesef taahhütlerim manuel:

git commit -m'my message' // etc

bu yüzden yapmanın güvenli olduğunu düşündüğüm tek şey terminal penceresini kapatmak! Kaydetmek istiyorsanız metninizi vurgulayın, ardından kopyalayın ve ardından terminal penceresini kapatın.


-2

@bdonlan cevabı bu çok soru için iyi ama daha iyi bir çözüm isteyebileceğiniz bir duruma işaret edeceğim.

Son kaydetmeye değişiklikler eklemek istediğinizi varsayalım. Yani @bdolan'ın önerdiği gibi yaparsınız:

git add files
git commit --amend

Yeni mesajı yazarken, bu dosyaları o işleme eklemekten pişman olduğunuzu hayal edin. Sorun, önceden kaydedilmiş bir tamamlama mesajıyla takılıp kalmanız ve düzenleyiciden çıkmanız (kaydederek veya kaydetmeden) bu değişiklikleri son kaydetmeye ekleyecektir. Bu eylemlerden önceki noktaya geri dönmek , son taahhüdü bölmenizi gerektirir - eminim bundan kaçınmak istersiniz.

İşin püf noktası, düzenleyiciden yalnızca satırla başlayan #veya hiç satır içermeyen satırları kaydedip çıkmaktır . Çıktığınızda şu mesajla karşılanacaksınız:

Aborting commit due to empty commit message.

Ve son kaydı hiç değiştirmedin.


Söylediğin şeyin sorun olduğunu anlarsam, yanılıyorsun; Burada gösterilen: git commit; vim ....; git commit --amend; git reset HEAD@{1}. Şudur: Ben değişiklik "geri alma" istiyorsanız, o zaman do not önceki işlemek bölmek zorundayız. değişiklikten önce HEAD olan commit nesnesi olarak kaydedilir HEAD@{1}. Ayrıca zetta, yorum olmayan tüm satırların silinmesini zaten önerdi.
Alexander Bird
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.