GitHub'da bir taahhüt mesajı düzenlemenin bir yolu var mı?


129

GitHub’a taahhüt ettikten ve taahhüt ettikten sonra bir taahhüt mesajı düzenlemenin bir yolu var mı? Satır içi yorumlamanın yanı sıra bir 'not ekle' olduğunu, ancak bir işleme iletisinin fiili düzenlemesinin olmadığını görüyorum. Ayrıca git uzantılarında 'düzeltme taahhüdü' var ancak bu mevcut mesajı düzenlemiyor.


Taahhüdünüzü geri almayı deneyebilirsiniz (bu SO sorusundaki bazı seçeneklere bakın: stackoverflow.com/questions/4114095/… ) - yalnızca kod değişikliklerini ilk önce yedeklediğinizden emin olun;
Tech Guy Seyahat

Yanıtlar:


183
  1. git rebase -i <commit hash you want to change>^

    Bu, varsayılan editörünüzü (genellikle ) her biri için bir taahhüt ve işlem listesiyle açacaktır . Varsayılan olarak, eylem pick.

  2. Herhangi mesajı değiştirmek isteyen işlemek için, değiştirmek pickiçin reword.

  3. Kaydet ve çık (vi: 'de :wq).

  4. Bu tür bir taahhüt için, taahhüt mesajını düzenlemek üzere bir editör alacaksınız. Uygun gördüğünüzde değiştirin, kaydedin ve çıkın.

    Tüm taahhüt mesajlarını düzenlemeyi tamamladığınızda, komut istemine geri dönersiniz ve güncellenmiş mesajlarla yeni bir ağacınız olur.

  5. Artık bunları kullanarak github'a yükleyebilirsiniz git push origin --force.

Son taahhüdünüzü düzeltmeniz gerekiyorsa, 1-4 arası adımları ile değiştirebilirsiniz git commit --amend.


3
@MatthewPeters Bir yolu olmalı, ama bilmiyorum - Komut satırını doğrudan kullanıyorum.
Mureinik

4
<Değiştirmek istediğiniz karmayı taahhüt et> belirtmiş gibi görünmüyorsunuz, bunun yerine HEAD ~ x değerini değiştirmek için HEAD'den aldığınız emir sayısını belirtmek zorundasınız. değiştirmek istediğiniz öğe bulunur.
ssc327

3
@ ssc327 Not Ben bir ^oradayım - gerçekten değiştirmek istediğiniz taahhüdünün ebeveyni üzerine yeniden düzenlemeyi önerdim .
Mureinik

2
@Murenik haklısın, bir şekilde ^
ssc327

1
@deadfish Windows komut satırını kullanarak komutu ^^tam anlamıyla bitirmek için yazmanız gerekir, ^ örneğin: git rebase -i 2c747b32^^
Wyck

35

Intellij Idea'da bunu çok kolay yapabilirsiniz.

  1. Sürüm Kontrolünü Aç (Tarihçe)
  2. Günlük sekmesini seçin
  3. Yorum değiştirmek için taahhüt ver
  4. F2'ye (Mac fn + F2) basın ve mesajınızı güncelleyin

1
Zaten uzaktan ittiyseniz, çalışmıyor.
ödemeli

8
git push origin --force@ Mureinik'in cevabında önerildiği gibi daha sonra çalıştırmanız gerekir.
Dan Macák

1
Taahhüdün çoktan verilmesi halinde "yeniden cevaplama" seçeneği devre dışı bırakılır.
huyz

1
İstenilen bir taahhüt için Intellij IDEA ile yapmak için önce etkileşimli bir rebase ile başlamanız gerekir (Git komut satırından yaptığınız gibi). Rebase yapmak için, projenize sağ tıklayın -> "Git" menü noktası -> "Repository" -> "rebase ..." (son menü maddesi). “Onto” alanında değiştirmek istediğiniz işlemden önce SHA'yı ekleyin ve “Rebase” tıklayın. Ardından etkileşimli yeniden isteme istemini alırsınız. Değiştirmek istediğiniz taahhüt (ler) in yanındaki
eylem açılan kutusundan "yeniden oluştur

1
(devam) Daha sonra değiştirmek istediğiniz her taahhüt için bir metin istemi sunulur. Günlük mesajları değiştirildikten sonra, başka değişiklikler de uygulayabilirsiniz (artık "yeniden cevaplama" seçeneğinin artık gri olmadığını unutmayın). İşiniz bittiğinde, etkileşimli yeniden düzenlemeyi tamamlamak için değişikliklerinizi zorlamaya başlayabilirsiniz. Tüm süreç aslında tam olarak komut satırından yapan @Mureinik'in cevabında olduğu gibidir.
jplandrain

3

Öncül:

git grafiğe benziyorsa ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192ve b7ec061ayrı ayrı hedef ve ana-taahhüt taahhütleridir)

Çözüm:

Sadece aşağıdaki talimatları yazabilirsiniz ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

Açıklama:

  1. git reset --soft b7ec061 dosya değişikliklerinizi koruyacak ve üst işleme (yani b7ec061) olarak sıfırlayacaktır
  2. git commit -m "..." yerel olarak yeni bir taahhüt oluşturacak
  3. git push -f sunucuya olan yeni taahhüdünüzü zorlar ve eskisini değiştirir (yani df9c192)

2

Başka bir seçenek de hatayı içeren taahhüt nesnesine başvuran ek bir "errata taahhüdü" (ve itme) oluşturmaktır - yeni hata düzeltmesi de düzeltmeyi sağlar. Hatalı bir taahhüt, önemli bir kod değişikliği içermeyen bir taahhüt, fakat önemli bir taahhüt mesajıdır - örneğin, benioku dosyasına bir boşluk karakteri ekleyin ve bu değişikliği önemli taahhüt mesajı ile yapın veya git seçeneğini kullanın --allow-empty. Kesinlikle yeniden doğmaktan daha kolay ve güvenlidir, gerçek tarihi değiştirmez ve dal ağacını temiz tutar (kullanarakamendAynı zamanda, en son taahhüdünüzü düzeltiyorsanız iyi bir seçimdir, ancak bir errata taahhüdü daha büyük taahhütler için iyi bir seçim olabilir). Bu tür şeyler o kadar nadiren olur ki, sadece hatayı belgelemek yeterlidir. Gelecekte, bir özellik anahtar sözcüğü için bir git günlüğü üzerinden arama yapmanız gerekirse, orijinal (hatalı) değerlendirme görünmeyebilir, çünkü yanlış anahtar kelime bu orijinal işleme (orijinal yazım hatası) olarak kullanılmış - ancak anahtar kelime görünecektir. errata taahhüdünde, bu da sizi, yazım hatası olan orijinal taahhüdüne yönlendirecektir. İşte bir örnek:

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

    Errata taahhüt:
    Bu taahhüdün önemli bir kod değişikliği yok.
    Bu taahhüt yalnızca önceki bir taahhüt mesajına yapılan düzeltmeyi belgelemek için sağlanmıştır.
    Bu, e083a7abd8deb5776cb304fa13731a4182a24be1 nesnesini işlemeye yöneliktir
    Orijinal yanlış taahhüt mesajı:
        Arka plan rengini kırmızıya değiştirdi
    Düzeltme (* vurgulanan * değişiklik):
        Arkaplan rengini * mavi * olarak değiştirdi

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

    Bazı geçici taahhüt mesajı

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

    Arka plan rengini kırmızıya değiştirdi

Herhalde güvenli, fakat okunacak çok fazla metin var. Ben tarih :) yeniden tercih ediyorum
pkalinow

0

@Mureinik'in cevabı iyi ama acemi tarafından anlaşılmaz.

İlk yöntem:

  1. Yalnızca en son taahhüt mesajını düzenlemek istiyorsanız, yalnızca ihtiyacınız git commit --amendolanı göreceksiniz:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Gördüğünüz gibi pick, bu zaten bir düzenleme sayfası olduğu gibi herhangi bir komut öneki olmadan en üste mesaj gönder, en üstteki mesajı doğrudan düzenleyebilir ve kaydedebilir ve çıkabilirsiniz , örneğin:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Sonra git push -u origin master --forceya da <how you push normally> --force. Buradaki anahtar --force.

İkinci yöntem:

  1. Taahhüt karmasını git logdepo URL'sinden görebilir veya ayıklayabilirsiniz, benim durumumdaki örnek881129d771219cfa29e6f6c2205851a2994a8835

  2. Sonra yapabilirsiniz git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835veya git rebase -i HEAD^(en son eğer)

  3. Göreceksin:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#  d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
  1. Ama eğer görürseniz noopo zaman muhtemelen yanlış yazıyorsunuzdur, örneğin sonunda git rebase -i 881129d771219cfa29e6f6c2205851a2994a88hangi eksikliği ^yaparsanız, kaydetmeden editörden çıkıp nedenini çözmeniz daha iyi olur:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. Hayır ise noopkonuyla yapın, sonra sözcüğü değiştirmek pickiçin reword(bu noktada mesajı taahhüt düzenlemezseniz) diğeri sadece kalır, örneğin:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Kaydet ve çık, düzenleme sayfasını # 1 yöntemine benzer bir şekilde görecektir :
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. İletiyi, # 1 yöntemi ile aynı şekilde düzenleyin ve kaydedin ve çıkın, örneğin:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Yine, aynı yöntem # 1, aynı git push -u origin master --forceveya yapın <how you push normally> --force. Buradaki anahtar --force.

Daha fazla bilgi için lütfen dokümanı okuyun .

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.