Git'in her zaman belirli bir daldan çekilmesini nasıl sağlıyorsunuz?


485

Ben git ustası değilim, ama bir süredir birkaç farklı projeyle çalışıyorum. Her projede, her zaman git clone [repository]ve bu noktadan sonra, git pullelbette olağanüstü değişikliklere sahip olmadığım sürece her zaman yapabilirim .

Son zamanlarda, önceki bir şubeye geri dönmek zorunda kaldım ve bunu yaptım git checkout 4f82a29. Tekrar çekmeye hazır olduğumda, şubemi ustaya geri koymak zorunda olduğumu fark ettim. Şimdi, bir düz kullanarak çekemiyorum git pullama bunun yerine, git pull origin mastersinir bozucu olduğunu belirtmek zorundayım ve bana neler olduğunu tam olarak anlamadığımı gösteriyor.

git pullOrijin ustası belirtmeden bir düz yapmama izin vermeyen ve neyi nasıl değiştireceğim?

GÜNCELLEME:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "origin"]
    url = git@github.com:user/project.git
    fetch = refs/heads/*:refs/remotes/origin/*

GÜNCELLEME 2: Açıkça söylemek gerekirse, orijinal yöntemimin yanlış olabileceğini anlıyorum, ancak git pulltekrar kullanabilmem için bu repoyu düzeltmem gerekiyor . Şu anda git pull sonuçları:

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

git pullHangi dalın birleştirileceğini söyleyebilirim ve doğru çalışıyor, ancak git pullilk önce olduğu gibi çalışmıyor git checkout.


.Git / config nasıl görünüyor? Bu taahhüdü kontrol ettikten sonra ne yaptınız?
Ryan Graham

4f82a29 ile ilgili taahhütte bulundunuz mu?
Pat Notz

Pat, üstünde herhangi bir taahhütte bulunmadım. Bu bir sunucuda ve yarattığımız bir hatayı gizlemek için kararlı bir sürüme geri dönmemiz gerekiyordu. Bu sistem geliştirme amaçlı değildir, bu yüzden sadece geri almak, hatayı giderirken beklemek ve daha sonra kafa versiyonuna geri dönmek istedim.
David Smith

2
Ryan, .git / config'i içerecek şekilde güncelledim. Ödeme yapıldıktan sonra hiçbir şey yapmadım. Bu bilgisayar bir sunucu, geliştirme amaçlı değil.
David Smith

Yanıtlar:


730

Altında [branch "master"], deponun Git yapılandırma dosyasına ( .git/config) şunu eklemeyi deneyin :

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

Bu Git 2'ye şunu söyler:

  1. Ana dalda olduğunuzda, varsayılan uzaktan kumanda başlangıç ​​noktasıdır.
  2. Kullanırken git pullhiçbir uzak ve şube belirtilen ile ana dal üzerinde, uzaktan usta daldan değişiklikler varsayılan uzak (orijin) ve birleştirme kullanın.

Bu kurulumun neden yapılandırmanızdan kaldırılacağından emin değilim. Başkalarının da yayınladığı önerileri izlemeniz gerekebilir, ancak bu işe yarayabilir (veya en azından yardımcı olabilir).

Yapılandırma dosyasını elle düzenlemek istemiyorsanız, bunun yerine komut satırı aracını kullanabilirsiniz:

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

2
Bu benim için de işe yaradı, github'dan bir proje kontrol ettim. OS X 10.4
Sam Barnum'u

Teşekkür ederim çok , bu bir "sunucu" depo ve (ı aksaklık önce hiçbir sorunları ile sık sık itme / çekme için kullanılır) iki bilgisayar ile tek geliştirici proje üzerinde başıma neden bilmiyorum, ama düzeltme çalıştı - çok ince!
chesterbr

1
Under [branch "master"] ile ne demek istiyorsun
ianj

3
@ianj: Git yapılandırma dosyasında (repo kökünden .git/config).
mipadi

1
@ianj: Komut satırından her zaman bunu yapabilirsiniz $ git config branch.master.remote origin ; git config branch.master.merge refs/heads/master.
mipadi

139

İsterseniz, bu seçenekleri commmand satırından (config dosyasını düzenlemek yerine) şu şekilde ayarlayabilirsiniz:

  $ git config branch.master.remote origin
  $ git config branch.master.merge refs/heads/master

Ya da benden hoşlanıyorsanız ve ileride üzerinde çalışabileceğiniz projeler de dahil olmak üzere tüm projelerinizde bunun varsayılan olmasını istiyorsanız, onu global bir yapılandırma ayarı olarak ekleyin:

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master

12
"Refs / heads / master" sihirli kelimesini bilmek için +1. Ben değişkeni ayarlamak için nasıl bulmaktan hiçbir sorun vardı, ama bunu ayarlamak için hakkında hiçbir ipucu yoktu için ve adam sayfaları pek yardımcı değildi. Bu cevabı bulduktan sonra sonunda dokümanlardaki doğru yeri buldum. Meraklı için: sihirli kelime .gitgit'in masters karma kodunu geçerli taahhüdünde tuttuğu bir dosya yolunu ifade eder .
mokus

84
git branch --set-upstream master origin/master

Bu, configdosyanıza aşağıdaki bilgileri ekleyecektir :

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

Eğer varsa branch.autosetuprebase = alwayso da ekleyecektir:

    rebase = true

1
Bunu git gibi sorulan gibi davranmanın en kolay yolunu buluyorum, özellikle daha fazla şube varsa, sadece uzak değil (bunu her şube için yapmak zorunda olsanız bile, şube başına bir kez)
s3v3n 21'de

2
Sadece denedim ve geçerli bir uzaktan kumanda fatal: Not a valid object name: 'origin/master'.olmasına rağmen hatayı alıyorum originve masterher iki depoda da her zamanki gibi var.
Ken Williams

2
Ken, uzak dal adlarını almak için önce "git fetch origin" yapmanız gerekiyor.
Eric Lee

14
Newer git kullanmanızı istiyor git branch --set-upstream-to=origin/master master.
orbeckst

52

Mipadi ve Casey'nin cevaplarında olduğu gibi tam git configveya git branchargümanları hatırlamakta zorlanıyorum , bu yüzden yukarı doğru referans eklemek için bu 2 komutları kullanıyorum:

git pull origin master
git push -u origin master

Bu aynı bilgiyi .git / config dosyasına ekleyecektir, ancak hatırlamayı daha kolay buluyorum.


1
Katılıyorum. Bu en basit cevap olmalı.
linbianxiaocao

2
Yanıtınız neden işe yaradığını içermeli ve dokümanlardaki nedenini açıklayan bölüme başvurmalıdır.
vfclists

24

Git pull , iki eylemi birleştirir - izlenen dallardaki uzak depodan yeni taahhütler alır ve ardından bunları geçerli dalınızla birleştirir.

Belirli bir taahhüdü kontrol ettiğinizde, mevcut bir şubeniz yoktur, yalnızca HEAD'ın son yaptığınız taahhüdü işaret eder. Yani git pulltüm parametreleri belirtilmemiş. Bu yüzden işe yaramadı.

Güncellenen bilgilerinize dayanarak, yapmaya çalıştığınız şey uzak deponuzu geri almaktır. Hatayı getiren taahhüdü biliyorsanız, bununla başa çıkmanın en kolay yolu git revert, belirtilen buggy taahhüdünü geri alan yeni bir taahhüdün kaydedilmesidir:

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git push

Değiştirmek istediğiniz sunucunuz olduğundan, buggy taahhüdünü gizlemek için geçmişi yeniden yazmanıza gerek olmadığını varsayacağım.

Hata bir birleştirme işleminde tanıtıldıysa, bu yordam çalışmaz. Bkz . Hatalı birleştirme nasıl geri alınır .


Burada bana müthiş bir eğitim veriyorsunuz, bunu takdir ediyorum, ama durumumu çok iyi tanımlamıyor olabilirim, bu yüzden bu benim iş akışımla tam olarak uyuşmuyor. Bunu ele almak için muhtemelen başka bir soru göndereceğim. Yine de teşekkürler, Paul! Sana +1, efendim.
David Smith

Durumunu yanlış okudum. İhtiyacınız olan cevabı aldığınız için mutluyum.
Paul

12

Git'i yapılandırmanın bir yolu da vardır, bu nedenle her zaman eşdeğer uzak dalı, şu anda çalışma kopyasına teslim alınan şubeye çeker ve iter. Buna git hazır varsayılan olarak ayar yapılmasını öneren bir izleme dalı denir .

Mevcut çalışma dizininin üzerindeki bir sonraki depo için:

git config branch.autosetupmerge true

Başka şekilde yapılandırılmamış tüm Git depoları için:

git config --global branch.autosetupmerge true

Biraz sihir, IMHO ama bu, belirli dalın her zaman geçerli dal olduğu durumlarda yardımcı olabilir .

Bir şubeyi ilk kez branch.autosetupmergeayarlayıp teslim aldığınızda true, Git ilgili uzak dalı izlemekten bahseder:

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

Git otomatik olarak ilgili şubeye otomatik olarak aktarılacaktır:

(gh-pages)$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages

10

Git yapılandırma dosyasını düzenlemek istemiyorum @ mipadi'nin gönderisindeki bilgileri takip ettim ve kullandım:

$ git pull origin master

13
Mesele bunu belirtmek yerine otomatik olarak yapmaktı.
Eric

4

Bunu nasıl ustalaştıracağına dair hemen sorunuz, söylediklerini yapmanız gerekir. Şube yapılandırmanızdan alınacak refspec değerini belirtin.

[branch "master"]
    merge = refs/heads/master

"Refs / heads / master" olmamalı mı? Git-pull (1) 'e göre, bu, uzak sitedeki varsayılan olarak birleştirilen dalın adıdır.
Adam Monsen

Evet, haklısın. Örneğimi aldığım repo özel bir durum. Düzeltildi.
Ryan Graham

0

Sadece bazı bilgileri eklemek istedik, bu bilgiyi git pullotomatik olarak herhangi bir şubeye atıfta bulunup bulunmadığını kontrol edebiliriz .

Komutunu çalıştırırsanız git remote show origin,, (uzaktan kumandanın kısa adı olarak orijin olduğu varsayılarak) git, varsayılan referans olsun git pullya da olmasın bu bilgiyi gösterir .

Aşağıda örnek bir çıktı bulunmaktadır. (Git belgelerinden alınmıştır).

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Lütfen gösterilen kısmı, Git pull için yapılandırılmış yerel şubeye dikkat edin.

Bu durumda, git pullsevk edecektirgit pull origin master

Başlangıçta, depoyu klonladıysanız, git klonunu kullanarak, bunlar otomatik olarak halledilir. Ancak git remote add özelliğini kullanarak manuel olarak bir uzaktan kumanda eklediyseniz, bunlar git config öğesinde eksiktir. Bu durumda, "git pull 'için yapılandırılmış yerel şube:" ifadesinin gösterildiği kısım, çıktısında eksik olur git remote show origin.

Herhangi bir yapılandırma yoksa git pull, izlenmesi gereken sonraki adımlar , diğer cevaplar tarafından zaten açıklanmıştır.

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.