Bu git uyarısıyla nasıl başa çıkılır? "Farklı dalların nasıl uzlaştırılacağını belirtmeden çekmek tavsiye edilmez"


120

Sonra git pull origin masteraşağıdaki mesajı alıyorum:

warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:

  git config pull.rebase false  # merge (the default strategy)
  git config pull.rebase true   # rebase
  git config pull.ff only       # fast-forward only

You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.

remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 51.49 KiB | 850.00 KiB/s, done.

Sonra çekme başarıyla yapıldı. Ama yine de bu mesajla ilgili şüphelerim var.
Bu durumda yapılacak en iyi şey nedir?


1
Uyarının kafa karıştırıcı olduğuna dair bir hata raporu oluşturun. Bir seçenek "tavsiye edilmeli" ve uyarı sadece istek üzerine gösterilmeli, sadece bir sürüm değişikliği olduğu için değil. Çok sayıda otomatik komut dosyası şimdi bu beklenmedik davranışla bozulabilir.
Wolfgang Fahl

1
@WolfgangFahl, uyarı açıkça değiştirilene kadar varsayılan davranışı korumaya devam ettiğinden hiçbir komut dosyasını etkilememelidir. Çekme işleminin sıfır olmayan bir çıkış kodu döndürmesine neden olmamalıdır (bir hata değil, bir uyarı olduğu düşünüldüğünde). Çeşitli sunuculara yerleştirdiğim birkaç CI / CD betikleri, etkilenmeden başarı oranıyla çalışmaya devam ediyor.
Qumber

@Qumber - yorum için teşekkürler. Crontab girişleri, örneğin çıktı orada olmayan veya basit bir grep ile filtrelenebilecek çıktı ortaya çıktığında e-posta göndermeye başlayacaktır. Beklenmedik çıktıların her türlü yan etkisi olabilir.
Wolfgang Fahl

@WolfgangFahl, Her çekimin genellikle farklı çıktıları vardır. Yani, yalnızca buna bağlı olan herhangi bir komut dosyası muhtemelen kötü yazılmıştır. Ayrıca, kapsamlı testler yapılmadan bir üretim ortamı yükseltilmemelidir. Ürünü hiç yükseltmemeyi tercih ederim. Bunun yerine, en son her şeyi içeren yeni bir örnek oluşturuyorum, uygulamalarımı orada barındırıyorum, her şeyi test ediyorum ve ardından onu üretiyorum.
Qumber

Yanıtlar:


135

Varsayılan modunda, git çekme, git getirmenin kısaltmasıdır ve bunu git merge FETCH_HEAD izler.

Bir yaptığınızda git pull origin master,
git pullgenellikle birleştirme taahhüt yaratan bir birleştirme gerçekleştirir. Bu nedenle, varsayılan olarak, uzaktan kumandadan çekmek zararsız bir işlem DEĞİLDİR: daha önce var olmayan yeni bir commit sha yaratabilir. Bu davranış, bir kullanıcının kafasını karıştırabilir, çünkü zararsız bir indirme işlemi olması gerektiği gibi hissettiren şey aslında kaydetme geçmişini tahmin edilemeyen şekillerde değiştirir.

Bundan kaçınmak için ihtiyacınız olan

git pull --ff-only

(ya da değil? hangisinin ihtiyaçlarınıza uygun olduğunu görmek için okumaya devam edin)

İle git pull --ff-onlyGit, şubenizi yalnızca yeni taahhütler oluşturmadan "hızlı ileri" edilebiliyorsa güncelleyecektir. Bu yapılamazsa, git pull --ff-onlysadece bir hata mesajı ile iptal edilir.

Git istemcinizi her zaman --ff-onlyvarsayılan olarak kullanacak şekilde yapılandırabilirsiniz , böylece komut satırı işaretini unutsanız bile bu davranışı elde edersiniz:

git config --global pull.ff only

Not: --globalBayrak, değişikliği makinenizdeki tüm depolara uygular. Bu davranışı yalnızca içinde bulunduğunuz arşiv için istiyorsanız, bayrağı atlayın.

Buradan alındı



Joe'nun cevabında belirttiği gibi bu uyarı Git 2.27'ye eklendi.

Tam uyarı şu şekilde görünüyor:

Farklı dalların nasıl uzlaştırılacağını belirtmeden çekmek tavsiye edilmez. Bir sonraki çekmeden önce aşağıdaki komutlardan birini çalıştırarak bu mesajı

susturabilirsiniz : git config pull.rebase false # merge (varsayılan strateji)
git config pull.rebase true # rebase
git config pull.ff sadece # hızlı ileri sar

Tüm depolar için varsayılan bir tercih belirlemek için "git config" i "git config --global" ile değiştirebilirsiniz. Ayrıca, çağrı başına yapılandırılmış varsayılanı geçersiz kılmak için komut satırında --rebase, --no-rebase veya --ff-yalnızca iletebilirsiniz.

Uyarı, seçenek olarak üç komut sunar, bunların tümü uyarıyı bastırır. Ancak farklı amaçlara hizmet ederler:

git config pull.rebase false     # merge (the default strategy)

Bu, varsayılan davranışı korur ve uyarıyı bastırır.

git config pull.rebase true      # rebase

Bu aslında hem yerel hem de uzaktan tek bir dalı koruyarak uzaktaki dalın üstüne işlem yapar (biri yerel diğeri uzaktaki iki farklı dalın dahil olduğu varsayılan davranıştan farklı olarak - ve ikisini birleştirmek için bir birleştirme gerçekleştirilir. ).

git config pull.ff only          # fast-forward only

Bu, yalnızca yerel dal hızlı ileri alınabiliyorsa çekme işlemini gerçekleştirir. Değilse, sadece bir hata mesajı ile iptal edilir (ve herhangi bir kaydetme oluşturmaz).


Güncelleme:

Eğer varsa Git 2.29veya yukarıdaki, şimdi ayarlayabilirsiniz pull.ffiçin false, trueya da onlyuyarı kurtulmak için.

git config pull.ff

true- Bu, varsayılan davranıştır. Çekme, mümkünse hızlı ileri sarılır, aksi takdirde birleştirilir.

git config pull.ff false

false - Çekme hiçbir zaman ileri sarılmaz ve her zaman bir birleştirme oluşturulur.

git config pull.ff only

only - Çekme mümkünse hızlı ileri sarılır, aksi takdirde işlem bir hata mesajı ile iptal edilir.


2
Cevabınız için harcadığınız zaman ve çabayı takdir ediyorum, ancak açıkçası bu benim için hala tamamen anlaşılmaz.
Jared Nedzel

1
Burada yorumlandığı gibi , uyarı şubenin gerçekte farklılaşıp ayrışmamasından etkilenmez . Baştaki "Şubeniz muhtemelen farklılaşıyor." yanıltıcı olabilir.
Joe

2
Ben, mesajda üç seçenek yoktu demek zorunda değil bana mesaj baskılamak için çalışıyoruz. Ancak buradaki cevap ( git config --global pull.ff only) yaptı .
DiskJunky

1
Aha! Teşekkürler @Qumber. Zaten denedim pull.rebase falseama anlatıldığı gibi çalışmıyordu. Her zaman bir birleştirme taahhüdü yaratıyordu ve asla ileri sarmıyordu. Temel neden, merge.ff falseortama sahip olmamdı. Bu ayarı temizledikten sonra, gerektiği zaman hızlı ileri gider. Dokümanlar burada ( git çekme dokümanları ile neredeyse aynı )
stwr667

1
Aşağıda bahsettiğim Git 2.29 seçeneğini dahil ettiniz, iyi bir nokta. Olumlu oy verildi.
VonC

56

Bu yeni bir uyarıdır katma de Git 2.27 :

 * "git pull" issues a warning message until the pull.rebase
   configuration variable is explicitly given, which some existing
   users may find annoying---those who prefer not to rebase need to
   set the variable to false to squelch the warning.

İçin uyarıyı kaldırmak için, tercih varsayılan davranışına önerilen değerlerden birini ayarlamak git pullkomut satırında davranışını belirtmek yoksa (kullanarak --ff, --no-ff, --ff-only, --rebase). Her durumda, mümkünse hızlıgit ileri sarma ( git hızlı ileri sarma nedir? ) Birleştirmeye çalışacaktır . Ayarlar branşında değişiklikler ancak orada iken ne olacağını kontrol değil uzak branşında mevcut.

  git config pull.rebase false  # merge (the default strategy)

Bu, mevcut varsayılan davranıştır; bunu uyarı olmaması ve davranışta değişiklik olmaması için ayarlayın; gituzak dalı yerel şubenizle birleştirecektir.

  git config pull.rebase true   # rebase

Burada, gitdeğişikliklerinizi uzak şubenin üzerine yeniden sunmaya çalışacak. Bkz Ben git çekme --rebase ne zaman kullanmalıyım? Bunu neden isteyebileceğinizle ilgili daha fazla ayrıntı için.

  git config pull.ff only       # fast-forward only

Hızlı ileri birleştirme mümkün değilse, gitilerlemeyi reddeder. As git çekme arasındaki fark --rebase ve git çekme --ff okunur tırnak:

Mevcut HEAD zaten güncel değilse veya birleştirme hızlı ileri sarma olarak çözülemiyorsa, sıfır olmayan bir durumla birleştirmeyi ve çıkmayı reddedin


18
Bu aslında en doğru cevap, çünkü insanların (benim gibi) git'i yaklaşık on yıl kullandıktan sonra neden birden bu uyarıyı gördüklerini açıklıyor. Bununla birlikte, sunulan seçenekler hakkında bir miktar rehberlik verilmesi faydalı olacaktır. örneğin, pull.ff'in "yalnızca" olarak ayarlanmasının onu geçersiz kılmak için "pull --rebase" yapmanızı engellemediğine dikkat edin.
kdopen

Arasındaki fark nedir pull.rebase = trueve branch.autoSetupRebase = always?
tekumara


1
"şubenizde değişiklikler olduğunda ancak uzak dalda bulunmadığında." O zaman bana öyle geliyor ki git bu uyarıyı sadece durum buysa atmalı. Eğer ana hattımı çekiyorsam (ve ana hat düzgün kullanılıyorsa) bunun için endişelenmeme gerek yok.
Keith Tyler

4
@Joe Cevabınızı gibi ve bence doğru cevabı, ancak ne olursa olsun git gerçekte var olup olmadığı görmek bitti şey. Bu uyarıyı vermek için doğru zaman git zorunda kalırsa olduğunu hissetmek yapmak bir şey, o zaman bu iletisiyle başarısız gerekir. Önceden bu iletiyle yalnızca spam kullanıcıları değil. Git ile aşk / nefret ilişkime katkıda bulunan başka bir şey daha.
Jon V

6

git config pull.ff onlyveya eşdeğer git pull --ff-onlyolarak en güvenli olanıdır. Bunun nedeni, bir yeniden ödemenin geçmişin üzerine yazabilmesi ve başka bir geliştiricinin aynı şubeye zorla itmesi durumunda taahhütlerin kaybına neden olabilmesidir.

Ama hepsi geçerlidir.


3

Not: Daha önce, " git pull" ( adam ) ' a, kullanıcı geçmişlerin birleştirilmesi, yeniden verilmesi veya yalnızca hızlı ilerlemeyi kabul etmesi gerektiğini söylemediğinde, ancak pull.ffyapılandırma değişkenini ayarlayanlar için uyarı tetiklendiğinde uyarı vermeyi öğrettik .

Git 2.29 (Q4 2020) ile artık durum böyle değil (anlam: artık uyarı yok ).

Bkz. 54200ce (24 Eyl 2020) by Alex Henrie ( alexhenrie) .
(Göre Birleştirilmiş Junio Cı Hamano - gitster- içinde işlemek 299deea , 29 Eylül 2020)

pull: pull.ffayarlanmışsa uyarma

İmza: Alex Henrie

Ayarlamayı yeterince anlayan bir kullanıcının pull.ffek talimatlara ihtiyacı yoktur.

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.