Git'te eski commit mesajını değiştirin


136

Açıklandığı gibi eski bir commit mesajını düzenlemeye çalışıyordum Burada .

Mesele şu ki şimdi, koşmaya çalıştığımda rebase -i HEAD~5 çalıştığımda diyor interactive rebase already started.

Öyleyse deniyorum: git rebase --continueama bu hatayı aldım:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

Herhangi bir fikir?

Yanıtlar:


125

Diyor ki:

Düzenleyiciden kaydedip çıktığınızda, sizi bu listedeki son işleme geri saracak ve aşağıdaki mesajla sizi komut satırına bırakacaktır:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

Bu demek değil:

tekrar yaz git rebase -i HEAD~3

Düzenleyiciden çıkarken yazı yazmamaya çalışın ve düzgüngit rebase -i HEAD~3 çalışmalıdır.
(aksi takdirde, sizin özel durumunuzda, git rebase -i --aborther şeyi sıfırlamak ve tekrar denemenize izin vermek gerekebilir)


Dave Vogt'un yorumlarda bahsettiği gibi , ilk taahhüdü düzelttikten sonragit rebase --continue yeniden finansman sürecindeki bir sonraki göreve gitmek içindir .

Ayrıca Gregg Lind bahsedildi onun cevabını rewordkomutagit rebase :

"Seç" komutunu "düzenle" komutuyla değiştirerek, git rebase bu commit'i uyguladıktan sonra durmasını , böylece dosyaları ve / veya commit mesajını düzenleyebilir, commit'i değiştirebilir ve yeniden oluşturmaya devam edebilirsiniz.

Yalnızca bir commit için commit mesajını düzenlemek istiyorsanızpickreword , Git1.6.6'dan (Ocak 2010) itibaren " " komutunu " " komutuyla değiştirin .

Aynı şeyi ' edit' etkileşimli bir yeniden temelde yapar, tek farkı, kontrolü kabuğa döndürmeden yalnızca commit mesajını düzenlemenize izin verir . Bu son derece kullanışlıdır.
Şu anda taahhüt mesajlarınızı temizlemek istiyorsanız, yapmanız gerekenler:

$ git rebase -i next

Ardından tüm kayıtları 'düzenle' olarak ayarlayın. Sonra her birinde:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

' reword' Yerine ' ' kullanmak ve aramaları editatlamanızı sağlargit-commitgit-rebase .


2
Ayrıca, git rebase --continueilk taahhüdü değiştirdikten sonra yeniden finansman sürecindeki bir sonraki göreve gider.
Dave Vogt

1
Kaydetme mesajını değiştirmek için github wiki makalesine bağlantı ekleme
Joy

60

Gregg Lind'in önerdiği gibi, yeniden sözcük kullanarak yalnızca commit mesajını değiştirmeniz istenir (aksi takdirde commit'i olduğu gibi bırakabilirsiniz):

git rebase -i HEAD~n

İşte, nson n kaydetmenin listesi.

Örneğin, kullanıyorsanız git rebase -i HEAD~4, şuna benzer bir şey görebilirsiniz:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

Şimdi yerini almak ile reword Düzenlemeye istediğiniz mesajlar arasında kaydedilmesini için:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

Dosyayı kaydettikten sonra düzenleyiciden çıkın ve ardından yeniden sözcük olarak işaretlediğiniz kayıtların mesajlarını mesaj başına bir dosyada düzenlemeniz istenecektir . Eğer yerini zaman iletileri işlemek sadece düzenlemek çok daha kolay olurdu o Not pickile reword, ancak bunu yaparken hiçbir etkisi olmaz.

GitHub'ın kaydetme mesajını değiştirme sayfasında daha fazla bilgi edinin .


Çok iyi açıkladı. Teşekkürler: D
Shubham Jain

Teşekkürler @ShubhamJain Cevabımın faydalı olduğuna sevindim
Punit Vara,

Bunu yaptım ve diğer şubelerden taahhütler
Reza

@Reza bir şeyleri berbat etmiş olabilirsin. Bunu başka bir depoda deneyin. Bu çözüm mükemmel çalışıyor
Punit Vara

54

FWIW, git rebase Interactive'in artık bir "reword" seçeneği var, bu da bunu çok daha az acı verici hale getiriyor!


3
Kullanırken reword, git neden bu dosyadaki commit mesajlarını commit listesiyle düzenlemenize izin vermiyor? Bunun yerine, editörü rewordsatır başına bir commit mesajı dosyası ile başlatacaktır . Bu sadece gereksiz. Harici komutların başlatılmasından başka eylemler yapılsa pickveya rewordgerektirse bile , rewordbunu gerektirmez.
Dan Dascalescu

9

Sadece bunun için farklı bir seçenek sunmak istedim. Benim durumumda, genellikle kendi şubelerim üzerinde çalışıyorum, sonra ustalaşmak için birleşiyorum ve yerelime yaptığım bireysel taahhütler o kadar önemli değil.

Jira'da uygun bilet numarasını kontrol eden ancak büyük / küçük harfe duyarlı olan bir git kancası nedeniyle kodumu zorlamam engellendi. Ayrıca, taahhüt çok uzun zaman önce yapıldı ve geri ödemeye geri dönmek için kaç tane taahhüdü saymak istemedim.

Yaptığım şey, en son ustadan yeni bir şube oluşturmak ve tüm taahhütleri sorunlu daldan yeni dalda tek bir işleme dönüştürmek oldu. Benim için daha kolaydı ve bence onu gelecekte referans olarak burada bulundurmanın iyi bir fikir olduğunu düşünüyorum.

En son ustadan:

git checkout -b new-branch

Sonra

git merge --squash problem-branch
git commit -m "new message" 

Referans: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch


1
Cevabınız gerçekten günümü kurtardı :). rebase -iYaklaşık 2 saattir mücadele ettim ve başarılı olamadım. Benim taahhüdüm 18 kaydetmenin gerisindeydi, yani tahmin edebilirsiniz. Rebase kullanmaya gerek kalmadan bulabildiğim daha basit ve kullanışlı yol buydu. Teşekkürler arkadaşım!
Carlos Parra

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.