Git: Birleştirme işleminin iletisini nasıl düzenleyebilir / yeniden yazabilirim?


148

Birleştirme işleminin iletisini nasıl düzenler veya yeniden yazarım?

git commit --amendson yapılan iş ise ( HEAD), ama önce gelirse ne olur HEAD?

git rebase -i HEAD~5 birleştirme taahhütlerini listelemez.

Yanıtlar:


207

--preserve-mergesSeçeneği (veya eşanlamlısını -p) git rebase -ikomuta eklerseniz git, geçmişi yeniden doğrusallaştırmak yerine yeniden basarken birleştirmeleri korumaya çalışır ve birleştirme işlemlerini de değiştirebilmeniz gerekir:

git rebase -i -p HEAD~5

1
Bunu yaptım ama değişikliklerimi yaptıktan sonra değişiklikleri değiştirmeye çalışıyorum! [rejected] HEAD -> master (non-fast-forward)error: failed to push some refs to
Marc

1
git push -f komutunu, ardından da başlangıç ​​dalınızı çalıştırmayı deneyin. bu çalışmalı. Aynı sorunu yaşadım, bazı nedenlerden ötürü bu yeniden temelleme yapısından kaynaklanıyor çünkü temelde olan şey, yeniden bastırmadan sonra müstakil bir çitle sonuçlandığınız, yani -force bunu düzeltmeli ve her şeyi itmeli.
Radu Comaneci

11
@Marc Bu, zaten gönderdiğiniz taahhütleri değiştirdiğiniz için olur. Sizi ve iş arkadaşlarınızı tamamen yok edebileceğinden bir sunucuya zorla göndermenin kötü bir uygulama olduğu düşünülmektedir. Yalnızsanız sorun olmamalı.
ibizaman

HEAD~5Değiştirmek istediğiniz taahhüdün üst öğesi nerede (genellikle sha1 ^).
Gabriel Devillers

2
--preserve-mergesşimdi--rebase-merges
OrangeDog

32

, Unutmayın git1.7.9.6 başlayan , (ve git1.7.10 +) git mergekendisi hep editörü tetikleyecek bir birleştirme ayrıntılı bilgi eklemek için.

git merge $tagAçıklamalı bir etiketi birleştirmek için " ", etkileşimli bir düzenleme oturumu sırasında düzenleyiciyi her zaman açar. v1.7.10 serisi, eski komut dosyalarının bu davranışı azaltmasına yardımcı olmak için GIT_MERGE_AUTOEDIT ortam değişkenini tanıttı, ancak bakım yolu da bunu desteklemelidir.

Ayrıca, GIT_MERGE_AUTOEDITeski komut dosyalarının bu davranışı reddetmesine yardımcı olacak bir ortam değişkeni de sunar .

Bkz. " Git 1.7.10'u Beklemek ":

Son zamanlarda Git posta listesindeki bir tartışmada Linus, bunun Git tarihinde erken yaptığımız tasarım hatalarından biri olduğunu kabul etti (ve ben de kabul ettim).
Ve 1.7.10 ve sonrasında, etkileşimli bir oturumda çalıştırılan git birleştirme komutu (yani hem standart girdisi hem de bir terminale bağlı standart çıkışı) birleştirme sonucunu kaydetme taahhüdü oluşturmadan önce bir düzenleyici açacaktır. kullanıcı, birleştirme işlemini açıklamak için bir şans, tıpkı çakışan bir birleştirmeyi zaten çözdükten sonra çalışan git command komutu gibi.

Linus şunları söyledi:

Ama aslında nasıl çalıştığını gerçekten umursamıyorum - asıl sorun git birleştirme mesajlarının alınmasını çok kolaylaştırıyor.
Ben bunun bir parçası daha basit bir aptallık olduğunu düşünüyorum: "git birleştirme" için varsayılan olarak editörü aslagit commit
ateşlemiyoruz , ama " " için yapıyoruz . Bu bir tasarım hatasıydı ve bir birleştirmeye gerçekten bir not eklemek istiyorsanız, ekstra iş yapmanız gerektiği anlamına gelir. Yani insanlar bilmiyorlar .


Git 2.17'den (2. Çeyrek 2018) önce, " git rebase -p" birleştirme taahhüdünün şu anda düzeltilmiş olan günlük mesajlarını karıştırdığını unutmayın.

Bkz ed5144d taahhüt tarafından (08 Şubat 2018) Gregory Herrero ( ``) . Öneren
: Vegard Nossum ( vegard) ve Quentin Casasnovas ( casasnovas) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 8b49408 tamamlama 2018, 27 Şubat)

rebase -p: arama yaparken yanlış gönderme mesajını düzeltin git merge.

Yana dd6fb00 taahhüt ( " rebase -p: çağrılırken düzeltme alıntı git merge", Ocak 2018, Git 2.16.0-rc2), bir altkabuk yürütme 'kullanarak birleştirme komutu geçirilir rebased commit birleştirme mesajı işlemek git rev-parse --sq-quote'.

git mergeKomut için yeni satırların tutulması için bu alt kabuğun etrafında çift tırnak işareti gerekir .

Bu düzeltme ekinden önce, aşağıdaki birleştirme iletisini izleyin:

"Merge mybranch into mynewbranch

Awesome commit."

dönüşür:

"Merge mybranch into mynewbranch Awesome commit."

sonra a rebase -p.


Git 2.23 (Q2 2019) ile, " merge -c" sırasındaki bir " " talimatı git rebase --rebase-merges, aksi takdirde yeni bir birleştirme oluşturmaya ve var olanı değiştirmeye gerek kalmasa bile (örneğin hızlı ileri sarma) kullanıcıya günlük mesajını düzenleme şansı vermelidir. ), ama yapmadı.
Hangi düzeltildi.

Bakınız Phillip Wood ( ) tarafından 6df8df0 (02 Mayıs 2019) taahhüdü . (Göre Birleştirilmiş Junio Cı Hamano - - içinde işlemek c510261 , 13 Haziran 2019)phillipwood
gitster


16

Sadece ilkel komutları kullanan başka bir güzel cevap - yazan knittl https://stackoverflow.com/a/7599522/94687 :

git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch

veya daha iyi (daha doğru) bir son rebase komutu:

git rebase <sha of merge> previous_branch --onto HEAD

BTW, ilkel komutları kullanmak, çok fazla CPU tüketmemek ve Git'in durumda yeniden temel alınması gereken taahhütlerin listesini düşünmeyi bitirene kadar bilinmeyen bir süre beklemenizi sağlayan güzel bir "özelliğe" sahip olabilir git rebase -p -i HEAD^^^^. benim durumumda sonuncusu birleştirme ile sadece 4 son taahhütlerin listesi benim durumda yaklaşık 50 saniye sürdü!).


2
Bu gerçekten faydalı, biraz zaman kazanın. Şirketim, --amend veya rebase komutları ile kolay olan depodaki bazı taahhüt mesajlarını engeller, ancak: Bazı şubeleri sizinkine birleştirirsek, bazı taahhütler uygulayıp itmeye çalışırsak büyük sorun, git'in varsayılan birleştirme mesajı engellenir ( bu düzeltilmeli, biliyorum) bizi bu mesajı değiştirmeye zorlar. Bu cevaba kadar başarı ile değil taahhütlerin tarihi arasındaki birleştirme mesajını değiştirmek için birçok şey denedim.
Giovanni Silva

2

git merge --edit
Etkileşimli olmayan birleştirme durumunda bile yorum yapmanıza olanak tanır.

git merge --edit --no-ff geliştirme akışını yeniden temel alarak ve hızlı ilerlemeden birleştirerek git akışını izlerseniz yararlı olabilir.


2

Mevcut Git sürümleri için (Mai 2020):

git rebase -i -r <parent>,

daha sonra düzenleyicisinde yerine merge -C ...ile merge -c ....

Bu işlem, yeniden ayarlama sırasında değiştirebileceğiniz komut mesajını düzenleyicide açar.

(Sayesinde VonC için ipucu .)


0

git rebase -i HEAD~5Komut editörü açılır. Belirtilen taahhütleri listeler (bu durumda beş tanesi). İlk sütun pickher taahhüt için içerir . Sadece bu düzenleyicide pickile değiştirin ve reworddüzenleyiciyi kaydedin + kapatın. Sonra git her taahhüt için değiştin nerede editörü açılır picketmek rewordve iletiyi işlemek düzenlemenize olanak sağlar.


6
Ayrıca eklemek sürece bir birleştirme işlemi için çalışmıyor Bu taahhüt -petmek git rebasekomutu.
Paul Price

4
Farklı bir soru olsaydı harika cevap
doz87
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.