Magit ile bir önceki göreve değişiklik yap


42

2 taahhüt var, A sonra B, itilmeye hazır. A.'da bir şey eklemeyi unuttuğumu fark ettim.

Magit kullanarak bu değişikliği A'ya nasıl ekleyebilirim? Git belgelerinin hangi bölümüne bakmam gerektiğini bile bilmiyorum.

Yanıtlar:


67

HEADÖrneğe, "ikinci ikinci B" sıfatıyla bir şey eklemek istediğiniz bir an gibi davranalım .

Açılan açılır pencere cbağlayıcı bir " aAmend" içerir. Bu tuşa basmak, aşamalı olarak HEADtaahhütte yapılan değişiklikleri "değiştirir" . Git'teki taahhütler değişmediğinden, bu aslında eski taahhüdün yerine yeni bir taahhüt verir. Eski onaylama mesajına sahip bir arabellek açılır, böylece eklenen değişikliğin aynı zamanda mesajı ayarlamanızı gerektirmesi durumunda değiştirebilirsiniz. Her zaman C-c C-colduğu gibi, mesajı düzenlemeyi tamamladığınızda tuşuna basın . Bu git commit --amendkomut satırında çalışmaya eşdeğerdir .

  • a Değiştir - aşamalı değişiklikleri HEADekle ve taahhüt iletisini düzenle

Çoğu zaman yalnızca değişikliği veya iletiyi ayarlamanız gerektiğinden dolayı , Magit iki ek seçenek sunar:

  • e Genişlet - HEADonaylanan iletiyi düzenlemeden aşamalı değişiklikleri ekleyin
  • w Reword - HEADAşamalı değişiklikleri eklemeden mesajını değiştir

Değil bir taahhüdü düzenlemek istediğinizde HEAD, o zaman yukarıdaki işe yaramaz. Bu komutlar daima HEADtaahhüdü "değiştirir" (yani değiştirir) . Git, başka bir taahhüdü değiştirmek için tek bir komut sağlamaz, HEADbu yüzden bu biraz daha karmaşıktır.

Magit yok böyle bir komut sağlar, ancak durumlar vardır, çünkü biz öncelikle bu tartışacağız birden fazla adımda bunu tercih olduğu.

Dışında bir taahhüdü değiştirmek HEADüç adıma bölünebilir:

  1. Bunu geçici olarak diğer taahhüde sokun ( A) HEAD.
  2. Taahhütle HEADsonuçlanan (yukarıda açıklandığı gibi) değiştirin A'.
  3. Git’e, takip eden taahhütleri yerine getirmesini söyle A, ancak bunun da ötesinde A'.

Bu etkileşimli bir rebase kullanılarak yapılabilir. Tip rRebase açılır penceresini göstermek için. Daha sonra m"bir düzeltme düzenle" rebase varyantını çağırmak için yazın . Son taahhütleri olan bir tampon belirir. Değiştirmek istediğiniz taahhüde gidin ve C-c C-cseçmek için yazın. Git daha sonra geçmişi bu işleme geri alır ve durum arabelleğinde devam eden yeniden düzenleme hakkında bilgi gösterir.

HEADYukarıda açıklandığı gibi değiştirin . Ardından Git'e yazdığınızı söyleyin r r. Eğer A've Bçatışma o zaman rebase durur ve çatışma Bçözmek zorunda kalırsınız. Bunu yaptıktan sonra r rdevam etmek için tuşuna basın .

Yapacağınız değişikliklerin Açatışmalarla sonuçlanacağını biliyorsanız, Byukarıda açıklanan şekilde devam edin, aksi takdirde aşağıdaki yaklaşımı kullanın.


Git kullanarak "düzeltme taahhütleri" oluşturulmasına izin verilir git commit --fixup A. Bu, “başka bir taahhütte yapılması gereken değişiklikleri” kaydeden yeni bir taahhüt yaratır . Bu taahhüt yeni olur HEAD. Bir --squashvaryantı da var . Farklılıklar hakkında bilgi için git-commitman sayfasına bakınız .

ATaahhüdü ve yeni taahhüdü bir araya A'getirip yeniden uygulamak Biçin yeniden uygulamanız gerekir. Magit, bunun için uygun bir komut sağlar r f.

Yukarıdaki yaklaşımdaki en büyük fark, burada önce yeni bir taahhüt oluşturmamız, ardından bunu “hedef” ile birleştirip yeniden uygulamaya koymamız gerektiğidir B. Yukarıda taahhüt etmek yerine yeniden yapılanma ile başladık.

Magit her iki --fixupve --squashvaryantları edinilebilir üzerine, açılan taahhüt fve s. Ama Magit da "anlık" Fixup ve squash komutların varyantları sağlar Fve S. Bu değişkenler, "anlık olmayan" değişkenler gibi yeni bir işlem oluşturur, ancak daha sonra başka bir komutu çağırmanıza gerek kalmadan, düzeltme işlemini yeniden oluşturma kullanarak hedef işlemeyle anında birleştirir.

"Anında düzeltme" ( c F) aslında "genişlet HEAD" ( c e) ile aynı şeydir , yalnızca herhangi bir işlem için çalışması dışında HEAD.


Daha fazla okuma:


Kristal berraklığı! Teşekkürler, müthiş paket BTW.
Mathieu Marques

1
Sanırım cevabımın ikinci yarısında bazı duygusal kısımlar var. Ama bunlardan kaçınmak için zaten bu uzun cevabın uzunluğunu ikiye katlamak zorunda kalacağım, bu yüzden bunun sizin için çalışmasına sevindim ;-)
tarsius

Bu cevap tarsius için teşekkürler, bu gerçekten benim için çalışıyor.
anquegi,

Bu açıklamanın ilk yarısının netliği, takip etmesi çok zor olan ikinci yarının okunmasını zorlaştırıyor!
Lyn Headley

git-commitman sayfası git-rebase(1)bu satırlara sahip olan yönlendirmeleri yönlendirir : Katlanmış taahhüt için önerilen taahhüt mesajı, ilk teklifin ve "squash" komutuna sahip olanların taahhüt mesajlarının birleştirilmesidir, ancak "düzeltme" içeren taahhüt mesajlarını atlar. komut. IOW, sadece önceki onaylamadaki kodu düzeltmek istiyorsanız düzeltme komutunu kullanın, onaylama mesajını da düzeltmek istiyorsanız squash kullanın .
Yasushi Shoji

3

git commit --amend –C HEADAramak istediğiniz Git komutu ve Magit’te değişiklik yapabilirsiniz C-c C-a.


En son Magit kullanıyorum, C-c C-aeski bir sürümden (sanırım). Ayrıca yardım tamponunda ( ?) "değişiklik" izi yok .
Mathieu Marques

Magit 2.x eşdeğeri için Rémi'nin cevabına bakınız .
npostavs

3

Yani bir iş akışı:

  • değişiklik yap
  • c (taahhüt) f (düzeltme - sabitlemenizi gerçekleştirmeyi seçin)

Sonra

  • r (rebase) -a (otomatik yıkama, varsayılan olabilir) i (etkileşimli)

Otomatik yıkama, otomatik olarak tüm! Sabitleme işlemlerini doğru yere götürür ve tekrar tabanda ezilmesi için ayarlar.


Söylemediğin tek şey, ilk kurşunla ikinci vuruşun arasında dolaşmaktı. Vurmak ibana gelir Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.. Ancak kabul edilmemiş herhangi bir değişiklik yapmam. : /
Mathieu Marques

Çektikten sonra tekrar denedim Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort. Düzeltmemin yaklaşmakta olan birleşime sıçrayabileceğini söylemeye mi çalışıyor?
Mathieu Marques

@MathieuMarques: "Taahhüt edilmemiş herhangi bir değişiklik yapmadığım hariç" - git yaptığınızı düşünüyor. İletide, değişmemiş değişiklikler değil aşamalı değişiklikler önerildiğine dikkat edin. Re:, merge in rebasealtında HATALAR bakın git help rebase. Yukarı doğru çekmeden önce düzeltmeyi yapmayı öneririm.
npostavs

1

Son taahhüdünü değiştirmek için "c a" dır. Düzeltme, bazı eski taahhütleri değiştirmek içindir.


Bu durumda, A sonra B'ye karar verdim . Açıklık için yazı güncellendi.
Mathieu Marques
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.