İtme işleminden sonra git komut mesajını değiştirme (kimsenin uzaktan çekilmediği göz önüne alındığında)


982

Bir git taahhüdü ve sonraki itme yaptım. İşlem mesajını değiştirmek istiyorum. Doğru anlarsam, bu tavsiye edilmez, çünkü bu tür değişiklikleri yapmadan önce biri uzak depodan çekmiş olabilir. Kimsenin çekmediğini bilsem ne olur?

Bunu yapmanın bir yolu var mı?


Ne denedin? Tamamlama mesajını nasıl değiştireceğinizi bildiğinizi ve ardından denemeyi denediğinizi varsayarsak, bunu gerçekleştirmek için ne yapmanız gerektiğini söyleyecektir.
Andrew Marshall

1
"Git'te yanlış bir kesinleştirme mesajını nasıl düzenlerim?" stackoverflow.com/a/457396/444639
Mike Rylander

4
Beyan - Google Soru git taahhüt Sıra no 1!
Manish Shrivastava


HEAD taahhüdünü değiştirir ve genellikle (kuvvet olmadan) iterseniz, şaşırtıcı bir şekilde başarısız olmaz. HEAD kesinleştirme mesajı, değişen kesinleştirme kimliği ile güncellenir. HEAD hariç diğer taahhüt kimlikleri olduğu anlamına gelir. Git 2.8.1 sürümünde bu davranışı fark ettim.
irsis

Yanıtlar:


1373

Değişiklik geçmişi

En son taahhüt ise, bunu yapabilirsiniz:

git commit --amend

Bu, düzenleyiciyi son işleme mesajı ile birlikte getirir ve mesajı düzenlemenizi sağlar. ( -mEski mesajı silmek ve yeni bir mesaj kullanmak istiyorsanız kullanabilirsiniz.)

itme

Ve sonra ittiğinizde bunu yapın:

git push --force-with-lease <repository> <branch>

Veya "+" kullanabilirsiniz:

git push <repository> +<branch>

Veya şunları kullanabilirsiniz --force:

git push --force <repository> <branch>

Bu komutları kullanırken dikkatli olun.

  • Birisi değişiklikleri aynı şubeye gönderdiyse, muhtemelen bu değişiklikleri yok etmek istemezsiniz. --force-with-leaseHerhangi memba değişikliği olduğu takdirde o (iptal çünkü seçenek, en güvenli olduğu

  • Şubeyi açıkça belirtmezseniz, Git varsayılan push ayarlarını kullanır. Varsayılan push ayarınız "eşleşiyorsa", aynı anda birkaç koldaki değişiklikleri yok edebilirsiniz.

Daha sonra çekme / getirme

Zaten çekmiş olan herkes şimdi bir hata mesajı alır ve aşağıdaki gibi bir şey yaparak güncellemeleri gerekir (kendinde herhangi bir değişiklik yapmadıkları varsayılarak):

git fetch origin
git reset --hard origin/master # Loses local commits

Kullanırken dikkatli olun reset --hard. Şube üzerinde değişiklikleriniz varsa, bu değişiklikler imha edilir.

Geçmişi değiştirme hakkında bir not

Yok edilen veriler gerçekten sadece eski işlem mesajıdır, ancak --forcebunu bilmez ve diğer verileri de mutlu bir şekilde siler. Bu yüzden --force"Verileri yok etmek istiyorum ve hangi verilerin yok edildiğinden eminim" diye düşünün . Ancak, yok edilen veriler işlendiğinde, çoğu zaman eski taahhütleri reflogdan kurtarabilirsiniz; veriler yok edilenler yerine aslında yetim kalır (yetim kalan taahhütler periyodik olarak silinmesine rağmen).

Verileri yok ettiğinizi düşünmüyorsanız, o zaman uzak durun --force... kötü şeyler olabilir .

Bu yüzden --force-with-leasebiraz daha güvenlidir.


13
Bu "düzeltmeye" dikkat edin, sanki yerel, baskısız taahhütleri varmış gibi "kaybolacaklar" ( gerçekten öksüz kalan anlamını yitirdiler , ancak onları kurtarmak açık değildir).
Andrew Marshall

1
muhtemelen - kuvvet uyguladığınızda şube adını belirtmek istersiniz, aksi takdirde beklenenden daha fazla itebilirsiniz.
user693960

1
@ user693960: Git yalnızca itmek için yapılandırdığınız şeyi zorlar.
Dietrich Epp

10
git push --forceYukarı akışınızı ayarladıysanız, sadece <repository> ve <branch> seçenekleri olmadan da çalışır.
ahnbizcad

2
Bir örnek verebilir misiniz <repository>? Öyle mi origin? org/repo? Yoksa sadece repomi?
MikeSchinkel

440

Sadece söyle :

git commit --amend -m "New commit message"

ve sonra

git push --force

8
Benim durumumda git push origin <BRANCH-NAME>işe yaramadı, git push --forcekabul edilen cevapta açıklandığı gibi kullanmak zorunda kaldım .
Gabriel

1
bu benim için işe yaramıyor. Bizi almalıydı git push --force, yoksa itme gerçekleşmez.
ahnbizcad

4
@ahnbizcad, işe yaramalı. Şube adının doğru olduğundan emin olun.
William

3
Açıklamanızdaki sadeliğe tezahürat ediyorum! Sık kullandığımdan daha fazla kullanıyorum
Vasikos

3
Bu komutu yalnızca GitLab tarafından barındırılan projemde gerçekleşen şubemin geçici olarak "korumasını kaldırdıktan" sonra başarıyla uyguladım. Bu sorunla karşılaşırsanız, bu komutları uygulamadan önce , dalı "korumasını kaldırmak" için lütfen bu stackoverflow.com/a/32267118/1423345 adresine başvurun ve işlem iletisini değiştirdikten sonra tekrar "koruyabilirsiniz :)
John

261

En son dışında bir taahhüdü düzenlemek için:

Adım 1 : Etkilenen git rebase -i HEAD~nson ntaahhütler için etkileşimli rebase yapmak . (örn. 3'ün geri verdiği bir taahhüt mesajını değiştirmek istiyorsanız, yapın git rebase -i HEAD~3)

git bu taahhütleri işlemek için bir editör açacaktır, şu komuta dikkat edin:

#  r, reword = use commit, but edit the commit message

tam da ihtiyacımız olan şey bu!

Adım 2 : Değişim pickiçin rmesajı güncellemek isteyenler kaydedilmesini için. Burada taahhüt mesajını değiştirmeye zahmet etmeyin, yok sayılır. Bunu bir sonraki adımda yapacaksınız. Düzenleyiciyi kaydedin ve kapatın.

Rebase 'plan'ınızı düzenlerseniz, ancak dosyaları yeniden adlandırmanıza izin verme işlemine başlamazsa şunu çalıştırın:

git rebase --continue

Etkileşimli oturum için kullanılan metin düzenleyicisini değiştirmek istiyorsanız (örneğin, varsayılan vi'dan nano'ya), şunu çalıştırın:

GIT_EDITOR=nano git rebase -i HEAD~n

3. Adım : Git, daha rönce yaptığınız her düzeltme için başka bir düzenleyici açacaktır . İşleme mesajını istediğiniz gibi güncelleyin, ardından editörü kaydedin ve kapatın.

Adım 4 : Tüm işlemlerin ardından mesajlar güncellenir. git push -fuzaktan kumandayı güncellemek isteyebilirsiniz .


21
Kabul edilen cevaptan farklı olarak, en son taahhütlerden başka taahhütleri değiştirme imkanı sağladığı için bu cevap kabul edilmelidir. Günümü kurtardın. Teşekkür ederim!
xZero

1
Son 3 işlem için n = 3 git rebase -i HEAD~3
seçimini yapın

Rebase 'plan'ınızı düzenlerseniz, dosyaları yeniden adlandırmanıza izin vermez, çalıştırın git rebase --continue. Eğer (örneğin varsayılan interaktif oturum için kullanılan metin editörü değiştirmek istiyorlarsa viiçin nano), koşmak GIT_EDITOR=nano git rebase -i HEAD~n.
Jamie Birch

Biraz daha bilgi eklemek için bunu düzenledim. Lütfen bir bak. Yapmak istediğim şeyin cevabı buydu, ama üstbilgisi olmadığı için kaydırdım.
Kip

Ben @JamieBirch gelen yararlı yorum cevap koymak için önerilen bir düzenleme yaptım, incelemek isteyebilirsiniz.
Notts90 Monica

44

Konsolda şu iki adımı kullanın:

git commit --amend -m "new commit message"

ve sonra

git push -f

Tamamlandı :)


Teşekkürler, Bu adımlar yalnızca son yorumu değiştirmek için mi yoksa daha eski yorumlar için de kullanılabilir mi?
Jay

@ Geç cevap için üzgünüm, bu adımlar sadece son taahhüt mesajı değiştirmek için.
Abdul Rizwan

19

Unutulmamalıdır kullanırsanız push --forcemutiple hakemlerimizle, onlar TÜM sonucunda değiştirilecektir. Git deponuzun itmek için yapılandırıldığı yere dikkat ettiğinizden emin olun. Neyse ki, güncellenecek tek bir dal belirterek süreci biraz korumanın bir yolu var. Git man sayfalarından okuyun:

--Force öğesinin itilen tüm referanslar için geçerli olduğunu, bu nedenle bunu push.default ile eşleşecek şekilde ayarlanmış olarak veya uzaktan kumanda ile yapılandırılmış birden fazla itme hedefiyle birlikte kullanıldığını unutmayın. *. Push, geçerli şube dışındaki ( kesinlikle uzak meslektaşlarının arkasında). Bir zorlamayı yalnızca bir dala zorlamak için, itmek için refspec öğesinin önünde bir + kullanın (örneğin, ana dalı zorla zorlamak için git push origin + master).


3
Çok önemli not.
peterh - Monica

sunucuda ForcePush izinlerine sahip olmadığım için zor yanıtların hiçbiri benim için çalışmıyor. Bunun yerine, önceki bir yürütme iletisini değiştiren bir yürütme gerçekleştirmek istiyorum. Bu komutun yorum bölümüne "taahhüt mesajı değişti" yazabilirim.
nurettin

11

Daha eski bir rebasekomutu değiştirmek istiyorsanız, sonuncuyu değil, burada açıklanan komutu kullanmanız gerekir , Github yardım sayfası , Eski veya birden çok kesin mesajın mesajını değiştirme bölümü


11

Komut 1 .

git commit --amend -m "New and correct message"

Sonra,

Komut 2 .

git push origin --force

8
git commit --amend

ardından geçerli pencerede mesajı düzenleyin ve değiştirin. Bundan sonra yapın

git push --force-with-lease

2

Başka bir seçenek de, hatayı içeren komut nesnesine başvuran ek bir "hata bildirimi" (ve push) oluşturmaktır - yeni hata bildirimi de düzeltmeyi sağlar. Hatalı taahhüt, önemli kod değişiklikleri olmayan ancak önemli bir taahhüt mesajı olan bir taahhüttür - örneğin, benioku dosyanıza bir boşluk karakteri ekleyin ve bu değişikliği önemli taahhüt mesajıyla taahhüt edin veya git seçeneğini kullanın --allow-empty. Kesinlikle yeniden basmaktan daha kolay ve güvenlidir, gerçek geçmişi değiştirmez ve şube ağacını temiz tutar (kullanarakamenden son taahhüdü düzeltiyorsanız da iyi bir seçimdir, ancak errata taahhüdü daha eski taahhütler için iyi bir seçim olabilir). Bu tür şeyler o kadar nadiren olur ki, hatayı belgelemek yeterince iyidir. Gelecekte, bir özellik anahtar kelimesi için bir git günlüğünde arama yapmanız gerekirse, orijinal (hatalı) tamamlama, orijinal tamamlamada (orijinal yazım hatası) yanlış anahtar kelime kullanıldığından görünmeyebilir - ancak, anahtar kelime görünecektir daha sonra yazım hatası olan orijinal taahhüde işaret edecek olan errata taahhüdünde. İşte bir örnek:

$ git günlüğü
taahhüt 0c28141c68adae276840f17ccd4766542c33cf1d
Yazar: İlk Son 
Date: Çar 8 Ağu 15:55:52 2018 -0600

    Errata taahhüt:
    Bu taahhütte önemli bir kod değişikliği yoktur.
    Bu işlem yalnızca önceki işlem iletisindeki bir düzeltmeyi belgelemek için sağlanmıştır.
    Bu, e083a7abd8deb5776cb304fa13731a4182a24be1 nesnesini yürütmekle ilgilidir
    Orijinal yanlış işlem mesajı:
        Arka plan rengi kırmızıya çevrildi
    Düzeltme (* vurgulanan değişiklik *):
        Arka plan rengi * mavi * olarak değiştirildi

taahhüt 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Yazar: İlk Son 
Date: Çar 8 Ağu 15:43:16 2018 -0600

    Bazı geçici taahhüt mesajları

taahhüt e083a7abd8deb5776cb304fa13731a4182a24be1
Yazar: İlk Son 
Date: Çar 8 Ağu 13:31:32 2018 -0600

    Arka plan rengi kırmızıya çevrildi

rob, bu umut verici görünüyor. bir "hata yapma" işlemi için gereken komutları gösterebilir misiniz? Google'da yalnızca bu gönderi bu şartlarda gösterilir.
Jim

1
Bir "hata taahhüdü", önceki hatalı taahhüdü referans alan, önceki hata için bir dokümantasyon ve düzeltme sağlayan bir mesajla normal bir taahhüttür. git commit -m “fixed feature A”(Git'in buna e3ab7312'nin bir taahhüt kimliğini verdiğini varsayalım ... ... (daha sonra mesajınızın yanlış olduğunu fark edersiniz, bu yüzden şimdi benioku dosyasına boşluk eklemek gibi bir dosyada anlamsız bir değişiklik yapın veya —allow-emptygit seçeneğini kullanın). .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’'' '
rob_7cc

1
... daha sonra git günlüğünde "B" özelliğine başvurmak için arama yapmanız gerekiyorsa, errata kesinleştirmesi görünecektir, ancak errata kesinleştirme mesajı, tam izlenebilirlik sağlayan orijinal kesinleştirme kimliğine bir referans içerir. BTW “errata taahhüdü” terimi özel bir şey değildir (git'te “errata” komutu veya seçenek yoktur) ... bu sadece bir hata / yazım hatası olan önceki bir taahhüde düzeltme sağlayan normal bir taahhüdün terminolojisidir.
rob_7cc

rob, harika çalıştı. SHA'yı kullanarak, orijinal taahhüdüne işaret eden doğru açıklama ile yeni bir boş taahhüt ekleyebildim. şimdi her ikisi de modüller için 'git zincirimde gösteriliyor. Teşekkürler!
Jim

Bunun senin için çalışmasına sevindim. Tamamlama mesajlarındaki hataları düzeltmek için aynı tekniği kullanıyorum. Alternatif olarak, yakın zamanda keşfettim git notes Bu bir "errata taahhüt" ile aynı amaca hizmet edecek. https://git-scm.com/docs/git-notes
Taahhüt

0

Bu benim için gayet iyi çalışıyor,

git çıkış kaynağı / şube adı

zaten şubedeyseniz, çek veya yeniden yap daha iyi

git pull

veya

git -c core.quotepath=false fetch origin --progress --prune

Daha sonra kullanabilirsiniz

git commit --amend -m "Your message here"

veya metin düzenleyiciyi açmak isterseniz

git commit --amend

Çok fazla yorumunuz varsa metin editörünü kullanmayı tercih ederim. Tercih ettiğiniz metin düzenleyiciyi komutla ayarlayabilirsiniz

git config --global core.editor your_preffered_editor_here

Her neyse, tamamlama mesajını değiştirmeyi bitirdiğinizde, kaydedin ve çıkın

ve sonra koş

git push --force

Ve işin bitti


0

bitbucket boru hattı kullanıyorsanız aynı sorun için ek bilgi

mesajını düzenle

git commit --amend

koparmak

git push --force <repository> <branch>

sonra ardışık düzende push komutunuza --force ekleyin

git ftp push --force

Bu, önceki işlem (ler) inizi silecek ve geçerli işleminizi zorlayacaktır.

ilk itmeden sonra --force'u kaldır

Bitbucket boru hattı ve onun iyi çalışıyor denedim

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.