Soru “Git çekme” otomatik olarak beklemede ve bekleyen değişiklikleri engelleyebilir mi?


Bunu nasıl çözeceğimi biliyorum:

user@host$ git pull
Updating 9386059..6e3ffde
error: Your local changes to the following files would be overwritten by merge:
    foo.bar
Please, commit your changes or stash them before you can merge.
Aborting

Ama izin vermenin bir yolu yok git pull yap stash ve pop benim için dans et?

Bu komutun farklı bir adı varsa, sorun değil.

İçin bir kabuk takma adı oluşturma git stash; git pull; git stash pop bir çözümdür, ancak daha iyi bir çözüm ararım.


76
2018-05-13 07:58


Menşei


Ne hakkında git takma? - Яois
Koşu git stash; git pull; git stash pop Programatik olarak tehlikeli, çünkü saklanacak bir şey yoksa, git stash no-op olacak, ama git stash pop son stash pop olacak (eğer varsa), kesinlikle değil Ne istiyorsunuz. Kullanıcı torkun Stack Overflow hakkında bu konuda harika bir gönderiye sahip, ancak bunu bulamıyorum ... - jubobs
@Jubobs bunu? stackoverflow.com/a/20412685/6309 Ya da bu? stackoverflow.com/a/20480591/6309 - VonC
@guettli Ben senin sorununun bir kopya olduğunu ima etmiyordum, sadece Jubobs'un yorumuna cevap veriyordum. - VonC
Bir adım ileride, işlem sadece çekilişten sonra temiz bir şekilde uygulanabiliyorsa başarılı olmalıdır. Çakışma varsa, tüm işlem atomik olarak başarısız olur, böylece ağaç değişmez. Yapmak istediğim şey şudur: ya yerel birleştirilenler ile değişiklikleri geri çekerim, ya da bir hatayla başarısız olurlar ve sonra ne yapacağımı bir sonraki karar vermeme izin verin. Bu tür bir 'işlem' mümkün mü? - Ed Avis


Cevaplar:


Git 2.6+ için (28 Eylül 2015'te yayınlanmıştır)

Tek git config ilgi çekici olan ayar:

rebase.autoStash

True olarak ayarlandığında, işlem başlamadan önce otomatik olarak geçici bir kayıt oluşturun ve işlem bittikten sonra uygulayın.
  Bu, rebase'i kirli bir çalışma masasında çalıştırabileceğiniz anlamına gelir.

Ancak, dikkatle kullanın: Başarılı bir rebase sonra nihai saklanma uygulaması önemsiz olmayan çatışmalara neden olabilir. Varsayılanlar yanlıştır.

ile birleştirin:

pull.rebase

Doğru olduğunda, "git çekme" çalıştırıldığında varsayılan şubeden varsayılan şubeyi birleştirmek yerine, getirilen dalın üstündeki dalları yeniden oluştur.

git config pull.rebase true
git config rebase.autoStash true

Bu basit bir şey için yeterli olurdu git pull kirli bir ağaçta bile çalışmak.
Bu durumda takma ad gerekli değildir.


Görmek taahhüt 53c76dc (04 Tem 2015) tarafından Kevin Daudt (Ikke).
(Birleştirilmiş Junio ​​C Hamano - gitster - içinde işlem e69b408, 17 Ağustos 2015) 

pull: ne zaman kirli ağaç izin rebase.autostash etkin

rebase, kirli bir iş ağacına rastladığında değişiklikleri saklamayı öğrendi,   fakat git pull --rebase değil.

Sadece çalışan ağacın kirli olduğunu doğrulayın. rebase.autostash değil   sağladı.


Not: eğer çekmek istiyorsanız olmadan autostash (olsa bile rebase.autoStash true set), git 2.9'dan beri var (Haziran 2016):

 pull --rebase --no-autostash

Görmek 450dd1d işlemek, işlemek 1662297, 44a59ff işlemek, taahhüt 5c82bcd, taahhüt 6ddc97c, eff960b işlemek, efa195d işlemek (02 Nisan 2016) ve f66398e işlemek, taahhüt c48d73b (21 Mar 2016) tarafından Mehul Jain (mehul2029).
(Birleştirilmiş Junio ​​C Hamano - gitster - içinde taahhüt 7c137bb, 13 Nisan 2016) 

F66398e'yi onaylayın özellikle içerir:

pull --rebase: eklemek --[no-]autostash bayrak

Eğer rebase.autoStash yapılandırma değişkeni ayarlanmışsa,   "için geçersiz kıl"git pull --rebase"komut satırından.

Öğret "git pull --rebase" --[no-]autostash komut satırı bayrağı hangi   geçerli değerini geçersiz kılar rebase.autoStasheğer ayarlanmışsa. Gibi "git rebase"   anlar --[no-]autostash seçenek, sadece geçme meselesi   Altta yatan seçenekgit rebase" ne zaman "git pull --rebase"denir.


Uyarı: Git 2.14'ten (Q3 2017) önce, "git pull --rebase --autostash"Yerel tarih, akış yukarı akışa hızlıca ulaştığında otomatik olarak saklanmadı.

Görmek işlemek f15e7cf (01 Haziran 2017) tarafından Tyler Brazier (tylerbrazier).
(Birleştirilmiş Junio ​​C Hamano - gitster - içinde 35898ea işlemek, 05 Haziran 2017) 

pull: ff --rebase --autostash kirli repoda çalışıyor

Ne zaman git pull --rebase --autostash kirli bir depoda bir sonuçlandı   hızlı ileri, hiçbir şey autostashed edildi ve çekme başarısız oldu.
  Bu, hızlı ilerleyebildiğimiz zaman, rebase çalıştırmaktan kaçınmak için bir kısaydı.   ancak o kod yolunda autostash yok sayılır.


Güncelleştirme: Mariusz Pawelski sorar yorumlarda ilginç bir soru:

Yani herkes hakkında yazıyor autostash rebase (ya da pull --rebase).

Ama normal çekiş yaptığınızda kimse otopsi yapmayı kabul etmiyor. birleştirmeleri.
  Yani bunun için otomatik bir geçiş yok mu? Yoksa bir şey mi özlüyorum? Yapmayı tercih ederim git pull --rebase ama OP sordu "standart"git çek

Cevap:

orijinal konu Bu otogreta özelliğini tartışırken, başlangıçta her ikisi için uygulandı git pull (birleştirme) ve git pull --rebase.

Ama ... Junio ​​C Hamano (Git bakıcısı) şunları kaydetti:

Eğer pull-merge "can sıkıntısını" uyandıracak bir şey vardı   Bu konuyu tetikleyen, tanım gereği, yerel değişim çakışması   Birleştirme ile ve bu iç "stash pop" yolları dokunacak   Birleşme dokundu ve muhtemelen "Bırakıldı" ile sonuçlanmayacak ama   çözümlenecek başka anlaşmazlıklar.

ondan şüphelendim pull.autostash Yapılandırma iyi bir ek değildir çünkü kötü, acı veren iş akışını teşvik eder.
  Basit vakalarda incinmeyebilir, ancak lokal değişiklikler karmaşık olduğunda, sahip olmamaktan aktif olarak zarar görecektir ve konfigürasyon, seçmek için teşviği desteklemektedir.

Denklem "rebase" olarak "çek-rebase" için biraz farklıdır.   temiz çalışan bir ağaçtan başlayacağınız konusunda ısrar ediyor;   sonra dur "rahatsızlık daha büyük hissediyor. Ben bir şüphe var ki   gevşemek, gerçek problem için daha verimli bir çözüm olabilir.

Yani, klasik bir çekme-birleştirme ile ilgili olarak, daha iyidir:

Kullanmadan önce çalışma ağacında sahip olduğu WIP'in doğasını düşünmeye teşvik etmekgit pull".
  Başkalarının yaptıklarına müdahale edebilecek çok karmaşık bir canavar mı yoksa   uzaklaşıp geri çekebileceği önemsiz bir değişiklik mi?

Birincisi, yapması çok daha iyi olacak "checkout -b", Tut   Yerel değişim biraz daha iyi bir şekle girene kadar çalışıyor ve   Orijinal şubeye çekilmeden önce "taahhüt".

Eğer ikincisiyse, yapması daha iyidir:

  • "git pull"
  • çatışmalar bulduktan sonra, koş      
    • git stash,
    • git merge FETCH_HEAD ve
    • git stash pop

111
2018-05-13 08:39



2.4.2 itibariyle, bu henüz uygulanmadı. Belki bir gün. rebase.autoStash sadece rebase kullanırken geçerlidir. pull.rebase sadece çekerken kullanılır. - Randal Schwartz
"Bu kirli bir ağaçta bile çalışmak için basit bir git çekme için yeterli olurdu." Randal'in söylediği gibi, bu henüz doğru değil. Mevcut ustanın pull.c hala seçer die_on_unclean_work_tree. - Pradhan
@Pradhan Katılıyorum. Uygulama bu sabah ustalaştı ve git 2.6 için olmalı. Bunu açıklığa kavuşturmak için cevabı düzenledim. - VonC
Otostash git ile çalıştığını onayladı 2.5.5. - Joshua Hoblitt
Böylece, herkes senin yaptığın zaman ototastaz hakkında yazıyor. rebase (veya pull --rebase). Ama normal yaptığınız zaman kimse otopsi yapmıyor pull birleştirir. Yani bunun için otomatik bir geçiş yok mu? Yoksa bir şey mi özlüyorum? Yapmayı tercih ederim git pull --rebase ama OP "standart" hakkında sordu git pull - Mariusz Pawelski


Yaklaşan kaşifler için birkaç saniye kaydetmek için, bir özet (@VonC'ye teşekkürler):

git pull --rebase --autostash

16
2017-08-12 06:27



Önemli olan: git config pull.rebase true ve git config rebase.autoStash true, ihtiyacın olan tek şey git pull. Sadece git pull. Başka seçenek gerektirmez. - VonC
Görünüşe göre en azından Git 2.9 için --autostash seçeneği. -c rebase.autoStash=true Git 2.6'da çalışıyor. - ntc2


Yukarıdaki yorumda belirtildiği gibi, iki yapılandırma değerinin ayarlanması şu anda çalışmıyor git pullOtotastas yapılandırması yalnızca gerçek rebas'lar için geçerli olduğu için. Bu git komutları ne istiyorsan onu yap:

git fetch
git rebase --autostash FETCH_HEAD

Veya takma ad olarak ayarlayın:

git config alias.pullr '!git fetch; git rebase --autostash FETCH_HEAD'

Sonra yap:

git pullr

Tabii ki, bu takma ad istenildiği gibi yeniden adlandırılabilir.


14
2017-07-22 22:56





Git 2.6+ ile aşağıdakileri kullanabilirsiniz:

alias gup='git -c rebase.autoStash=true pull --rebase'

Bu --rebase git-pull kullanımını yapar rebase yerine merge, bu yüzden ayarlar / seçenekler gibi --ff-only uygulanmayacak.

İle çekilecek bir takma ad kullanıyorum --ff-only varsayılan olarak (git pull --ff-only) ve sonra kullanabilir gup (ileriden) hızlı ileri birleştirme mümkün değilse veya saklanmış değişiklikler varsa.


5
2018-04-03 18:18





Daha önce de belirttiğiniz gibi, bunu yapmanın yolu. Yazarken ve kısayolunu kullanabilmeniz için bunu başka bir adda kullanabilirsiniz veya tek bir satırda kullanabilirsiniz (takma ad da olabilir)

git stash && git pull --rebase && git stash pop

Yaptığınız şey aynı şeyi yapacak, ancak tek bir satırda (&&) ve takma ad olarak ayarlanmış ve daha kısa olacak.

Aşağıdaki satırlar, çek / itmeden önce gelen / giden değişiklikleri gösterir.

git log ^master origin/master
git log master ^origin/master

1
2018-05-13 08:40



Bu yaklaşım güvensizdir: saklanacak hiçbir şey yoksa, ilk komut hiçbir şey yapmaz ve stash pop Daha önce bazı rastgele şeyler gösterecektir. - John Zwinck