Soru Mevcut, işlenmemiş taahhütler nasıl değiştirilir?


Bir taahhüt mesajında ​​yanlış şeyi yazdım. Alternatif olarak, bazı dosyaları eklemeyi unuttum.

İleti mesajını / dosyalarını nasıl değiştirebilirim? Taahhüt henüz yürürlüğe girmedi.


7680
2017-10-07 15:44


Menşei


Gitmek için biraz yeni olanlar için: Laurie'nin henüz zorlanmadığı nokta önemlidir. Rebasing gibi, bu tarihi değiştiriyor. Birisi orijinal ve yeniden yazılan tarih arasındaki repodan klonladı / çektiyse, yeniden yazdıktan sonra (bu dal için) çekilemez. - Pat Notz


Cevaplar:


En son gönderilen iletiyi değiştirme

git commit --amend

editörünüzü açarak, en son işlemin taahhüt mesajını değiştirmenize izin verir. Ayrıca, taahhüt mesajını doğrudan komut satırında şu şekilde ayarlayabilirsiniz:

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

… Ancak, bu çok satırlı taahhüt mesajları veya küçük düzeltmeler girmek için daha hantal hale getirebilir.

Çalışan kopya değişikliklerinin olmadığından emin olun. sahnelenen Bunu yapmadan önce veya onlar da taahhüt edilecek. (Unstaged değişiklikler gerçekleşmeyecek.)

Uzak şubenize zaten aktardığınız bir taahhüt mesajının değiştirilmesi

Takibini zaten uzak şubenize kadar ittiyseniz, o zaman taahhüde zorlamak zorunda ile:

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

Uyarı: zorla itme, uzak şubenin üzerine yerel birinizin durumuyla yazacaktır.. Yerel şubenizde bulunmayan uzak dalda taahhütler varsa, irade o taahhütleri kaybet.

Uyarı: Diğer kişilerle paylaştığınız işlemleri değiştirmek konusunda dikkatli olun. Esas olarak değişiklik yapılması yeniden yazar farklı olmaları SHA Diğer kişilerin, yeniden yazdığınız eski bir kopyasının kopyaları varsa, bir sorun teşkil eden kimlikler. Eski taahhüdün bir kopyasına sahip olan herkesin yeni yeniden yazılan taahhütle senkronize edilmesi gerekir, ki bu da bazen zor olabilir, bu yüzden paylaşımlı taahhüt geçmişini yeniden yazmayı denerken diğerleriyle koordine ettiğinizden emin olun, ya da sadece paylaşılan işleri yeniden yazmayı engelleyin. tamamen.


Etkileşimli rebaz kullan

Başka bir seçenek interaktif rebase kullanmaktır.
Bu, en son mesaj olmasa bile güncellemek istediğiniz herhangi bir mesajı 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

İşlemlerinizi çökerttikten sonra e/r mesajı düzenlemek için

enter image description here

Etkileşimli rebase hakkında önemli not

Kullandığınızda git rebase -i HEAD~X orada olabilir Daha göre X taahhüt. Git sondaki tüm işlemleri "toplayacak" X taahhüt eder ve eğer bu aralığın arasında bir yerde birleşme olsaydı, tüm işleri de görürsünüz ve sonuç X + olacaktır.

İyi bahşiş:

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 çözelim.


belgeleme


14802
2018-02-08 04:26



ancak git commit --amend kadar güçlü değil git rebase -i. - Jeffrey Jose
@jeffjose, Kesinlikle olması gerekmiyor. Ayrıca, git commit --amend (a?) ana taahhüdünü düzeltebilir. - strager
Çoktan ittiyseniz, sadece itmeyi tekrar zorlayın: git push -f origin branchname - hughes
@hughes değil git push -f Diğer insanlar aynı depoyu kullanıyorsa biraz tehlikeli? - Armand
Tüm taahhüt mesajını tekrar yazmak istemiyorsanız, git commit --amend -c HEAD. Bu, eski taahhüt mesajınızla önceden doldurulmuş editörü açacak, böylece bunu değiştirebilirsiniz. - Sam


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

2415
2017-10-07 19:52



Git işini yaptım - amend -m "Yeni mesaj", ancak Github'a basmak "Uzaktan değişiklikleri tekrar itmeden önce birleştir" i yarattı. Çekme işleminden sonra --amend ve tekrar bas, yeni mesaj görünmez. Bunun yerine "github.com :[myrepo] 'dalını birleştirme' bölümüne sahibim” - Dave Everitt
@DaveEveritt büyük olasılıkla, düzeltmeye çalışmadan önce taahhüdünüzü yukarı ittiniz. - Thorbjørn Ravn Andersen
@Kyralessa doğru değil. Bash'ta, çok satırlı taahhüt mesajlarını, işin bitene kadar teklifin kapanmamasıyla yazabilirsiniz (alıntılar içindeki her satırın sonuna geri dönmek). - hobs
İki yıl önce yazılmış bir cevabın ana fikrine ve kabul edilen cevaplara çok benzeyen bir cevabın o kadar çok oy aldığını anlamıyorum. Garip. (cevabın yanlış bir şey yok) - happy coder
@AmalMurali, iyi. Benim amacım sorunun ne kadar popüler olduğu ya da cevabın ne kadar faydalı olduğuyla ilgili değildi. Fakat bu özel cevap en eski cevap değil, kabul edilen cevaba daha fazla bir bakış açısı sunmuyor. Kabul edilen cevabın bir bölümünün bir kopyası gibi görünüyor. Bu benim amacımdı. ŞEREFE! - happy coder


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

  1. git rebase --interactive $parent_of_flawed_commit

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

  2. Bir editör, verdiğiniz tarihten itibaren tüm taahhütlerin bir listesiyle ortaya çıkacaktır.

    1. Değişiklik pick için reword (veya Git'in eski sürümlerinde edit) düzeltmek istediğiniz herhangi bir işlemin önünde.
    2. Kaydettikten sonra Git, listelenen işlemleri tekrarlayacaktır.
       

  3. İstediğiniz her işlem için başka kelimelerle ifade etmekGit, sizi editörünüze bırakacaktır. İstediğiniz her işlem için DüzenleGit, sizi kabuğun içine bırakır. Kabuktaysanız:

    1. İşlemi istediğiniz gibi değiştirin.
    2. git commit --amend
    3. git rebase --continue

Bu dizinin çoğu, gittiğiniz sırada çeşitli komutların çıktısı ile size açıklanacaktır. Çok kolay, ezberlemeye gerek yok - sadece şunu hatırla git rebase --interactive ne kadar uzun zaman önce olursa olsun işleri düzeltmene izin verir.


Daha önce zorladığınız değişiklikleri değiştirmek istemeyeceğinizi unutmayın. Ya da belki de yaparsınız, ancak bu durumda, işlerinizi üstlenmiş ve üstlerinde çalışma yapmış olan herkesle iletişim kurmak için büyük özen göstermeniz gerekecektir. Birisi bir rebase veya bir yayınlanmış bir şube için bir sıfırlama iter sonra nasıl yeniden / yeniden senkronizasyon?


2297
2017-08-15 21:20



İlk taahhüdün mesajını (ebeveynleri olmayan) değiştirebilir mi? - 13ren
Bu diğer cevaplardan birinde bahsedilir ama ben burada bir notu koyacağım. Git 1.6.6'dan beri kullanabilirsiniz reword yerine pick günlük mesajını düzenlemek için - MitMaro
Bu arada, $parent_of_flawed_commit eşdeğerdir $flawed_commit^. - Peeja
Şimdiye kadar bunu hiç yapmadıysanız (veya genel olarak yeniden inşa etmek) asla YAPMAYIN! - Daniel Rinser
kullanım -p (--preserve-merges) kusurlu işlemden sonra bir birleşme olsaydı. - ahven


Önceki işlemi değiştirmek için, istediğiniz değişiklikleri yapın ve bu değişiklikleri yapın ve ardından çalıştırın.

git commit --amend

Bu, yeni editör mesajınızı temsil eden metin editörünüzde bir dosya açacaktır. Eski taahhüt mesajınızdaki metinle doldurulur. İşlem mesajını istediğiniz gibi değiştirin, ardından dosyayı kaydedin ve bitiriciniz için çıkın.

Önceki işlemi değiştirmek ve aynı günlük mesajını tutmak için

git commit --amend -C HEAD

Bir önceki işlemi tamamen kaldırarak düzeltmek için,

git reset --hard HEAD^

Birden fazla taahhüt mesajını düzenlemek isterseniz

git rebase -i HEAD~commit_count

(Değiştir commit_count Düzenlemek istediğiniz taahhütlerin sayısı ile.) Bu komut editörünüzü başlatır. İlk işlemi (değiştirmek istediğiniz) “seçim” yerine “düzenle” olarak işaretleyin, ardından editörünüzü kaydedin ve çıkın. Yapmak istediğiniz değişikliği yapın ve ardından çalıştırın

git commit --amend
git rebase --continue

Not: Açtığınız düzenleyiciden de "İstediğiniz değişikliği yapabilirsin" git commit --amend


750
2018-06-06 21:16



git rebase -i HEAD~commit_count Ayrıca, seçtiğiniz birçok işlemin taahhüt mesajlarını değiştirmenize de izin verir. Sadece seçilen işleri "pick" yerine "reword" olarak işaretleyin. - Joe
Ya yeniden inşa etmek istemiyorsan? Sadece eski bir mesajı değiştirmek mi istiyorsunuz? - SuperUberDuper
git reset --hard kabul edilmeyen değişiklikleri yok eder. Lütfen değiştirin --hard ile --soft. - eel ghEEz


Daha önce de belirtildiği gibi, git commit --amend son taahhüdün üzerine yazmanın yolu. Bir not: ayrıca isterseniz dosyaların üzerine yaz, komut olurdu

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

381
2017-09-01 20:35



Ve her şeyi eklemek istemezseniz, ilk önce yapabilirsiniz git add file.ext O zaman sadece git commit --amend - MalcolmOcean


Ayrıca kullanabilirsin filter-branch bunun için.

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

Önemsiz olmak kadar kolay değil git commit --amendAncak, hatalı işlem mesajınızdan sonra zaten birleşme varsa, özellikle yararlıdır.

Bu, arasındaki HER işlemin yeniden yazmaya çalışacağını unutmayın. HEAD ve kusurlu işlem, bu yüzden msg-filter çok bilge ;-) komutu


346
2018-01-10 14:23



Regex bir şey bulamazsa, bu işlemi değiştirmeyen bir sürümü var mı? - sjakubowski
AFAIK filtre şubesi --msg filtresi her durumda yeni taahhütler üretecektir. Bununla birlikte, sedg başarılı olursa ve bu bilgiyi, ağaç-dalma işlemi ağacınızı refs / original değerine sıfırlamak için bittiğinde kullanabiliyorsa, msg-filtresinde kontrol edebilirsiniz. - Mark
@DavidHogue Bu sadece filtre-dalı yöntemini kullanırken geçerlidir. Değiştirilmiş bir işlemi takip eden taahhüt kimlikleri, etkileşimli yeniden düzenlemeyi kullanırsanız değişmez. - Mark
@Mark Evet, yapmaları gerekiyor. Commit ids, önceki taahhütlere bağlıdır. Değişmezlerse, git işe yaramazdı. - Miles Rout
İhtiyacın var $flawed_commit^..HEAD, değil $flawed_commit..HEAD. man sayfası tarafından belirtildiği gibi: «Komut sadece komut satırında belirtilen pozitif referansları tekrar yazar (örneğin, bir ..b'yi geçerseniz, sadece b yeniden yazılır).» - Ángel


Ben bu yolu tercih ederim.

git commit --amend -c <commit ID>

Aksi takdirde, yeni bir taahhüt kimliği ile yeni bir taahhüt olacak.


306
2017-11-08 03:51



Benim için yukarıdaki komutunuzu kullanmak, yeni bir taahhüt kimliği ile yeni bir taahhüt ve "birleştirme şubesi" ibaresini varsayılan bir taahhüt mesajı olarak ek bir taahhüt yaratır. - Jan
Değişiklik Yapılması her zaman Yeni bir taahhüt kimliği ile yeni bir taahhüt yaratır. Taşınma kimliği, taahhüt mesajı ve yazılan / taahhüt edilen zaman damgaları da dahil olmak üzere, taahhüt içeriğinin SHA karmasıdır. Bu, Git karma özelliği, karma çarpışmaları engellemenin, aynı kimliğe sahip iki işlemin tam olarak aynı içerikle, aynı içerikle, tarihle ve benzer şekilde olmasını sağlar. - Emil Lundberg
Emil ile katılıyorum. Ayrıca, belgelerin okunması - tüm "-c" komutlarının yaptığı gibi, yeni tahakkuk için varsayılan / şablon olarak kullanmak için hangi tahakkuk mesajını kullanacağınız söylenir. Şüphesiz, varsayılan olarak "-c <commit ID>" yazacaktır. Yani belirtmeye gerek yok. - Gal
-c birkaç şey yapar. Eski mesajı varsayılan olarak kullanır, ancak aynı zamanda yazarlık bilgilerini de (kişi ve zaman) kopyalar. -C mesajını düzenlemenizi istemediği dışında aynı şeyi yapar. - Joseph K. Strauss
@SantanuDey gibi, benim için çalışmadı. Bende var fatal: Option -m cannot be combined with -c/-C/-F/--fixup. - Andrew Grimm


Git GUI aracını kullanıyorsanız, son işlemi değiştiren adında bir düğme vardır. Bu düğmeye tıkladığınızda son dosyalarınızı ve mesajınızı gösterecektir. Sadece bu mesajı düzenleyin ve yeni taahhüt mesajıyla bunu taahhüt edebilirsiniz.

Veya bu komutu bir konsol / terminalden kullanın:

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

304
2018-01-22 17:23