Yanıtlar:
Her ikisi de git merge --squash
ve git rebase --interactive
bir "ezilmiş" taahhüt üretebilir.
Ancak farklı amaçlara hizmet ederler.
herhangi bir birleştirme ilişkisi işaretlemeden hedef dalda ezilmiş bir taahhüt üretecektir.
(Not: hemen bir taahhüt vermez: ek bir ihtiyacınız var git commit -m "squash branch"
)
Bu, kaynak dalı tamamen atmak istiyorsanız ( SO sorusundan alınan şema ) yararlıdır :
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
için:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
ve sonra tmp
şubeyi silme .
Not: git merge
bir --commit
seçeneği vardır , ancak ile kullanılamaz --squash
. O was asla kullanmak mümkün --commit
ve --squash
birlikte.
Git 2.22.1 (3Ç 2019) tarihinden bu yana, bu uyumsuzluk açıkça belirtilmiştir:
Bkz . Vishal Verma ( ) tarafından taahhüt edilen 1d14d0c (24 Mayıs 2019 ) . (Göre Birleştirilmiş - Junio Cı Hamano - içinde 33f2790 tamamlama 2019 25 Tem)reloadbrain
gitster
merge
: Çöp--commit
ile--squash
Daha önce,
--squash
tedarik edildiğinde , 'option_commit
' sessizce düştü. Bu, squash'ın kesin olmayan davranışını--commit
açıkça kullanarak geçersiz kılmaya çalışan bir kullanıcı için şaşırtıcı olabilirdi .
git/git
builtin/merge.c#cmd_merge()
şimdi içerir:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
taahhütlerinizin bir kısmını veya tamamını yeni bir temelde tekrar oynatır ve doğrudan aşağıdakilere giderek ezmenize (veya daha yakın zamanda "düzeltmeye", bu SO sorusuna bakın ) izin verir:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
Tüm taahhütlerini ezmeyi seçerseniz tmp
(ancak aksine merge --squash
, bazılarını tekrar oynatmayı ve diğerlerini ezmeyi seçebilirsiniz).
Yani farklılıklar:
squash
kaynak dalınıza ( tmp
burada) dokunmaz ve istediğiniz yerde tek bir taahhüt oluşturur.rebase
aşağıdakilerle aynı kaynak dalda (hareketsiz tmp
) devam etmenizi sağlar :
tmp
birlikte ezilen taahhütleri temsil eder.
G
olduğundan g
, getirdiği değişiklikler nedeniyle aynı içeriği temsil etmez X
.
git merge --no-ff temp
yerine git merge --squash temp
, o zaman bir Messier geçmişini olsun, ama aynı zamanda gibi şeyler yapabilirsiniz git revert e
çok daha kolay. Dağınık, ama dürüst ve pragmatik bir tarih ve ana şube hala oldukça temiz.
git bisect
veya git blame
çok sık kullanıldığında da (şu şekilde olduğu gibi git pull --no-ff
: stackoverflow.com/questions/12798767/… ). Zaten tek bir yaklaşım yok, bu yüzden bu makalede üç açıklanmıştır ( stackoverflow.com/questions/9107861/… )
Birleştirme taahhütleri: şubenizdeki tüm taahhütleri tutar ve temel şubedeki taahhütlerle serpiştirir
Squash Birleştir: değişiklikleri korur, ancak bireyin tarihte taahhüt ettiği şeyi ihmal eder
Rebase: Bu, tüm özellik dalını ana dalın ucunda başlamak için taşır ve tüm yeni taahhütleri etkili bir şekilde ana programa dahil eder
Burada daha fazlası
Birleştirme kabağı, bir ağacı (bir dizi işlem) tek bir işlemde birleştirir. Yani, bir squashes yapılan tüm değişiklikleri n tek içine kaydedilmesini işlemek.
Yeniden inşası yeniden temel alır, yani bir ağaç için yeni bir taban (üst düzey taahhüt) seçer. Belki bunun mercurial terimi daha açıktır: buna transplant diyorlar çünkü bu sadece: bir ağaç için yeni bir zemin (ebeveyn taahhüdü, kök) seçmek.
Etkileşimli bir rebase yaparken, rebase yapacağınız taahhütleri ezme, seçme, düzenleme veya atlama seçeneği sunulur.
Umarım bu açıktı!
Aşağıdaki örnekle başlayalım:
Şimdi değişikliklerini birleştirmek 3 seçenek var özellik dalı haline ana şube :
Birleştirme taahhütleri
Tüm özellik dalının geçmiş taahhütlerini saklayacak ve bunları ana şubeye taşıyacak
Ekstra kukla taahhütler ekleyecektir.
Yeniden oluşturma ve birleştirme Ana dalın önündeki özellik dalının
tüm taahhüt tarihini
ekler Ekstra kukla taahhüt eklemez.
Squash ve birleştirme
Will grubu, tüm özellik dalı haline kaydedilmesini birinin taahhüt önünde ekleme daha sonra ana dal
ekstra kukla taahhüt ekler misin.
Ana dalın her birine nasıl bakacağını aşağıda bulabilirsiniz .
Her durumda: Özellik dalını
güvenle Silebiliriz .
G
edilirc--d--e--f--g
birlikte ezilmiş?