Git: 'git reset'ten sonra commit mesajları nasıl yeniden kullanılır / saklanır?


104

Git kullanıcısı olarak, düzenli olarak bir veya daha fazla işlemi düzeltme işlemlerine uymayan --amendveya bunlara uymayan bir şekilde yeniden işlemem gerektiği durumuyla karşılaşıyorum rebase -i. Genellikle şöyle bir şey yapardım

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

Mantıklı ve dengeli işlem mesajlarını oldukça ciddiye alıyorum. Genellikle değişiklik için referanslar ve gerekçeler içeren daha büyük metinler içerirler. Şimdiye kadar, oldukça benim eski bir sıralanmamış aracılığıyla mesaj taahhüt kurtarmak için uzun bir süreç üzerinde rahatsız ediyorum git reflog, git logve kopyalama & sürecini yapıştırın.

Bununla başa çıkmanın daha iyi bir yolu var mı? Birden fazla taahhüt içermesi durumunda nasıl olur?

Düzenleme: Bunu biraz düşündükten sonra, aradığım şeyin, fixup / amend commit'lerin uygun olmadığı commit mesajları için git stash benzeri bir işlevsellik olduğunu düşünüyorum .


2
Tüm yaptığınız git reset head~1olsaydı, eski commit mesajınız sadece 2. giriş olmaz reflogmıydı?

Evet - ama mesajı kopyalayıp yapıştırmadan nasıl yeniden kullanabilirim (ki bu genellikle manüel olarak girintiyi kaldırmayı gerektirir)
bentolor

Bugünlerde, sadece gitkaçın. Bu şekilde reflog'u kullanmak zorunda bile kalmazsınız. Alternatif olarak, rev-parse <branch>sıfırlamadan önce hash'inizi almak için kullanın ve ibizaman'ın cevabını kullanın.
cst1992

Yanıtlar:


144

A'dan sonra git reset, bu tek satırlık bunu yapabilir:

git commit --reuse-message=HEAD@{1}

hatta daha kısa:

git commit -C HEAD@{1}

@ User2718704 tarafından verilen diğer seçenekleri kullanabilirsiniz .


6
Daha kısa:git commit -C@@{1}
Phu Ngo

2
Bu reflog fantastik bir kullanımıdır
David Mann

24
Sıfırlamadan sonra, ORIG_HEAD ayarlanır. git commit --reuse-message=ORIG_HEADEn net buluyorum .
Scott Jacobsen

45

"Git commit" komutunu çalıştırırken aşağıdaki seçenekleri kontrol etmelisiniz,

Yeniden kullanmak için

--reuse-message=<commit>

Yeniden kullanımda düzenlemek için,

--reedit-message=<commit>

Yazarı değiştirmek için,

--reset-author

1
En kapsamlı yanıtı sağladığı için bunu yeni çözüm olarak işaretledi. Yine de bu çözüm, 'geri getirme' sorunlarımı tam olarak çözmüyor.
bentolor

9

Hackleyebilir, onarabilir, hackleyebilir ve ardından çalıştırabilirseniz neden sıfırlayın git commit --amend --no-edit; böylece, orijinal commit mesajınızı korursunuz.

Birden çok kaydetme için çalışmasını sağlamak için, yalnızca en yeni değişikliklerinizle geçici bir kesinleştirme oluşturun ve ardından eski kaydetmenin commit mesajını koruyarak yeni geçici olanla önceki tamamlamayı (iyi kaydetme mesajını içeren) ezmek için etkileşimli bir yeniden temel kullanın.


2
Etkileşimli bir yeniden temelleme yaparken, fixuptalimatı, sonraki yürütmenin önceki kaydetmeyi düzeltmek olduğunu ve hata düzeltme işleminden gelen mesajı atarak orijinaldeki commit mesajını otomatik olarak kullanacağını bildirmek için bile kullanabilirsiniz .
qqx

Örneğin, zorunlu güncellenen bir çekme isteklerini yeniden birleştirmek istersem. Veya kaydetme sonuncusu değilse ve HEAD'e göre kolayca düzeltilemiyorsa ve bunları yeniden yapmak daha kolaysa.
bentolor

@BenTebulin Aslında, etkileşimli yeniden taban, belirli bir işlem aralığında herhangi bir kaydetmeyi değiştirmenize izin verir. Değiştirilmesi gereken kesinlikle HEAD commit değildir.
mart1n

@ tecrit ediyor için mart1n teşekkürler edit içinde rebase -i. Asla bu bağlamda kullanmadım. Diğer cevabı yeniden birleştirme gibi diğer durumlar için soruma daha uygun, bu yüzden onu cevap olarak işaretledim.
bentolor

Intellij, yalnızca henüz kaydedilmemiş dosyalarda çalışan kapsamlara sahiptir. Dosyaları, örneğin, intellij'e dosyaları bırakması ve ardından bu dosyaları aynı mesajla yeniden işleme talimatı verilebilmesi için, yeniden yüklenmemiş olarak sıfırlamak faydalıdır. intellij'in kapsam belirleme sınırlamaları nedeniyle değişiklik işe yaramayacaktır.
David Mann

5

git commit --reset-author -c <commit>Kaydetme mesajını düzenleme ve geçerli saat ile yeniden kullanmayı düşünebilirsiniz .


Teşekkürler - bu aradığım şeye oldukça yaklaştı.
bentolor
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.