Git'i tüm depolarım için varsayılan olarak rebase'i nasıl kullanabilirim?


186

Ana bilgisayar Git deposunu git pull, (yerel) klonlarından yapılan herhangi bir --rebasevarsayılan olarak kullanılacak şekilde kurmanın bir yolu var mı ? Yığın Taşması üzerinde arama yaparak öğrendim branch.autosetuprebase, ancak klon başına ayrı ayrı yapılandırılması gerekiyor.

Projem akışı böyle bizim birlikte kurulur önce şube buna bir özellik dalı ing. Bu neredeyse her zaman kullanır , bu yüzden bu varsayılan olup olmadığını anlamaya çalışıyorum.pulldevelopmergepull--rebase


6
Neden bunu istiyorsun? Kullanıcılara, hangi vakanın daha uygun olacağını aktif olarak düşünmelerini öğretmenin daha mantıklı olduğunu düşünüyorum (yukarı akıştan yaptıkları veya yukarıdan bekledikleri değişikliklerin büyüklüğüne göre) ''
Jonas Schäfer

4
@JonasWielicki Evet, katılıyorum. Sadece bazı ekip üyelerim Git için yenidir ve ilk aşamada (öğrenene kadar) problemlerden kaçınmanın bir yolu olup olmadığını bilmek istiyorum. Ekip ayrıca farklı bir saat diliminde uzaktan çalışır, yani bir şeyler ters giderse birkaç saat sıkışmış olurlar. Bunun mümkün olup olmadığını bilmek sadece merak ediyor.
Maskeli Adam

1
Özellikle ilk kurulumlar için birleşmeye gitmek daha iyi. Kodunuz gerçekten farklıysa, Rebase çok daha garip şeyler yapar. Siz itinceye kadar aynı çatışmaları tekrar tekrar çözmelisiniz. Bir ekip üyesi bir kod üzerinde çalışmak istiyorsa, her zaman rebase kullanır ve bitene kadar zorlamaz (yeni gelenler kendilerini dallamak yerine yapabilirler), zaten X kez çözdükleri aynı çatışmalarla karşı karşıya kalacaklar. .
Jonas Schäfer

3
@JonasWielicki ekip üyeleri yapmak onlar üzerinde çalışmak her yeni özellik için yeni bir şube yapmak (ve bu, onlar zaten oldukça iyi anlamış). Rebase gereksinimi, diğer geliştiricilerin değişikliklerini zorlamaya hazır olduğunda "uzaktan" geliştirme dalını taahhüt ettikleri için gelir. Bu yüzden, değişikliklerini zorlamadan önce uzaktan çekerek bir çek rebase yapmasını istiyorum. Projenin kendisi oldukça olgun, sadece ekip yeni. :) Yani sadece insanlar açısından bir "ilk kurulum" dir. Bu senaryo için tavsiyeniz ne olur?
Maskeli Adam

5
İlk yorumunuzu yanıtlamak, çoğu durumda (neredeyse hepsi), rebase doğru seçimdir, çünkü yeni bir özelliği iyice test etmek çok zaman alır, vb. Yapılan zamana kadar kesinlikle olurdu diğer geliştiricilerin taahhütleri.
Maskeli Adam

Yanıtlar:


205

Artık varsayılan çekme davranışı için 3 farklı yapılandırma düzeyi vardır. En genelden en ince taneye kadar bunlar:

1. pull.rebase

Bu ayarlama truearacı git pullhep eşdeğerdir git pull --rebase(sürece branch.<branchname>.rebaseaçıkça ayarlandığında false). Bu, havuz başına veya global olarak da ayarlanabilir.

2. branch.autosetuprebase

Bu ayarlama alwaysbir izleme şube oluşturulduğunda, aşağıdaki gibi bir yapılandırma girişi bunun için oluşturulmuş olacağını vasıtası. İnce taneli kontrolü için, bu da ayarlanabilir never, localya remoteve depo başına veya genel olarak ayarlanabilir. Daha git config --helpfazla bilgi için bakınız.

3. branch.<branchname>.rebase

Bunu ayarlamak true, git pull --no-rebaseaçıkça kullanılmadıkça , belirli bir dalın her zaman yukarı yönlendirme yoluyla yukarı akışından çekileceği anlamına gelir .

Sonuç

Bu nedenle, bir deponun gelecekteki tüm klonları için varsayılan davranışı değiştiremeseniz de, geçerli kullanıcının (mevcut ve gelecekteki) depolarının tümü için varsayılanı değiştirebilirsiniz git config --global pull.rebase true.


4
Yanıtınız için teşekkürler. Depoyu klonlayan herkesin varsayılan olarak etkin olmasını sağlayacak bir ayarımın olup olmadığını araştırıyordum. Yukarıdaki ayar saklanır ~/.gitconfig, yani ana bilgisayar deposunu klonlayan her geliştiricinin komutu çalıştırması gerekir. Çözümünüz hakkında şikayet etmemek. Bu iyi bir şey, sadece doğru olduğunu anladığımı doğrulamak istiyorum.
Maskeli Adam

Cevap için teşekkürler. Gerçekten bu bir kişinin alabileceği kadar yakın gibi görünüyor.
Maskeli Adam

139

Peki ya

git config --global pull.rebase true

Bu git'e her zaman rebase ile çekilmesini söyleyecektir.


3
Teşekkürler, bu mevcut izleme dalları için harika çalışıyor.
Fls'Zen

1
Lütfen kaldırın --bool, gereksiz
diralik

38

Cevap hayır.

Uzak bir depo kurmanın bir yolu yoktur, böylece onu klonlayan herkesin varsayılan davranışı git pulldeğişmiş olur.

Bununla birlikte, hiç kimsenin birleştirme taahhütlerini itmediğini kontrol eden bir sunucu tarafı kancası ayarlayabilirsiniz ( belki böyle bir şey ).

İlginizi çekebilecek bazı yapılandırma seçenekleri de vardır. Uzak depodan klonlayan tüm geliştiricilerin bunu kendileri manuel olarak ayarlamaları gerekecektir.

1. Seçenek branch.<name>.rebase

Yerel bir dalı her zaman --rebasebunun gibi <name>bir şube adıyla değiştirilecek şekilde yapılandırabilirsiniz :

git config branch.<name>.rebase true

Bunu çalıştırdıktan sonra master, masterbölüm şu şekilde .git/configgörünüyordu:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. Seçenek branch.autosetuprebase

Her Git dalı için önceki yapılandırma komutunu çalıştırmak bir güçlük olabilir, böylece Git'i her yeni dal için otomatik olarak kuracak şekilde yapılandırabilirsiniz:

git config branch.autosetuprebase always

(Ayrıca belirtebilirsiniz never, remoteve localbkz man git-configdetaylar için.)

--globalSeçenek olmadan, yapılandırma kaydedilir .git/configve yalnızca geçerli depo etkilenir. İle --global, yapılandırma kaydedilir ~/.gitconfigve yapılandırılmamış her depo etkilenir.

Bu seçenek zaten var olan dalları etkilemez.

3. Seçenek pull.rebase

git config --bool pull.rebase true

(Ayrıca --globalseçenek de verebilirsiniz .)

Bu seçenek doğruysa, ayarlanmadığı sürece çalıştırma git pulleşittir .git pull --rebasebranch.<name>.rebasefalse


3

Bu, belirli bir dalı --rebaseverirken seçeneği varsayılan yapar git pull.

@Flimm, trueilk seçeneğin işe yaraması için eklemem gerekiyordu.

Yani doğru sözdizimi:

git config branch.<branch>.rebase true

Bu komutu developdalda çalıştırmak için :

git config branch.develop.rebase true

Ve şimdi developbölüm şu şekilde .git/configgörünüyor:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true

Teşekkürler, cevabımı düzenledim, gelecekte cevabı kendiniz düzenlemekten çekinmeyin.
Flimm

2
Donwvoter, kim olursan ol, lütfen nedenlerini açıkla. Yorum yapmadan aşağı oy vermek benim için tamamen keyfi ve yapıcı görünmüyor.
Daishi

1

Şu anda bir havuz için varsayılan politikayı ayarlamanın bir yolu yoktur.

Kendiniz istiyorsanız ve en az git 1.7.9 kullanıyorsanız, pull.rebaseyapılandırmayı genel olarak aşağıdaki gibi ayarlayabilirsiniz :

git config --global pull.rebase true

Ancak her makinede yapmanız gerekecek. Bir seçenek, varsayılan kullanıcı ana şablonunu / iskeletini bu seçenekle yapılandırmak olabilir. Ancak kullanıcılar bu seçeneği değiştirebilir.

Birleştirme istemiyorsanız, birleştirmeleriyle yapılan itmeleri reddetmek için bir sunucu tarafı kanca tanımlayabilirsiniz.

Referans olarak, onun pull.rebase için kaynak belgeleridir :

True olduğunda, "git pull" çalıştırıldığında varsayılan dalı varsayılan uzaktan kumandadan birleştirmek yerine, getirilen dalın üstündeki dallara rebase dalları. Bunu şube başına ayarlamak için bkz. "Branch..rebase".

Birleştirme işlemlerinde, yerel birleştirme işlemlerinin yeniden işleme dahil edilmesi için --rebase-merges seçeneğini git rebase'e iletin ( ayrıntılar için git-rebase'e bakın).

Korunduğunda, yerel olarak kaydedilen birleştirme işlemlerinin git pull çalıştırılarak düzleştirilmemesi için git rebase'e --preserve-merges'i de iletin.

Değer etkileşimli olduğunda, rebase etkileşimli modda çalıştırılır.

NOT / BILGI: bu muhtemelen tehlikeli bir işlemdir; sonuçları anlamadığınız sürece kullanmayın ( ayrıntılar için git-rebase'e bakı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.