27 Soru: Mevcut, yayınlanmamış taahhüt mesajları nasıl değiştirilir?

tarafından oluşturulan soru Thu, May 2, 2019 12:00 AM

Yanlış bir mesajı bir taahhüt mesajında ​​yazdım.

Mesajı nasıl değiştirebilirim? Taahhüt henüz tamamlanmadı.

    
7672
  1. Git için biraz yeni olanlar için: Laurie'nin henüz itilmemiş olması konusundaki meselesi önemlidir. Yeniden doğuş gibi, bu da tarihi değiştiriyor. Biri orijinal ve yeniden yazılmış tarih arasında reponuzdan klonlanmış /alınmışsa, yeniden yazma işleminden sonra (o dal için) çekemez.
    2008-10-10 20: 12: 17Z
27 Yanıtlar                              27                         

En son işlem mesajını değiştirme

 
git commit --amend

editörünüzü açarak en son verilen teklifin taahhüt mesajını değiştirmenize izin verir. Ek olarak, onay mesajını doğrudan komut satırında aşağıdakilerle ayarlayabilirsiniz:

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

… ancak bu, çok satırlı taahhüt iletilerini veya küçük düzeltmeleri girmeyi daha hantal hale getirebilir.

Bunu yapmadan önce aşamalı çalışan bir kopya değişikliğiniz olmadığından emin olun, yoksa onlar da işlenir. ( İstenmeyen değişiklikler kabul edilmeyecek.)

Zaten uzaktaki şubenize gönderdiğiniz bir taahhüdün iletisini değiştirme

Uzaktaki şubenize bağlılığınızı çoktan artırdıysanız, taahhüdü zorlama ihtiyacı ile:

 
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

Uyarı: zorla gönderme, yerel şubenizin durumu ile birlikte uzak şubenin üzerine yazacaktır . Uzak şubenizde yerel şubenizde bulunmayan taahhütler varsa, bu taahhütleri kaybedeceksiniz.

Uyarı: Diğer kişilerle daha önce paylaştığınız taahhütlerde değişiklik yapma konusunda dikkatli olun. Değişiklik yapma esasları, SHA kimlikleri, başkalarının yazdığınız eski taahhüdün kopyaları varsa bir sorun teşkil eder. Eski taahhüdün bir kopyasına sahip olan bir kişinin, çalışmalarını yeni yeniden yazılmış taahhüdünüzle senkronize etmesi gerekecektir; bu bazen zor olabilir, bu nedenle paylaşılan taahhüt geçmişini yeniden yazmaya çalışırken başkalarıyla koordine ettiğinizden emin olun veya yalnızca paylaşılan taahhütleri yeniden yazmaktan kaçının tamamen.


Etkileşimli rebase kullan

Başka bir seçenek de etkileşimli rebase kullanmaktır.
Bu, en son mesaj olmasa bile güncellemek istediğiniz mesajları düzenlemenizi sağlar.

Git squash yapmak için şu adımları izleyin:

 
// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

Kararlarınızı ezdikten sonra - iletiyi düzenlemek için e/r'u seçin

 buraya resim açıklamasını girin

Etkileşimli rebase hakkında önemli not

git rebase -i HEAD~X’u kullandığınızda, X taahhütten daha fazla olabilir . Git, son X'daki bütün komisyonları "toplayacak" ve bu aralıkta bir yerde bir birleşme varsa, bütün komisyonları göreceksiniz, böylece sonuç X + olacaktır.

İyi ipucu:

Tek bir daldan daha fazlası için yapmanız gerekiyorsa ve içeriği değiştirirken çakışmalarla karşılaşabilirsiniz, git rerere ve git bu çatışmaları sizin için otomatik olarak çözebilsin.


Belgeler

15372
2019-01-25 15: 17: 31Z
  1. Ancak git commit --amend, git rebase -i kadar güçlü değildir.
    2010-07-05 08: 40: 35Z
  2. @ jeffjose, Kesinlikle olması gerekmez. Ayrıca, git commit --amend (a?) Ana taahhüdünü düzeltebilir.
    2010-07-14 06: 02: 30Z
  3. Zaten ittiyseniz, tekrar zorlamaya devam edin: git push -f origin branchname
    2012-05-02 14: 12: 24Z
  4. @ hughes, başkaları aynı depoyu kullanıyorsa git push -f biraz tehlikeli değil mi?
    2012-11-08 07: 48: 41Z
  5. Onay mesajının tamamını yeniden yazmak istemiyorsanız, git commit --amend -c HEAD'a gidin. Bu, eski taahhüt mesajınızla önceden doldurulmuş olan düzenleyiciyi açar, böylece değiştirebilirsiniz.
    2012-11-14 15: 38: 10Z
 
git commit --amend -m "your new message"
    
2461
2016-03-01 18: 19: 29Z
  1. Gitmiştim - taahhüt - mend -m "Yeni mesaj", ancak Github'a basmak "Yeniden itmeden önce uzaktan değişiklikleri birleştirme" ifadesini oluşturdu. Çekme işleminden sonra - düzeltin ve tekrar itin, yeni mesaj görünmez. Bunun yerine, github.com: my o rep branch] of master master 'master master master master master "" ""
    2011-10-14 16: 58: 32Z
  2. @ DaveEveritt, büyük olasılıkla onu düzeltmeyi denemeden önce taahhüdünüzü zorladı
    2013-04-25 08: 21: 20Z
  3. @ Kyralessa doğru değil. Kısaca, satır sonunu tamamlamadan (tırnak işaretleri içindeki her satırın sonuna geri dönerek) yalnızca satır sonunu iletme iletilerini kolayca oluşturabilirsiniz.
    2013-06-11 21: 11: 57Z
  4. İki yıl önce yazılmış bir cevabın ana fikri gibi görünen bir cevabın nasıl olduğunu anlamadım ve aynı zamanda kabul edilen cevabın da çok oyu aldığını . Garip. (cevabında yanlış bir şey yok)
    2014-01-15 05: 30: 22Z
  5. @ AmalMurali, tamam. Demek istediğim, sorunun popülerliği ya da cevabın faydası hakkında çok fazla bir şey değildi. Ancak bu özel cevap en eski cevap değildir ve kabul edilen cevaplarla ilgili daha fazla bilgi sunmaz. Kabul edilen cevabın bir bölümünün kopyası gibi görünüyor. Bu benim amacımdı. ŞEREFE!
    2014-05-21 20: 16: 23Z

Düzeltmek istediğiniz taahhüt en yenisi değilse:

  1. git rebase --interactive $parent_of_flawed_commit

    Birkaç kusurlu komisyonu düzeltmek istiyorsanız, en eski olanın ebeveyni geçin.

  2. Verdiğinizden beri tüm taahhütlerin bir listesini içeren bir editör ortaya çıkacaktır.

    1. Düzeltmek istediğiniz taahhütlerin önünde pick - reword (veya Git'in eski sürümlerinde) olarak değiştirin.
    2. Kaydettikten sonra Git listelenen taahhütleri tekrar eder.
  3. Yeniden değerlendirmek istediğiniz her bir taahhüt için Git, editörünüze geri dönecektir. Düzenlemek istediğiniz her işlem için Git, sizi kabuğun içine bırakır. Kabuk içindeyseniz:

    1. Taahhüdünüzü istediğiniz şekilde değiştirin.
    2. edit
    3. git commit --amend

Bu dizinin çoğu, gittiğiniz çeşitli komutların çıktısı ile açıklanacaktır. Çok kolay, ezberlemenize gerek yok - sadece git rebase --continue'un ne kadar zaman önce olursa olsun, işleri doğrulamanıza izin verdiğini unutmayın.


Önceden itmiş olduğunuz taahhütleri değiştirmek istemeyeceğinizi unutmayın. Ya da belki yaparsın, ama bu durumda harika almak zorunda kalacaksınTaahhütlerinizi üstlenmiş ve üstlerinde çalışma yapmış olan herkesle iletişim kurmaya özen gösterin. Birisi yeniden yayınlama veya yayınlanmış bir şubeye sıfırlama işlemi yaptıktan sonra nasıl yeniden kazanırım /yeniden senkronize ederim?

    
2336
2017-05-23 12: 02: 48Z
  1. Biri ilk taahhüdün iletisini değiştirebilir mi (üst öğeye sahip değildir)?
    2010-01-21 19: 57: 18Z
  2. Bu, diğer cevaplardan birinde belirtilmiştir ancak buraya bir not koyacağım. Git 1.6.6'dan beri, günlük iletisini düzenlemek için git rebase --interactive yerine reword kullanabilirsiniz.
    2010-05-31 13: 27: 57Z
  3. Bu arada, pick, $parent_of_flawed_commit'a eşittir.
    2010-11-28 23: 26: 12Z
  4. Daha önce yukarı doğru ittiyseniz, asla HİÇ yapmayın (veya genel olarak yeniden derleyin)!
    2011-05-31 19: 14: 04Z
  5. Hatalı işlemden sonra bir birleşme varsa, $flawed_commit^ (-p) kullanın.
    2012-01-31 14: 37: 47Z

Bir önceki taahhüdünüzü değiştirmek için, istediğiniz değişiklikleri yapın ve bu değişiklikleri yapın ve ardından koşun

 --preserve-merges

Bu, metin düzenleyicinizde yeni işleme iletinizi temsil eden bir dosya açar. Eski taahhüt mesajınızın metni ile doldurulur. Onay mesajını istediğiniz gibi değiştirin, ardından dosyayı kaydedin ve bitirmek için düzenleyicinizden çıkın.

Önceki taahhüdü değiştirmek ve aynı günlük mesajını saklamak için koşun

 
git commit --amend

Önceki işlemi tamamen kaldırarak düzeltmek için, koşun

 
git commit --amend -C HEAD

Birden fazla taahhüt mesajı düzenlemek istiyorsanız, koşun

 
git reset --hard HEAD^

(Düzenlemek istediğiniz taahhütlerin sayısıyla commit_count değiştirin.) Bu komut editörünüzü başlatır. İlk işlemi (değiştirmek istediğinizi) “seç” yerine “düzenle” olarak işaretleyin, ardından editörünüzden kaydedip çıkın. Taahhüt etmek istediğiniz değişikliği yapın ve ardından koşun

 
git rebase -i HEAD~commit_count

Not:

git commit --amend
git rebase --continue
tarafından açılan editörden "İstediğiniz değişikliği yapın" özelliğini de yapabilirsiniz     
762
2014-10-24 10: 20: 01Z
  1. git commit --amend ayrıca seçtiğiniz birçok taahhütün taahhüt mesajlarını değiştirmenize de izin verir. Seçili taahhütleri "seçim" yerine "yeniden" olarak işaretlemeniz yeterlidir.
    2013-08-21 20: 21: 59Z
  2. Ya yeniden düzenlemek istemezseniz? Sadece eski bir mesajı değiştirmek mi istiyorsun?
    2016-04-21 08: 56: 35Z
  3. git rebase -i HEAD~commit_count taahhüt edilmemiş değişiklikleri iptal etti. Lütfen git reset --hard'u --hard ile değiştirin.
    2018-02-28 17: 44: 56Z

Daha önce de belirtildiği gibi --soft, son işlemin üzerine yazma yoludur. Bir not: dosyaların üzerine yazmak da istiyorsanız, komut

olacaktır.  git commit --amend     
392
2014-02-23 23: 10: 08Z
  1. Ve eğer her şeyi eklemek istemiyorsanız, önce
    git commit -a --amend -m "My new commit message"
    
    , sonra sadece git add file.ext yapabilirsiniz
    2015-09-22 05: 56: 35Z

Bunun için git git commit --amend'u da kullanabilirsiniz.

 filter-branch

Önemsiz bir

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
kadar kolay değil, ancak hatalı bir şekilde işlediğiniz iletiden sonra zaten bazı birleşimleriniz varsa, özellikle yararlıdır.

Bunun git commit --amend ile hatalı işleme arasındaki HER tavrın yeniden yazmaya çalışacağını unutmayın, bu nedenle HEAD komutunuzu çok akıllıca seçmelisiniz ;-)

    
352
2014-05-21 02: 37: 16Z
  1. Eğer regex bir şey bulamazsa taahhüdünü değiştirmeyen bir sürümü var mı?
    2013-03-28 20: 08: 13Z
  2. AFAIK filtre dalı - msg-filtresi her durumda yeni taahhütler oluşturur. Ancak, başınız başarılı olup olmadığını msg filtresinin içinde kontrol edebilir ve ağaç dalı refs /original olarak sıfırlamak için filtre dalı işlemi sona erdiğinde bu bilgiyi kullanabilirsiniz.
    2013-03-29 16: 16: 25Z
  3. @ DavidHogue Bu yalnızca filtre dalı yöntemi kullanıldığında geçerlidir. Etkileşimli bir yeniden düzenleme kullandığınızda, değiştirilmiş bir işlemi takip eden taahhüt kimlikleri değişmez.
    2013-07-06 19: 08: 37Z
  4. @ Mark Evet yaparlar, zorunludurlar. Taahhüt kimlikleri önceki taahhütlere bağlıdır. Değişmedilerse git işe yaramaz olurdu.
    2014-01-11 04: 45: 27Z
  5. msg-filter'a değil, $flawed_commit^..HEAD'a ihtiyacınız var. man sayfasında belirtildiği gibi: « Komut yalnızca komut satırında belirtilen pozitif referansları yeniden yazar (ör. a. b'yi geçerseniz, sadece b yeniden yazılır). »
    2014-07-29 11: 18: 49Z

Bu yolu tercih ederim.

 $flawed_commit..HEAD

Aksi takdirde, yeni bir işlem kimliği ile yeni bir işlem yapılacaktır

    
311
2013-01-10 14: 23: 28Z
  1. Benim için, yukarıdaki komutunuzu kullanmak aslında yeni bir işlem kimliği ile yeni bir işlem ek olarak varsayılan bir işlem iletisi olarak "birleştirme dalı" diyerek fazladan bir işlem oluşturur.
    2013-03-29 16: 27: 38Z
  2. her zaman değiştirilmesi yeni bir işlem kimliği ile yeni bir işlem yaratır. Taahhüt Kimliği, taahhüt mesajı ve yazar /taahhüt edilen zaman damgaları dahil olmak üzere, taahhüt içeriğinin SHA karmasıdır. Bu, Git çarpışmalarını engelleyen, aynı kimliğe sahip iki komisyonun aynı içerik, tarih vb. İle tamamen aynı taahhütte olmasını sağlayan bir özelliktir.
    2013-06-19 09: 30: 11Z
  3. Emil ile aynı fikirde. Ek olarak, dokümanları okumak - tüm "-c" 'nin yaptığı gibi, yeni taahhüdünüz için varsayılan /şablon olarak kullanılacak olan taahhüdün mesajını gitmiş gibi görünmek gibi görünüyor ... Gerçekten de zaten "-c < varsayılan olarak, bu nedenle belirtmenize gerek yoktur.
    2013-09-29 19: 12: 37Z
  4. git commit --amend -c <commit ID>
    
    bir kaç şey yapar. Eski mesajı varsayılan olarak kullanır, ancak yazarlık bilgilerini (kişi ve zaman) kopyalar. -c, iletiyi düzenlemenizi istememesi dışında da aynı şeyi yapar.
    2014-12-28 02: 55: 53Z
  5. @SantanuDey gibi benim için işe yaramadı. -C'um var
    2015-04-14 05: 22: 17Z

eğer birGit GUI aracını kullanıyorsanız, son işlemeyi değiştir adlı bir düğme var. Bu düğmeye tıkladığınızda son işlem dosyalarınızı ve mesajınızı gösterecektir. Sadece bu mesajı düzenleyin, sonra yeni mesajla gönderebilirsiniz.

Veya bu komutu bir konsoldan /terminalden kullanın:

 fatal: Option -m cannot be combined with -c/-C/-F/--fixup.     
310
2017-02-26 16: 48: 31Z
  1. Bu cevap tam anlamıyla ile aynıdır eski olanı Başka bir cevap vermeden önce mevcut cevapları kontrol ettiniz mi?
    2019-05-02 01: 15: 38Z

Git rebasing 'i kullanabilirsiniz. Örneğin, bbc643cd'yi işlemek üzere geri değişiklik yapmak istiyorsanız,

komutunu çalıştırın.  
git commit -a --amend -m "My new commit message"

Varsayılan düzenleyicide, değişiklik yapmak istediğiniz satırdaki 'düzenlemek'i seçmek için' seçim 'seçeneğini değiştirin. Değişikliklerinizi yapın ve ardından bunları

ile düzenleyin  
$ git rebase bbc643cd^ --interactive

Artık kullanabilirsiniz

 
$ git add <filepattern>

taahhüdünü değiştirmek için ve bundan sonra

 
$ git commit --amend

önceki baş kararına geri dönmek için.     

283
2013-03-16 09: 39: 44Z
  1. $ git rebase --continue
    
    ’da yaptığınız değişikliklerin etkili olduğundan emin olmak istiyorsanız, git commit --amend’u kullanabilirsiniz ve yeni mesajı gösterir.
    2013-02-19 20: 12: 44Z
  1. Yalnızca son işleme mesajınızı değiştirmek istiyorsanız, şunu yapın:

     git show

    Bu sizi metin alıcınıza bırakacak ve son işlem mesajını değiştirmenize izin verecektir.

  2. Son 3 taahhüt mesajını veya bu noktaya kadar taahhüt mesajlarından herhangi birini değiştirmek isterseniz,

    git commit --amend
    
    komutunu HEAD~3 komutuna verin:  git rebase -i
276
2014-05-21 02: 38: 25Z
  1. Bu önceki cevabın zaten
    git rebase -i HEAD~3
    
    kullanabileceğinizi söylüyor ve ayrıca git commit --amend’u kullanabileceğinizi söylüyor, yaptığınız tek şey git rebase -i HEAD~commit_count için 3’da bağlantı kurmaktı.
    2014-07-23 12: 21: 05Z
  2. Ayrıca reddedildi. İnsanlar yalnızca mevcut cevapları okumak için uğraşmıyorlar. /div>
    2019-05-02 01: 16: 22Z

    Eski bir işlem iletisini birden fazla dalda değiştirmek zorunda kalırsanız (yani, hatalı mesajla yapılan işlem birden fazla dalda bulunur) kullanmak isteyebilirsiniz:

     commit_count

    Git, yeniden yazmak için geçici bir dizin oluşturur ve ayrıca

    git filter-branch -f --msg-filter \
    'sed "s/<old message>/<new message>/g"' -- --all
    
    ’da eski referansları yedekler.
    • refs/original/ işlemin yürütülmesini zorlar. Geçici dizin zaten mevcutsa veya -f altında saklanan referanslar varsa, bu gereklidir. Aksi takdirde, bu bayrağı bırakabilirsiniz.

    • refs/original filtre dalı seçeneklerini revizyon seçeneklerinden ayırır.

    • --, tüm dalların ve etiketlerinin yeniden yazıldığından emin olur.

    Eski referanslarınızın yedeği nedeniyle, komutu yerine getirmeden önce kolayca duruma geri dönebilirsiniz.

    Diyelim ki, efendinizi kurtarmak ve --all dalında erişmek istiyorsanız:

     old_master     
    259
    2014-05-21 02: 39: 54Z
    1. Bu cevap OP'nin sorusuna hitap etmedi, çünkü sadece yeni yaptıkları bir taahhüdü düzeltmekle tamamen ilgilendiler. Yorumları düzeltmek veya
      git checkout -b old_master refs/original/refs/heads/master
      
      'a unuttuğum dosyaları eklemek için düzenli olarak git commit --amend kullanıyorum, ancak git add yayımlamadan önce yalnızca hiç . Sürüm tarihini tamamen karıştırmak istediğimde git push kullanıyorum, ancak OP bunu istemiyor, bu yüzden bu cevap büyük bir sağlık uyarısına ihtiyaç duyuyor - bunu evde denemeyin, peeps !!
      2013-06-29 03: 17: 38Z

    Kullanım

     git filter-branch

    Ayrıntılı olarak anlamak için mükemmel bir yazı 4. Git Geçmişini Yeniden Yazma . Ayrıca, kullanılmadığında

    git commit --amend
    
    'dan da bahseder.     
    223
    2018-05-22 19: 46: 06Z
    1. Zaten halka açık bir havuza itilen iletme iletilerini düzeltmek için iyi bir yol var mı? Şimdiye kadar, bir kez zorladığımda, mesaj yazım hataları ve düşüncelerimin sonsuza dek yaşaması gerektiği sonucuna vardım.
      2013-06-04 11: 32: 34Z
    2. Bir kelime ile, NOPE! İttiğiniz bir şeyi geri çekmenin iyi bir yolu yok. Tüm retraksiyonlar daha büyük veya daha az derecede BAD'dir. Bir dalda çalışma disiplinini kendi özel deponuzda benimsemeniz, biraz ekleyerek, biraz sınamak, biraz çırpmak için birden fazla taahhütte bulunmanız gerekir. Ardından tüm şubenizi tek bir taahhütte birleştirin, genel değişikliği tanımlayan yeni bir taahhüt mesajı yazın, PROOFREAD yapın ve itin.
      2013-06-29 03: 29: 44Z
    3. Sadece bir özellik dalından dönerken tek bir işlem yapmak zorunda olmadığının açık bir şekilde belirtilmesi. Pek çok insanın yaptığı şey, hedef dalı yeniden inşa etmek (işleri daha temiz göstermek için), ardından hızlı ileri sarmayı bastırma seçeneği ile birleşmektir. Yine de zorlamadan önce asıl dikkat göstermenin ana noktası ile aynı fikirde.
      2013-09-11 18: 20: 34Z
    4. Siz git commit --amend cevabını sizinkini yazmadan önce (birkaç kez) verilmiş. Neden tekrar gönderdin? "Git Geçmişini Yeniden Yazma" bağlantısını eklemek istiyorsanız mevcut cevaplardan birini düzenleyebilir veya yorum bırakabilirsiniz.
      2019-05-02 01: 17: 45Z

    Amend

    Burada birkaç seçeneğiniz var. Yapabilirsin

     git commit --amend

    son taahhüdünüz olduğu sürece.

    Etkileşimli yeniden düzenleme

    Aksi takdirde, son taahhüdünüz değilse etkileşimli bir yeniden ödeme yapabilirsiniz.

     
    git commit --amend
    

    Ardından, etkileşimli rebase içinde bu işleme yapılan düzenlemeyi eklemeniz yeterlidir. Bir

    git rebase -i [branched_from] [hash before commit]
    
    gelip taahhüt mesajını değiştirin. Bu kesinti noktasından önce geri dönmek istiyorsanız, git commit --amend da kullanabilir ve yalnızca bu kesinliği silebilirsiniz. O zaman yine git reflog yaparsın.     
    195
    2014-07-19 23: 45: 05Z

    Git GUI kullanıyorsanız, itilmemiş olan son işlemi değiştirebilirsiniz:

     git commit     
    183
    2013-03-16 09: 37: 26Z

    Son teklifiniz buysa, yalnızca değiştirerek değiştirin:

     
    Commit/Amend Last Commit
    

    (yalnızca taahhüt mesajını değiştirdiğinizden emin olmak için

    git commit --amend -o -m "New commit message"
    
    (-o) bayrağını kullanarak)


    Gömülü bir taahhüt ise, awesome etkileşimli rebase :

     --only

    İstediğiniz taahhüdü bulun,

    git rebase -i @~9   # Show the last 9 commits in a text editor
    
    ile pick (r) arasında bir değişiklik yapın ve dosyayı kaydedin ve kapatın. Bitti!



    Minyatür vim öğreticisi (veya yalnızca 8 tuş vuruşuyla nasıl yeniden oluşturulacağını reword 3j cw Esc r ) :

    • Vaktiniz varsa ZZ'u çalıştırın
    • vimtutor h j k , ↓ /hareket tuşlarına karşılık gelir kbd>
    • Tüm komutlara, örneğin bir "aralık" eklenebilir. l 3 satır aşağı gider
    • ekleme moduna girmek için 3j - yazdığınız metin dosyada görünür
    • Ekleme modundan çıkmak ve "normal" moda geri dönmek için Esc veya Ctrl i
    • c geri almak için
    • Ctrl u yeniden yapmak için
    • Sırasıyla bir çizgi, kelime veya harf silmek için r , dd , dw
    • Sırasıyla satır, sözcük veya harf değiştirmek için dl , cc , cw ( cl dd )
    • i , yy , yw sırasıyla bir satır, kelime veya harf kopyalamak ("yank")
    • sırasıyla geçerli konumdan önce veya sonra yapıştırmak için yl veya p
    • P Bir dosyayı kaydetmek (yazmak) için girin
    • :w Kaydetmeden çıkmak için girin
    • :q! Kaydetmek ve çıkmak için veya :wq girin

    Metni çok düzenlerseniz, Dvorak klavye düzenine geçin, dokunmayı yazmayı ve vim öğrenmeyi öğrenin. Çabaya değer mi? Evet.



    ProTip ™: Geçmişi yeniden yazan "tehlikeli" komutları denemekten korkmayın * - Git, varsayılan olarak 90 gün boyunca taahhütlerinizi silmez; Bunları reflogda bulabilirsiniz:

     ZZ

    * Yine de

    $ git reset @~3   # go back 3 commits
    $ git reflog
    c4f708b HEAD@{0}: reset: moving to @~3
    2c52489 HEAD@{1}: commit: more changes
    4a5246d HEAD@{2}: commit: make important changes
    e8571e4 HEAD@{3}: commit: make some changes
    ... earlier commits ...
    $ git reset 2c52489
    ... and you're back where you started
    
    ve --hard gibi seçeneklere dikkat edin - verileri kaldırabilirler.
    * Ayrıca, işbirliği yaptığınız hiçbir dalda geçmişi yeniden yazmayın.

        
    173
    2015-04-29 15: 50: 45Z
    1. Vim kısmı tamamen konuyla ilgili değil ve kullanıcıları bir gizli düzenleyici kullanmayı öğrenmek için zaman harcamayı teşvik etmek yerine, neden onlara daha fazla konuyla ilgili bir şey öğretmiyorlar? varsayılan git editörü --force gibi kullanıcı dostu bir şey olacak şekilde nasıl ayarlanır? "En iyi" metin editörüyle ilgili bir alev savaşı yaratacak sert kodlardan değil, bir metin dosyasına yapılması gereken önemsiz değişikliklerden bahsediyoruz.
      2019-05-02 01: 19: 53Z
    2. @ DanDascalescu: Çünkü yukarıdaki talimatları kullanarak Vim'i öğrenmek, nano kullanarak birkaç yeniden düzenleme yapmaktan daha hızlı. Git'in tek nedeni bir metin editörünü açıp yeniden doğuş için kendi arayüzünü açmaması, Vim'in varlığından kaynaklanıyor: hafif, çoğu sistemde varsayılan olarak yüklü ve kolayca yeniden oluşturmayı kolaylaştıracak kadar öğrenmesi çok kolay: ör. nano, bir işlem 2'yi aşağı kaydırdı. Temel Vim bilgisi ile ilgili gizli bir şey yoktur; Vim ile nanodan daha rahat olmak 10 dakika sürer.
      2019-05-02 22: 07: 53Z

    Yapabildiğim kadar Git GUI kullanıyorum ve bu size en son değişiklik yapma seçeneğini sunuyor taahhüt:

    Bu kutuyu işaretleyin

    Ayrıca, ddjjpZZ, size her zaman ustanın tepesinde yapmış olduğunuz taahhütleri sunacak ve değiştirme, silme, yeniden sıralama veya squash yapma seçeneği sunan güzel bir mantradır. Önce bu hash'i ele geçirmenize gerek yok.

        
    165
    2014-05-21 02: 44: 35Z
    1. Örnekte görüntülediğiniz ekrana nasıl ulaşabilirim?
      2014-06-24 20: 01: 47Z
    2. "Yorum"
      Windows Git Gui'nin sağ alt kısmıdır. Sadece 'Son Taahhüt Değişiklik Yap' seçimini seçin ve en son değerlendirme bilgileriyle birlikte doldurulur.
      2016-01-29 16: 51: 33Z

    Vay, bu yüzden bunu yapmanın birçok yolu var.

    Bunu yapmanın başka bir yolu da son taahhüdün silinmesidir, ancak çalışmalarınızı kaybetmemeniz için değişikliklerini saklamanız gerekir. Düzeltilmiş mesajla başka bir taahhüt daha yapabilirsiniz. Bu şuna benzer bir şey olur:

     git rebase -i origin/master

    Bir dosya eklemeyi veya değişiklik yapmayı unutursam bunu her zaman yaparım.

    git reset --soft HEAD~1
    git commit -m 'New and corrected commit message'
    
    yerine --soft belirtmeyi unutmayın , aksi takdirde bu işlemi tamamen kaybedersiniz.

        
    135
    2014-07-20 08: 21: 55Z
    1. Bu, 2 aşamalı bir işlem olması dışında --hard ile aynı şeyi yapar.
      2014-12-28 02: 58: 00Z
    2. @ JosephK.Strauss Taahhüdün değiştirilmesinin, yeni taahhüt ve tarih bilgisine ayrı ayrı sahip olmak üzere, orijinal taahhüt yazarı ve tarih bilgilerini de koruduğuna inanıyorum. Bu yaklaşımın bunu yaptığından emin değilim.
      2016-05-07 23: 13: 23Z
    3. @ EvertonAgner Haklısınız. git commit --amend yazar bilgilerini tutacak, ancak soru yalnızca mesajı değiştirmeyi istiyor.
      2016-05-09 13: 59: 34Z

    Eski mesajları düzenlemeye yardımcı olacak bir Windows /Mac GUI arayan herkes için (yani sadece en yeni mesajı değil), SourceTree . İzlenecek adımlar aşağıdadır.

    SourceTree etkileşimli rebase

    Henüz bir uzaktan kumandaya gönderilmeyen taahhütler için:

    1. Tüm geçerli değişiklikleri yaptığınızdan veya kaydettiğinizden emin olun (yani, "Dosya Durumu" sekmesinde listelenen hiçbir dosya yoktur) - aksi takdirde çalışmaz.
    2. "Günlük /Geçmiş" sekmesinde, düzenlemek istediğiniz taahhüdün (lerin) altındaki ( biri grafikte) bitişik bir çizgiye sahip olan girişi sağ tıklayın ve " < commit ref > etkileşimli olarak ... "
    3. Değiştirmek istediğiniz taahhüt mesajı için tüm satırı seçin ( yani "Mesaj" sütununa tıklayın ).
    4. "Mesajı Düzenle" düğmesini tıklayın.
    5. Gelen iletişim kutusundaki mesajı istediğiniz gibi düzenleyin ve ardından Tamam'ı tıklayın.
    6. Değiştirilecek başka taahhüt mesajları varsa 3-4. adımları tekrarlayın.
    7. Tamam'ı tıklayın: Yeniden düzenleme başlayacaktır. Her şey yolundaysa, çıkış "başarıyla tamamlandı" olarak bitecektir. NOTE: Kısa süre önce, aynı anda birden fazla işleme iletisini değiştirmeye çalışırken --amend ile başarısız olduğunu gördüm. Sorunun tam olarak ne olduğundan ya da SourceTree'nin gelecekteki bir sürümünde çözülüp çözülmeyeceğinden emin değilim, ancak bu gerçekleşirse, bunları birer birer yeniden yapmayı önerebilir (daha yavaş ancak daha güvenilir görünüyor).

    ... Veya ... daha önce itilen taahhütler için:

    Yukarıdakine benzer olan ancak komuttan çalıştırılması gereken başka bir komut gerektiren bu yanıt bölümündeki adımları uygulayın. şubeyi zorlamaya iten çizgi - hepsini oku ve gerekli önlemleri al!

        
    126
    2019-06-17 13: 20: 56Z

    Yalnızca en son taahhüt kullanımını düzenlemek istiyorsanız:

     Unable to create 'project_path/.git/index.lock': File exists.

    veya

     
    git commit --amend
    

    Ancak, üst üste birkaç komisyon düzenlemek istiyorsanız, bunun yerine yeniden rebasing kullanmalısınız:

     
    git commit --amend -m 'one line message'
    

    git rebase düzenleme

    Yukarıdaki gibi bir dosyada edit /e veya diğer seçenekten birini yazın ve isabetkaydet ve çık.

    Şimdi ilk yanlış işlemede bulunacaksınız. Dosyalarda değişiklik yapın, bunlar sizin için otomatik olarak hazırlanır. Tür

     
    git rebase -i <hash of one commit before the wrong commit>
    

    kaydet ve çık ve yaz

     
    git commit --amend
    

    tüm seçimlerinizle bitinceye kadar bir sonraki seçime geçmek için.

    Bu işlemlerin, belirli bir işlemden sonra tüm SHA karma değerlerinizi değiştirdiğini unutmayın.

        
    124
    2014-07-19 17: 42: 48Z
    1. git rebase -i &yanlış bir işlemden önce bir işlemin < benim için çalışıyor. teşekkürler.
      2018-04-13 00: 57: 11Z

    Yalnızca son mesajınızı değiştirmek istiyorsanız,

    git rebase --continue 
    
    bayrağını veya --only ile -o kısayolunu kullanmalısınız:  commit --amend

    Bu, sahnelenen işlerle olan taahhüdünüzü yanlışlıkla artırmamanızı sağlar. Elbette uygun bir

    git commit --amend -o -m "New commit message"
    
    konfigürasyona sahip olmak en iyisidir. O zaman $EDITOR opsiyonunu dışarıda bırakabilirsiniz, ve git, eski mesajla ön sipariş mesajını doldurur. Bu şekilde kolayca düzenlenebilir.     
    123
    2015-03-13 10: 38: 50Z
    1. "En iyi" cevap soruyu cevaplamıyor. Sadece -m'a genel bir giriş yapar. Soru çok belirgindi, bu yüzden daha uzun! = Daha iyi. git commit --amend bayrağının belirleyici ifadesi muhtemelen bilginin geri kalanına gömülecekti. Zaten çok fazla oyu olan bir cevabı düzenlemek konusunda da rahat değilim.
      2014-07-20 20: 51: 26Z
    2. İnsanların bunu "doğru" cevap olarak kullanmasının gerçek bir tehlikesi olduğundan, en iyi cevabı düzenlemekte serbestsiniz. Aşamalı şeylerle olan taahhüdünüzü kolayca değiştirmek olabilir - başıma geldi ve bunu zorladığınızda gerçekten can sıkıcı bir durum. Ancak yine de miktar doğruluğunun garantisi değildir. Ne cevap olarak ne de oy olarak.
      2014-07-20 20: 51: 54Z
    3. en iyi cevabı "yanlış" ve "soruyu yanıtlamıyor". Bu kesinlikle işe yarar ve soruyu yanıtlar, yalnızca değişiklik yapmaya çalıştığınızda değişiklik yapmadığınızdan emin olmanız gerekir. Ancak insanları bu konuda uyarmak zorunda kaldığınızı anlıyorum. Vaktim varsa daha sonra düzenlerim.
      2014-07-21 21: 26: 20Z
    4. Adil olmak gerekirse: git 1.3.0'dan bu yana -o olan --only seçeneği uygun olsa da, 1.7.11.3'te düzeltilinceye kadar düzgün çalışmadı ( ea2d4ed35902ce15959965ab86d80527731a177c ). Öyleyse, 2008’deki doğru cevap muhtemelen şöyle bir şey olurdu: --amend.
      2014-07-21 23: 00: 48Z

    Son yanlış taahhüt iletinizi tek satırda yeni taahhüt mesajı ile güncelleyin:

     git stash; git commit --amend; git stash pop

    Veya, aşağıdaki gibi git sıfırlamayı deneyin:

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

    Taahhütleri küçük siparişlere bölmek için sıfırlamayı kullanma

    # You can reset your head to n number of commit
    # NOT a good idea for changing last commit message
    # but you can get an idea to split commit into multiple commits
    git reset --soft HEAD^
    
    # it will reset you last commit. Now, you
    # can re-commit it with new commit message.
    
    , bir taahhüdünüzü birden fazla taahhütte bulunmanıza yardımcı olabilir:  git reset

    Burada, son taahhüdünüzü iki şekilde tamamladınız.

        
    99
    2014-07-22 06: 24: 54Z
    1. Yapmak istediğiniz tek şey son taahhüdünüzün mesajını düzenlemekse, bu amaç için yumuşak bir sıfırlama kullanmak aşırı öldürme 'dir. Yalnızca
      # reset your head. I am resetting to last commits:
      git reset --soft HEAD^
      # (you can reset multiple commit by doing HEAD~2(no. of commits)
      
      # Now, reset your head for splitting it to multiple commits
      git reset HEAD
      
      # add and commit your files seperately to make multiple commits: e.g
      git add app/
      git commit -m "add all files in app directory"
      
      git add config/
      git commit -m "add all files in config directory"
      
      'u kullanın, aynen adresinde yazıldığı gibip oylamaya cevap verdi . Ek olarak, git commit --amend, her ikisi de ilk ana işlemeye geri döndükleri için bu önceki yanıtta yer alan yazılım sıfırlamasıyla aynı şekilde çalışır. /div>
      2014-07-21 23: 15: 47Z
    2. Yalnızca bir işleme iletisini birden fazla iletme iletisine bölme fikri vermek için yalnızca git reset --soft HEAD^ eklemeye zahmete girdim. Çünkü git reset kullanmaya başladığımda bu problemle karşılaştım. Bazen bu gerçekten yardımcı olabilir. :)
      2014-07-22 06: 29: 00Z

    Bu soruda çok fazla cevap var, ancak hiçbiri VIM kullanarak eski mesajların nasıl değiştirileceğini çok ayrıntılı olarak açıklamıyor. Bunu kendim yapmaya çalışırken şaşırdım, bu yüzden burada, özellikle VIM'de deneyimi olmayan kişiler için bunu nasıl yaptığımı detaylı olarak yazacağım!

    Zaten sunucuya gönderdiğim en son beş taahhüdümü değiştirmek istedim. Bu oldukça 'tehlikelidir' çünkü bundan daha önce başka birisini çektiyseniz, taahhüt mesajlarını değiştirerek işleri karıştırabilirsiniz. Ancak, kendi küçük şubeniz üzerinde çalışırken ve kimsenin çekemediğinden emin olduğunuzda, şu şekilde değiştirebilirsiniz:

    En son beş taahhüdünüzü değiştirmek istediğinizi varsayalım, sonra bunu terminale yazın:

    git * 5, değiştirmek istediğiniz taahhüt mesajı sayısı. (öyleyse, sonuncu 10'uncu son işlemeyi değiştirmek isterseniz, 10 yazınız)

    Bu komut sizi VIM'e götürür ve taahhüt geçmişinizi 'düzenleyebilir'. Son 5 taahhüdün en üstte de böyle olduğunu göreceksin:

    git rebase -i HEAD~5

    pick <commit hash> commit message yerine pick yazmanız gerekir. Bunu VIM'de reword yazıp INSERT moduna girmenizi sağlayacak şekilde yapabilirsiniz. (Alt kısımdaki INSERT sözcüğü ile ekleme modunda olduğunuzu görüyorsunuz.) Türü değiştirmek istediğiniz taahhütlerde i yerine reword

    Sonra bu ekranı kaydetmeniz ve çıkmanız gerekir, bunu önce esc düğmesine basarak "komut modu" na girerek yaparsınız. (altındaki INSERT sözcüğü kaybolduysa, komut modunda olduğunuzu kontrol edebilirsiniz) pick yazarak bir komut yazabilirsiniz, kaydetme ve bırakma komutu :'dur. Bu yüzden, wq yazdığınızda, doğru yolu izlemeyeceksiniz.

    Sonra VIM, yeniden değerlendirmek istediğiniz tüm taahhüt mesajlarını gözden geçirir, burada gerçekten taahhüt mesajlarını değiştirebilirsiniz. Bunu INSERT moduna girerek, taahhüt mesajını değiştirerek, komut moduna girerek kaydederek çıkabilirsiniz. Bunu 5 kez yapın ve VIM'iniz bitti!

    Ardından, yanlış taahhütlerinizi zaten yerine getirdiyseniz, üzerine yazmak için :wq'a ihtiyacınız vardır. Unutmayın, git push --force'un yapılması tehlikeli bir şeydir, bu nedenle yanlış taahhütler verdiğinizden beri kimsenin sunucudan çekilmediğinden emin olun!

    Artık taahhüt mesajlarınızı değiştirdiniz!

    (Gördüğünüz gibi VIM'de o kadar deneyimli değilim, bu yüzden ne olduğunu açıklamak için yanlış 'dil' kullandıysam, beni düzeltmekten çekinmeyin!)

        
    82
    2014-08-19 04: 34: 23Z
    1. git push --force Stack Overflow'da "thread" yok, çünkü tartışma forumu değil, sadece "sorular", "cevaplar" ve "mesajlar" var. <nitpick>. Ayrıca, Vim'in tüm sürümleri aynı değildir, hepsi de ekleme modundaki karakterleri silmenize izin vermez (bir şekilde, doğru mu?). Vim'deki karakterleri her zaman silebilmek istiyorsanız, </nitpick> ve X bunu yapar (küçük x, imlecin önündeki karakterleri siler, x arkaları siler). Hata yaparsanız geri almak için X’u tekrar tekrar kullanabilirsiniz. Sonunda, u, etkileşimli yeniden düzenleme düzenleyicisinde r için kısa yoldur.
      2014-08-07 17: 47: 10Z
    2. Vim'deki bir kelimeyi değiştirmek için başında reword yazılmıştır (soru vim ile ilgili olmasa da, katılıyorum).
      2015-12-05 06: 25: 59Z
    3. 2019-05-02 01: 28: 41Z

    nano için reci, recm takma adını ekledim, şimdi recommit (amend) veya git recm ile yapabilirim.

     git recm -m     
    76
    2014-03-11 08: 21: 36Z

    git-rebase-reword

    kullanabilirsiniz

    $ vim ~/.gitconfig
    
    [alias]
    
        ......
        cm = commit
        reci = commit --amend
        recm = commit --amend
        ......
    
    ile aynı şekilde herhangi bir taahhüdü (yalnızca son değil) düzenlemek için tasarlanmıştır  commit --amend

    Bir taahhüdün değiştirilmesi için yeniden yapılanma etkileşimli işleminden sonra adı verilir: "yeniden değerlendirme". bu yayına bakın ve erkek -seksiyonlu etkileşimli mod-

    Örnekler:

     
    $ git rebase-reword <commit-or-refname>
    
        
    76
    2015-07-29 22: 28: 58Z
    1. Bu harici bir program kurmayı gerektirir. Benim düşünceme göre, yerleşik araçları ve takma adları daha etkin kullanmayı öğrenmek daha iyi olacaktır.
      $ git rebase-reword b68f560
      $ git rebase-reword HEAD^
      
      (taahhüt et ve yeniden kazan) yazıp yeni isteğimi istediğim yere taşı, g c; g rb -i @~9’dan commit’a (f’a değiştir) yazarım. Bundan daha hızlı bir şey istiyorsanız, takma ad fixup olabilir
      2015-04-29 15: 25: 01Z
    2. github.com/qxo/git -rebase-reword hem linux hem de pencereler için
      2016-10-29 10: 25: 14Z

    Bir yazım hatası ile bir taahhütte bulunduğumu fark ettim. Geri almak için aşağıdakileri yaptım:

     git commit --fixup=<commit>; git rebase -i --autosquash <commit>^

    Uyarı: değişikliklerinizi zorlamaya zorlamak, yerel şubenizdeki uzak şubenin üzerine yazacaktır. Saklamak istediğiniz hiçbir şeyin üzerine yazmadığınızdan emin olun. Ayrıca, şubeyi başka biri sizinle paylaşırsa, değiştirilmiş (yeniden yazılmış) bir taahhüdü zorlamak konusunda dikkatli olun, çünkü yeni yazdığınız taahhüdün eski kopyasına sahiplerse, kendi tarihlerini yeniden yazmaları gerekir.

        
    54
    2014-08-05 14: 44: 50Z
    1. Git hiçbir şey "üzerine yazılmaz". Bu durumda, şube işaretçisi sizin yeni taahhüdünüze ayarlanacaktır ve buna atıfta bulunulmadığında eski taahhüt bayatlayacaktır ve birkaç hafta sonra temizlenebilecektir. (O zamana kadar diğerleri hala reflog içine bakarak bulabilir ve başvurabilir.)
      2014-09-04 23: 47: 35Z

    Aşağıdakileri kullanmak isterim:

    1. git commit --amend -m "T-1000, advanced prototype"
      git push --force
      
    2. git status
    3. git add --all
    4. git commit -am "message goes here about the change"
    5. git pull <origin master>
    49
    2015-02-03 11: 08: 43Z

    Kodu uzaktaki şubenize itmediyseniz ( GitHub /Bitbucket ) komut satırındaki taahhüt iletisini aşağıdaki gibi değiştirebilirsiniz.

     git push <origin master>

    Belirli bir dalda çalışıyorsanız, şunu yapın:

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

    Kodu zaten yanlış bir mesajla bastıysanız ve yapmanız gerekenlerMesajı değiştirirken dikkatli olun. Yani, taahhüt mesajını değiştirip tekrar bastırmayı denedikten sonra sorun yaşarsınız. Düzgünleştirmek için şu adımları izleyin.

    Lütfen yapmadan önce tüm cevabımı okuyun.

     
    git commit --amend -m "BRANCH-NAME: new message"
    

    Önemli not: Zorla itme özelliğini kullandığınızda, diğer geliştiricilerin aynı dalda çalıştığı kod sorunlarıyla karşılaşabilirsiniz. Bu nedenle, bu çatışmalardan kaçınmak için zorlama yapmadan önce kodu şubenizden çekmeniz gerekir:

     
    git commit --amend -m "BRANCH-NAME : your new message"
    
    git push -f origin BRANCH-NAME                # Not a best practice. Read below why?
    

    Bu, iletilmiş iletiyi değiştirirken, daha önce uygulanmışsa, en iyi uygulamadır.

        
    43
    2015-02-03 11: 14: 19Z
     git commit --amend -m "BRANCH-NAME : your new message"
     git pull origin BRANCH-NAME
     git push -f origin BRANCH-NAME
    
kaynak yerleştirildi İşte