Git / Git Uzantısı'nda "squash" ve "düzeltme" arasındaki fark nedir?


112

Git Uzantılarını bir süredir kullanıyorum (harika!) Ancak aşağıdakilere basit bir cevap bulamadım:

Bazen bir commit mesajı yazarken bir yazım hatası yapın. Arkadaşım bana bunu nasıl düzelteceğimi gösterdi (Git Uzantıları'nda):

Kaydetmeye sağ tıklayın> Gelişmiş> Düzeltme kaydetme

görüntü açıklamasını buraya girin

Sonra "Düzelt" kutusunu işaretlerim ve mesajımı yeniden yazarım ve işte! Kaydetme mesajım düzeltildi.

Ancak bu diğer seçenek "Squash commit" ... Her zaman ne yaptığını merak etmişimdir ?!

Sorum şu:

Misiniz birisi basitçe arasındaki kesin fark nedir bana açıklayabilir Squash işlemek ve Fixup taahhüt yılında Git / Git genişlemeleri ? Bana biraz ... "benziyorlar" : görüntü açıklamasını buraya girin görüntü açıklamasını buraya girin

Yanıtlar:


153

Git Extensions'ın özel olarak ne yaptığını bilmiyorum, ancak git rebaseotomatik olarak squash veya squash ile commit'leri düzeltme seçeneğine sahip! veya düzelt! önekler, sırasıyla:

   --autosquash, --no-autosquash
       When the commit log message begins with "squash! ..." (or "fixup!
       ..."), and there is a commit whose title begins with the same ...,
       automatically modify the todo list of rebase -i so that the commit
       marked for squashing comes right after the commit to be modified,
       and change the action of the moved commit from pick to squash (or
       fixup).

Squash ve fixup arasındaki fark, yeniden bağlama sırasında işlemin sizden orijinal mesajı ve squashsquash commit'i birleştirmenizi isteyeceği, ancak fixupişlemin orijinal mesajı koruyacağı ve mesajı düzeltme işleminden atacağıdır.


6
Git belgelerinde hakkında daha fazla bilgi edinebilir rebaseve squash / fixup yapabilirsiniz .

Bu harika bir cevap. Her zaman neden kombinasyon işleme mesajları aldığımı merak ettim.
jedd.ahyoung

67

Basitçe ifade etmek gerekirse, bir dizi taahhüdü yeniden oluştururken, her işlem bir olarak işaretlenir squash, size mesajını bir pickveya rewordcommit mesajının parçası olarak kullanma fırsatı verir .

Bu fixupişlemden gelen mesajı kullandığınızda atılır.


O halde hangi mesaj saklanır fixup?
IgorGanapolsky

2
@IgorGanapolsky Git ağacındaki bir sonraki işlemenin mesajı. Temelde taahhüdünüzü onunla "birleştirirsiniz".
Alexander Haroldo da Rocha

15

Gönderen git-Rebase doc, "interaktif mod" bölümü :

Eğer iki veya daha fazla kaydı bire katlamak istiyorsanız, ikinci ve sonraki kaydetmeler için "pick" komutunu "squash" veya "fixup" ile değiştirin. Kayıtların farklı yazarları varsa, katlanmış kaydetme, ilk kaydetmenin yazarına atfedilecektir. Katlanmış commit için önerilen commit mesajı, ilk commit ve "squash" komutu olanların commit mesajlarının birleştirilmesidir, ancak "fixup" komutuyla yapılan commit mesajlarını atlar.


13

Eğer soru arasındaki fark nedir squashve fixupyapıyor GIT'de budala --interactive rebase sonra cevap mesajı işlemek .

s, squash <commit> = commit kullan, ancak önceki commit ile birleştir

f, fixup <commit>= "squash" gibi, ancak bu commit'in günlük mesajını atın


Örneğin:

pick 22a4667 father commit message
squash 46d7c0d child commit message # case 1
# fixup 46d7c0d child commit message # case 2

Mesajı işlemek içinde rebasing sonra söz 1 olacaktır:

father commit message

child commit message

durum 2'deki commit mesajı ise:

father commit message
# no sub messages

1

Git uzantılarını düzelttim ve birçok işlemi bir araya getiremedim. Bunu yapmak için komut satırına başvurmak zorunda kaldım ve bu yazıyı faydalı buldum

git rebase -i Head~2

Bu etkileşimli bir yeniden temeldir ve aşağıdakilere dikkat edin:

  • ~ 2 burada, mevcut yönetici dahil olmak üzere, bu operasyona dahil etmek istediğiniz
  • Alttaki etkileşimli düzenleme penceresini düzenlemeniz, ilk öğeyi "seç" olarak bırakmanız ve sonraki satırları "squash" ile değiştirmeniz gerekir. Yukarıdaki bağlantıdaki talimatlar, bu opaksa çok daha nettir.

Bağlandığınız gönderi, squash ve fixup hakkında gördüğüm en net açıklama hakkındadır. Teşekkürler!
Simon Tewsi

0

Neden git'in kendisine sormuyorsunuz? İle yeniden ödeme yaptığınızda git-bashşöyle diyor:

pick 512b1d7 (some comment)
# Rebase 621b2e4..512b1d7 onto 621b2e4 (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
D:/code/fenixito-legacy-api/.git/rebase-merge/git-rebase-todo [unix] (11:57 23/10/2019)                                         1,1 start
"D:/code/xxx/.git/rebase-merge/git-rebase-todo" [UNIX] 27L, 1170C

Yani görüyorsunuz:

s, squash = kesinleştirme kullan, ancak önceki kaydetme ile birleştir

f, fixup = "squash" gibi, ancak bu commit'in günlük mesajını atın

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.