Mevcut olmayan bir şubeye nasıl 'git çekilir'?


126

Dalda koştuğunuzda git pull, mastertipik olarak çeker origin/master. Aradım farklı dalda değilim newbranch, ama yapan bir komutu çalıştırmak için gereken git pulldan origin/masteriçine masterama koşamam git checkoutçekme işlemi tamamlandıktan sonra kadar seçilen dalı değiştirmek için. Bunu yapmanın bir yolu var mı?

Biraz arka plan vermek için, arşiv bir web sitesini depolar. newbranchWeb sitesini olarak değiştirerek bazı değişiklikler yaptım ve bunları dağıttım newbranch. Şimdi bu değişiklikler masterşubeye aktarıldı , web sitesini masterşubeye geri döndürmeye çalışıyorum . Bu noktada newbranchve origin/masteraynı, ancak mastergeride kalıyor origin/masterve güncellenmesi gerekiyor. Sorun şu ki, bunu geleneksel şekilde yaparsam:

$ git checkout master
   # Uh oh, production website has now reverted back to old version in master
$ git pull
   # Website is now up to date again

Yukarıdaki ( git checkout master && git pull) ile aynı şeyi başarmam gerekiyor , ancak işlem sırasında çalışma dizinini daha önceki bir revizyonla değiştirmeden.


@phi: İşe yarayacağını sanmıyorum çünkü ben varım newbranchve orada saklanacak bir şey yok!
Malvineous

Yeni bir dizine klonlardım, newbranch'ı master ile birleştirir, master'ı newbranch ile birleştirir, sonra gittiğiniz yerden çekerdim. Master ve newbranch aynı olacak.
aet

@aet Bunu şu anki dizininde kendi git fetch; git merge origin/masteriçinden yaparak yapabilirdi newbranch. Deponun ikinci bir kopyasının tamamını klonlamanın hiçbir faydası yoktur.
meagar


Yanıtlar:


5

Dokunmak istemediğiniz bir çalışma ağacınız var, bu yüzden başka bir tane kullanın. Klon ucuzdur, bunun için yapılmıştır.

git fetch origin master       # nice linear tree
git clone . ../wip -b master  # wip's `origin/master` is my `master`
cd ../wip                     # .
git pull origin origin/master # merge origin's origin/master
git push origin master        # job's done, turn it in.
cd ../main
rm -rf ../wip                 # wip was pushed here, wip's done

git checkout master           # payload

Buradaki diğer tüm cevaplarla ilgili sorun, aslında çekişi yapmamalarıdır. Çekme kurulumunuz olan birleştirme veya yeniden ödemeye ihtiyacınız varsa, başka bir çalışma ağacına ve yukarıdaki prosedüre ihtiyacınız vardır. Aksi takdirde iş görür git fetch; git checkout -B master origin/master.


2
Eğer çalıştırdığınızda git checkout mastereski ödeme edeceğiz masterEğer yapmadıysanız çünkü dalı git pulliçinde mainkökeni / usta senkronize etmek klasöründe. Kaçınmaya çalıştığım şey bu.
Malvineous

Klon tarafından yapılan kullanıma alma işlemi eski yöneticiye aittir, ancak bu kullanıma alma, web sunucusunun bakmadığı bir dizine yerleştirilir. Sondaki ana ödeme, wip'den geri itilen tamamen birleştirilmiş ana öğeye aittir.
jthill

6. satırda birleştirilmiş (güncellenmiş) i mastergeri gönderiyorsunuz origin, ancak son ödemenizin bu güncellenmiş olduğuna inanmıyorum master. Dizinde şubeyi git pullgüncellemeye gerek yok , bu yüzden bir şeyi kaçırmadığım sürece, komutlarınızın sadece kendi başına çalışmaktan ve eski ağacı almaktan farkı yoktur . Yakından bakarsanız, dizinde yukarı mastermaingit checkout mastermastermain
akışla

bunu bir test deposunda deneyebilir veya push dokümanlarını kontrol edebilirsiniz.
jthill

1
@jwg neye kıyasla lütfen? OP'nin belirtilen tüm ihtiyaçlarını karşıladığınızdan emin olun.
jthill

163

Basit: Uzak bir şubeden şu anda teslim alınmamış bir şube yöneticisine güncelleme :

git fetch origin master:master

nerede orijin sizin uzaktan kumandanızdır ve şu anda bazı şubelerde kontrolünüz vardır, örneğin dev .

Belirtilen şubeye ek olarak mevcut şubenizi tek seferde güncellemek istiyorsanız:

git pull origin master:master

4
Hm, öyle görünüyor ki her zaman işe yaramıyor; Devam Eden Çalışma şubemle birleşmem istendi.
underscore_d

@underscore_d benim için aynı.
Greg

1
O birleştirmek ister eğer o zaman kökenli taahhüt edilmez güncelleştirilmesi olduğunu senin branşında değişiklikler vardır hayal ... benim için çalıştı
Yağsız

2
Bunun nasıl çalışması gerekiyor? Benim için çalışmıyor, sadece orijini / master'ı şu anda teslim aldığım şubemle birleştirmeye çalışıyor.
mhogerheijde

3
Bu, master'ı mevcut şubeye çeker. Bu kesinlikle istenen şey DEĞİL. Çekme seçeneğini değiştirirseniz, tam olarak istenen bu olacaktır.
Jeff Wolski

90

Bu sorunun cevabı burada: Satın alma işlemlerini kullanmadan Git dallarını birleştirin, güncelleyin ve çekin

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

2
Kesin olmayan yerel değişikliklerle çalıştığı için bu en iyisidir.
Tomasz Gandor

2
Sadece en son değişiklikleri yakalamak istiyorsanız, yaparsınız git fetch origin master:master. git fetchkendi başına başka bir şubeyi değil, mevcut şubeyi güncellemek istediğinizi varsayacaktır.
John Leidegren

2
Bu en basit ve en doğrudan cevaptır. Bu kabul edilen cevap IMO olmalıdır.
Keego

@JohnLeidegren - her zaman amaçlandığı gibi çalışmaması dışında. Stackoverflow.com/a/42902058/274579 yanıtına ilişkin yorumlara bakın .
ysap

22

Görünüşe göre cevap aldatıcı bir şekilde basit:

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

Bu güncellemesini sağlayan masterdek kendisine geçmeden dalı sonra o güncellendi.


11
Bu, nasıl yapılacağını sorduğun şeyi yapmaz.
jthill

Yukarıdaki yorumun dediği gibi, sorduğunuz soru gerçekten cevaplamış olduğunuz soru değil. Sorunuzu, daha az spesifik olarak, kontrol etmeden bir şubeyle birleştirmekle ve daha çok, önce eski sürüme bakmadan, uzaktan kumandadaki bir şubenin en yeni sürümüne doğrudan geçmekle ilgili olacak şekilde güncellemelisiniz.
meagar

1
Buraya aradığım cevap kesinlikle
Sophistifunk

1
OP'nin istediği değil, dürüst olmak gerekirse bana yardım etti.
Marcel Bro

1
@anoniim, OP'nin istediği değil mi? Bu soruyu yanıtlayan OP'yi mi kastediyorsunuz?
smac89

12

Git işlemleri atomik olmadığından, düzeltilemeyen bir şey için endişeleniyorsunuz. Ana dizini önce ona geçmeden güncelleseniz bile , çalışma dizininizin dallar arasında yarı yolda olduğu bir delik her zaman olacaktır . Bu nedenle Git bir dağıtım aracı değildir .

Üretim ortamınızda gerçekten kod işlemediğiniz için (umarım), aslında bir şubeyi kontrol ettirmenize gerek yoktur . git fetchUzak referanslarınızı güncellemek için basitçe bir yapabilirsiniz ve ardından git checkout origin/masterçalışma dizinini doğrudan şu anda işaret edilen yürütmeye taşıyabilirsiniz origin/master. Bu sizi bağımsız bir kafa durumuna sokar, ancak yine kod işlemediğiniz için bu önemli değil.

Bu alacağınız en küçük delik, ama dediğim gibi, hala bir delik var; checkoutatomik değildir.


Git'i dağıtım için kullanmanın sınırlamalarını anlıyorum, sorun şu ki bu durumda delik bir saniyeden kısa değil dakikalarca olacak. Kontrol etmekle ilgili güzel bir fikir origin/master, bu sadece hile yapabilir.
Malvineous

Deliği "dakikaları" uzatan nedir? Verileri ağ üzerinden mi çekiyorsunuz? git fetchBaşka bir şey yapmadan önce bir şey yapın ve gerçek veri aktarımını ortadan kaldırın.
meagar

Dakikalar uzunluğundadır, çünkü (şimdi) izlenmeyen bir dosyanın üzerine daha önceki bir kaydetme tarafından yazılır. Yani dosyayı kopyalayıp, git işlerini yapmalı ve sonra geri koymalıyım. 'Dakikalar' yazma hızımdan geliyor. (Evet, komut dosyasını
yazabilirdim

3

Bunun için güncelleme ref kullanabilirsiniz:

git fetch
git update-ref refs/heads/master origin/master
git checkout master

Bunun ana şubedeki tüm yerel taahhütleri atacağını unutmayın. Senin durumunda hiç olmayacak, bu yüzden sorun değil. Yerel taahhütlerin olduğu yerde bunu yapmaya çalışan diğer insanlar için bunun mümkün olduğunu sanmıyorum, çünkü birleştirme yalnızca mevcut şubede çalıştırılabilir.


Bu eşdeğer olur git branch --force master origin/mastermu? Bu, yerel başkanı s kafasını mastergöstermeye zorlaroriginmaster
Keego

2

Malvineous'un çözümü benim için çalışıyor

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

Sadece hatayı ver


warning: not deleting branch 'master' that is not yet merged to
         'refs/remotes/origin/master', even though it is merged to HEAD.
error: The branch 'master' is not fully merged.
If you are sure you want to delete it, run 'git branch -D master'.

Bu yüzden -D seçeneği ile çalışıyorum

Teşekkürler


0

git fetch origin master:master

  • "Çeker" (aslında çeker) master.
  • masterHenüz itilmemiş değişiklikleriniz varsa origin/master, ustanızla birleştirilir.
  • Birleştirme çatışmaları varsa, önce bunları çözmeniz gerekir.
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.