Git'te hızlı iletmeyi varsayılan olarak kapalı yapabilir miyim?


263

Ben işleviyle gerçekten hiç bir zaman düşünemiyorum git mergeyerine git rebaseve değil bir göstermek işlemek istiyorum. Git'i varsayılan olarak hızlı yönlendirme yapacak şekilde yapılandırmanın bir yolu var mı? Bir --ffseçenek olduğu gerçeği, bir yol olduğunu ima ediyor gibi görünüyor, ancak bunu belgelerde bulamıyorum.


3
mergeUzaktan iletmek için uzaktan kumandalarını taahhüt etmedikçe şubeler için her zaman kullanırım . Bunu yapmanın en basit ve en güvenli yolu gibi görünüyor. Merak ediyorum, açıkçası bir kullanım vakanız var. Neden şubenin bir tarafında taahhüt bulunmayan bir birleştirme taahhüdü oluşturmak istesin ki?
CB Bailey

12
Dalları mantıklı bir gruplama oluşturmak için kullanıyorum. Yani bir birleşme yaparsam, bu temelde "bu taahhütler birlikte gider" demenin bir yoludur. Neredeyse fakir bir adamın etkileşimli rebase ve squash olarak düşünebilirsiniz. :-)
Jason Baker

13
Hızlı iletmeyi kapatmak, özellikle Başarılı Git dallanma modeli
steinybot

2
Lütfen bunun için kabul edilen cevabı Eric Platon'un cevabı olarak değiştirin stackoverflow.com/a/6810687/3408 - Kabul edilen cevaptaki adımları uyguladım, sonra sadece mevcut depodaki ana dal için aptal olduğunu anladım.
rjmunro

3
@ jpmc26 Her biri kendi sanırım. Bu makaleye katılmıyorum. Birleştirme işleminin iki ebeveyni bulmak zor değildir ve değişikliklerin tam olarak ne olduğunu söyler. Sonra bu değişiklikleri alabilir ve başka bir dalda "yeniden taban" yapabilirsiniz. Düz model ile manuel olarak bulmanız ve kiraz seçmeniz gerekir. Dallanmayı kucaklamayı seçiyoruz. Elbette tüm ağaca bakarken karmaşıktır, ancak gerçek budur, paralel olarak birden fazla değişiklik meydana gelir. Her şeyi düzleştirmek, gerçekte ne olduğunu gizler.
steinybot

Yanıtlar:


282

Evet, var --no-ff. Dal başına birleştirme seçeneklerini yapılandırabilirsiniz, ör.

git config branch.master.mergeoptions  "--no-ff"

$(REPO)/.git/configdosyanıza aşağıdakileri ekler :

[branch "master"]
    mergeoptions = --no-ff

Dipnot: Tecrübelerimden bahsetmişken, sonunda hızlı ileriye geçiş yapmanın git yeni gelenler için çoğunlukla yararlı olduğunu buldum - ancak iş akışları ve kavramlar için hisler batmaya başladığında, günlük grafiğinizi tonlarca anlamsız 'birleştirilmiş ile kesinlikle önlemek istemiyorum remote ..blarf 'tipi taahhüt eder.

Dipnot 2, on yıl sonra: aşağıdaki diğer cevaplar daha modern yapılandırma seçenekleri sunar, ancak gerçekten, bu gün ve yaşta varsayılanlarla (yani mümkün olduğunda hızlı ileri) kalmak istersiniz, çünkü boş birleştirme gerçekten sadece taahhüt eder tarihin akıl yürütmesini çok daha zor hale getirir.


142
Git'i öğrenmek dağ tırmanışı gibidir; ama git küçük kayalıklarla başlamak ve daha sert olanlara ilerlemek yerine, aynı dağa tırmanmak, her seferinde, her seferinde farklı yüksekliklere düşmek, her seferinde yaşam çizgisinin bağlı olmadığı kadar şaşırır.
conny

12
@Tomlar: Evet; git pullolup git fetch+ git merge.
Michelle Tilley

9
Bu iyi görünüyor, ancak bunu her dal için kurmak yerine tüm dallar için küresel olarak yapmanın bir yolu var mı?
bwinton

33
Ejderhalara dikkat edin. @Thomas'ın dediği gibi bu seçenek tehlikelidir ... Her git pull birleştirme taahhüdü oluşturur. git pull --ff git config içindeki mergeoptions = no-ff öğesini geçersiz kılmaz.
Dalibor Filus

15
Yazmaktan yorulduysam ne olur git merge --no-ff (branchname)? Ve git pullher zamanki gibi çalışmak istiyorum ?
Dogweather

341

Görünüşe göre iş parçacığında hala bekleyen bir soru var: Küresel olarak nasıl yapılır (yani tüm şubeler için)? Kayıtlar için aşağıdakileri kullanabiliriz:

git config --add merge.ff false

... mevcut depodaki tüm şubelere uygulanmasını sağlamak için. O tüm şubelerine başvuruda yapmak için tüm depoları birisi olan değil olmadan çalıştırabilir --global(yerel ayarlar küresel geçersiz) bu çalıştırmak seçeneği:

git config --global --add merge.ff false

Gönderen belgeler :

merge.ff
Varsayılan olarak git, geçerli taahhüdün torunu olan bir taahhüt birleştirilirken fazladan birleştirme taahhüdü oluşturmaz. Bunun yerine, mevcut dalın ucu hızlı ilerletilir. False olarak ayarlandığında, bu değişken git'e böyle bir durumda fazladan birleştirme taahhüdü oluşturmasını söyler ( --no-ffkomut satırından seçeneği vermekle eşdeğerdir ). Yalnızca olarak ayarlandığında, yalnızca bu tür hızlı ileri birleştirme işlemlerine izin verilir ( --ff-onlykomut satırından seçeneğin verilmesine eşdeğerdir ).


18
Not: merge.ffGit 1.7.6'da tanıtıldı. Eski sürümlerde etkili değildir.
Chris Johnsen

2
Git 1.7.6 kullanan kişiler için bu en iyi ve en basit çözümdür.
Ryan Lundy

22
Bunu bir takma adla birlikte kullanıyorumpuff = "pull --ff --ff-only"
stigi

11
Aynı zamanda (şimdi, git-scm.com/docs/git-config adresine bakın ), yalnızca takma adla aynı işlevi görecek olan pull.ff seçeneğidir .
jotomo

1
Teşekkürler @jotomo. Bu özellik Git v2.0.0'dan (b814da891e8261b909fc5d9fb07b4e8b13989c2d işleminden) edinilebilir.
Eric Platon

14

Aşağıdaki iki seçeneği kullanarak cevap dizisini okudum

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible

Sadece gevşek ilgili Ayrıca bu ayar çekme sırasında sorun önler buldum

git config --global pull.rebase true # set up pull to rebase instead of merge

1
git config --global pull.rebase doğru # uyarı satırın sonunda 'doğru'
Zowers

Teşekkürler @zowers Bunu düzelttim
bastian
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.