Neden düzeltmek için git branch --unset-upstream'i çağırmalıyım?


161

Git'te ileri operasyonlar söz konusu olduğunda daha acemi biriyim. Benim korumak blog blogging çerçevesini kullanarak Octopress . Octopress 2011 yılından bu yana herhangi bir gelişme göstermese de amacım iyi hizmet ediyor ve bu yüzden şu ana kadar hiçbir şeyi değiştirmeyi düşünmedim.

FYI, blogum Github Pages'da barındırılıyor.

Bugün, yeni bir yazı üzerinde çalışırken git status, aşağıdaki mesajı gösterdi:

On branch source
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

Aynı mesaj git add ., git commit -m 'message've gibi sonraki tüm komutlar için tekrarlanır git push origin source.

  • Mesaj ne anlama geliyor?
  • Bir şey kırık mı?
  • Evet ise, ne?
  • Düzeltmem gerekiyor mu?

Mümkünse, lütfen beni bu konuyu okuyabileceğim ve gelecekte anlayabileceğim bir pdf / web makalesine yönlendirin.

Daha fazla detay:

bash-3.2$ git branch -a
* source
  remotes/octopress/2.1
  remotes/octopress/HEAD -> octopress/master
  remotes/octopress/gh-pages
  remotes/octopress/linklog
  remotes/octopress/master
  remotes/octopress/refactor_with_tests
  remotes/octopress/rubygemcli
  remotes/octopress/site
  remotes/origin/source

Daha fazla bilgi gerekip gerekmediğini lütfen bana bildirin. Teşekkürler.

Yanıtlar:


197

TL; DR sürümü: uzaktan izleme dalı origin/mastermevcuttu, ancak şimdi yok, bu nedenle yerel şube sourcevar olmayan bir şeyi izliyor, bu da en iyi şüpheli - yani farklı bir Git özelliği sizin için hiçbir şey yapamıyor - ve Git sizi uyarıyor. "Yukarı akış izleme" özelliğinin amaçlandığı gibi çalışmasına gerek kalmadan iyi geçiniyorsunuz, bu nedenle herhangi bir şeyi değiştirip değiştirmemek size kalmış.

Yukarı akış ayarlarında başka bir alma için, bkz. Neden "git push --set-upstream orijin <branch>"?


Bu uyarı Git'te yeni bir şeydir, ilk önce Git 1.8.5'te görünür. Sürüm notları hakkında sadece bir kısa madde işareti içerir:

  • "git branch -v -v" (ve "git status"), başka bir dalı temel almayan bir dal, yukarı akış dalıyla eşitlenen bir dal ve yukarı akışla yapılandırılmış bir dal arasında ayrım yapmadı artık var olmayan şube.

Bunun ne anlama geldiğini açıklamak için, önce "uzaktan kumandalar", "uzaktan izleme dalları" ve Git'in "yukarı akış takibini" nasıl ele aldığını bilmeniz gerekir. ( Uzaktan izleme dalları çok kusurlu bir terimdir - Bunun yerine uzaktan izleme adlarını kullanmaya başladım , bu da hafif bir gelişme olduğunu düşünüyorum.Ama aşağıda Git belgelerine tutarlılık için "uzaktan izleme dalı" kullanacağım. )

Her "uzak" kelimesi, bu durumda olduğu gibi originveya böyle bir addır octopress. Amaçları, sizin git fetchveya git pullgüncellediğiniz yerlerin tam URL'si gibi şeyleri kaydetmektir . 1'i kullandığınızda Git bu uzaktan kumandaya gider (kaydedilen URL'yi kullanarak) ve uygun güncelleme kümesini getirir. Ayrıca "uzaktan izleme dalları" kullanarak güncellemeleri kaydeder .git fetch remote,

Bir "uzaktan izleme kolu" (veya uzaktan izleme adı), bazı "uzak" cihazlarda son görüldüğü gibi bir şube adının kaydedilmesidir. Her uzaktan kumandanın kendisi bir Git deposudur, bu nedenle şubeleri vardır. Uzak "köken" üzerindeki şubeler altında yerel deponuza kaydedilir remotes/origin/. Eğer gösterdi metin orada adında bir dal olduğunu söylüyor sourceüzerinde originve dallar adında 2.1, linklogvb üzerinde octopress.

("Normal" veya "yerel" bir şube, elbette, yalnızca kendi deponuzda oluşturduğunuz bir şube adıdır.)

Son olarak, bir "uzaktan izleme dalını" "izlemek" için bir (yerel) dal ayarlayabilirsiniz. Yerel şube Luzaktan izleme kolunu izlemek üzere ayarlandığında R, Git R"yukarı akış" olarak adlandırılır ve yukarı akışta "ilerliyor" ve / veya "arkasında" olup olmadığınızı (taahhütler açısından) söyler. Bu var Normal (hatta tavsiye-muktedir) yerel şube ve (uzaktan önek kısmı hariç) aynı adı kullanmak dalları uzaktan izleme, benzerleri için sourceve origin/sourceaslında gerekli değil ama.

Ve bu durumda, bu gerçekleşmiyor. sourceUzaktan izleme kolunu izleyen yerel bir kolunuz var origin/master.

Git'in uzak bir şubeyi izlemek için nasıl yerel bir şube oluşturduğunun tam mekaniklerini bilmeniz gerekmiyor , ancak bunlar aşağıda alakalı, bu yüzden bunun nasıl çalıştığını göstereceğim. Yerel şube adınızla başlıyoruz source. Bu adı kullanan iki yapılandırma girişi vardır, yazılmıştır branch.source.remoteve branch.source.merge. Gösterdiğiniz çıktıdan, bunların her ikisinin de ayarlandığı açıktır, böylece verilen komutları çalıştırırsanız aşağıdakileri görürsünüz:

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

Bunları bir araya getiren 2 , Git'e şubenizin source"uzaktan izleme şubenizi" izlediğini söyler origin/master.

Ancak şimdi git branch -adeponuzdaki tüm yerel ve uzaktan izleme şube adlarını gösteren çıktısına bakın . Uzaktan izleme adları remotes/... altında listelenir ve yokturremotes/origin/master . Muhtemelen bir zamanlar vardı, ama şimdi gitti.

Git, izleme bilgilerini kaldırabileceğinizi söylüyor --unset-upstream. Bu, hem dışarı temizler branch.source.originve branch.source.merge, ve uyarıyı durdurun.

İstediğin olsa da, olduğunu oldukça muhtemel görünüyor geçiş izlemeden gelen origin/masterbaşka bir şey izlemeye,: Muhtemelen origin/source, ama belki biri octopress/isimlerin.

Sen ile yapabilirsiniz git branch --set-upstream-to, 3 ör:

$ git branch --set-upstream-to=origin/source

(hala "kaynak" dalında olduğunuzu ve bu origin/sourceistediğiniz akış yukarı olduğunu varsayarsak - hangisinin, eğer varsa, gerçekten istediğinizi söylemem mümkün değil).

(Ayrıca bkz. Mevcut bir Git şubesini uzak bir şubeyi nasıl izlersiniz? )

Sanırım buraya gelme şekliniz, ilk yaptığınız zaman git clone, klonladığınız şeyin bir dalı olduğudur master. Ayrıca masterizlemek için ayarlanmış bir dalınız vardı origin/master(bu git için normal, standart bir kurulumdur). Bu olduğu anlamına geliyordu branch.master.remoteve branch.master.mergeset için originve refs/heads/master. Ama sonra originuzaktan kumandanız adını olarak masterdeğiştirdi source. Eşleştirmek için yerel adınızı olarak masterolarak değiştirdiğinize inanıyorum source. Bu değişti isimleri dışında, ayarlarınızı branch.master.remoteiçin branch.source.remoteve gelen branch.master.mergeetmek branch.source.merge... ama eski sol değerleri böylece, branch.source.mergeşimdi yanlıştı.

Bu noktada "yukarı akış" bağlantısı koptu, ancak 1.8.5'ten daha eski Git sürümlerinde Git, kırık ayarı hiç fark etmedi. Şimdi 1.8.5'iniz olduğuna göre, bunu gösteriyor.


Bu, soruların çoğunu kapsar, ancak "düzeltmem gerekiyor mu?" Muhtemelen yıllardır kırılganlık etrafında çalışıyorsunuz (ör .). Bunu yapmaya devam ederseniz, sorun üzerinde çalışmaya devam edecektir - bu yüzden hayır, düzeltmenize gerek yoktur . İsterseniz kullanabilirsiniz yukarı kaldırıp şikayetleri durdurmak ve yerel şube sahip değil sahip olarak işaretlenmiş herhangi hiç kaynak tarafı.git pull remote branchgit pull origin source--unset-upstreamsource

Bir yukarı akışa sahip olmanın amacı, çeşitli işlemleri daha kolay hale getirmektir. Örneğin, git fetchardından git mergeyukarı doğru ayarlanmış olup olmadığını genellikle "doğru olanı yapmak" olacak ve git statussonra git fetchsenin Repo o şube için, memba birini eşleşip söyleyecektir.

Kolaylığı istiyorsanız, yukarı akışı yeniden ayarlayın.


1git pull kullanır git fetchve Git 1.8.4'ten itibaren bu (son olarak!) "Uzaktan izleme dalı" bilgilerini de günceller. Git'in eski sürümlerinde, güncelleştirmeler git pullyalnızca ile uzaktan izleme dallarına kaydedilmedi git fetch. Git'inizin en az 1.8.5 sürümü olması gerektiğinden, bu sizin için bir sorun değildir.

2 Peki, bu artı altında bulunan kasıtlı olarak göz ardı ettiğim bir yapılandırma satırı remote.origin.fetch. Git, uzak dalın tam yerel adının olduğunu anlamak için "birleştirme" adını eşlemelidir refs/remotes/origin/master. Haritalama neredeyse her zaman böyle çalışır, bu yüzden masterdevam etmesi öngörülebilir origin/master.

3 Veya, ile git config. Eğer yukarı akış değiştirmek zorunda origin/sourceolan tek kısma ayarlamak istiyorsanız branch.source.merge, ve git config branch.source.merge refs/heads/source bunu yapardı. Ancak bunu kendiniz yapmaktan ziyade ne yapmak istediğinizi --set-upstream-tosöylüyor , bu yüzden "daha iyi bir yol".


3
+1 "İsterseniz - yerel kümenin yukarı akış yok olarak işaretlenmesi için --unset-upstream öğesini kullanabilirsiniz ."
BeatriceThalo

157

torek'in cevabı muhtemelen mükemmel, ancak kaydın sadece orijinal soruda açıklanandan farklı bir durumdan bahsetmesini istedim, ancak aynı hata görünebilir (benzer sorunlu diğerlerine yardımcı olabilir):

git init --bareSunucularımdan birini kullanarak boş (yeni) bir repo oluşturdum . Sonra git clonebilgisayarımdaki yerel bir çalışma alanına d var .

Yerel repoda tek bir sürüm yaptıktan sonra aradıktan sonra bu hatayı aldım git status.

Torek'in cevabından sonra, olanların yerel çalışma dizini repo'sundaki ilk taahhüdün "usta" dal oluşturduğunu anlıyorum. Ancak uzak repoda (sunucuda) hiçbir şey yoktu, bu yüzden bir "ana" (uzaktan kumanda / orijin / ana) dalı bile yoktu.

Çalıştırdıktan sonra git push origin masteryerel repo uzak repo nihayet bir ana dalı vardı. Bu, hatanın görünmesini durdurdu.

Sonuç olarak, "master" dahil olmak üzere hiçbir şubesi olmadığı için sıfır taahhütlü yeni bir uzaktan repo için böyle bir hata alabilirsiniz.


6
Bu şu anda bu hata mesajı için nr 1 sonucudur On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup)ve öznel olsa da, burada alternatif bir cevaba sahip olacak kadar büyük bir boş deponun klonlanmasından kaynaklanması daha olasıdır.
Bella

2
Bu yüzden boş bir dosya olsa bile yeni deponuzu README.md dosyasıyla başlatmak her zaman iyi bir fikirdir
Ahmed Hussein

8

Bu sorununuzu çözebilir.

değişiklikler yaptıktan sonra taahhütte bulunabilirsiniz ve sonra

git remote add origin https://(address of your repo) it can be https or ssh
then
git push -u origin master

umarım sizin için çalışır.

Teşekkürler


1
Bu gerçekten yardımcı olacaktır - neden cevabımda detaylandırılmıştır (Kısacası - bu uzak repoda eksik ana dalı yaratır).
ElazarR

7

Benim .git/refs/origin/masteriçin yozlaşmıştı.

Sorunu benim için gideren aşağıdakileri yaptım.

rm .git/refs/remotes/origin/master
git fetch
git branch --set-upstream-to=origin/master

0

Aslında torek, araçları nasıl yapabileceğimi çok daha iyi nasıl kullanacağını anlattı. Bununla birlikte, bu durumda http://octopress.org/docs/deploying/github/ adresindeki yönergeleri uygularsanız tuhaf bir şeye işaret etmek önemli olduğunu düşünüyorum . Yani, kurulumunuzda birden fazla github deposuna sahip olacaksınız . Her şeyden önce web siteniz için tüm kaynak koduna sahip olanı dizin $WEBSITEve daha sonra sadece statik olarak üretilen dosyaların bulunduğu dizin $WEBSITE/_deploy. Kurulumun komik olanı .gitignore, $WEBSITEdizinde bir dosya bulunması ve bu kurulumun gerçekten çalışmasıdır.

Yeterli tanıtım. Bu durumda hata, içindeki depodan da gelebilir _deploy.

cd _deploy

git branch -a
* master
remotes/origin/master
remotes/origin/source

İçinde .git/confignormalde böyle bir şey bulmanız gerekecek:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

Ancak sizin durumunuzda şube yöneticisinin uzaktan kumandası yoktur.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*

Hangi ile çözebilirsiniz:

cd _deploy
git branch --set-upstream-to=origin/master

Yani, her şey torek size söylediği gibi, ama bu çok iyi _deployweb sitenizin kök yerine dizini endişe olabilir işaret etmek önemli olabilir .

Not: Gelecekte bu şey tarafından ısırılmayacak zshbir giteklenti gibi bir kabuk kullanmaya değer olabilir . Hemen _deployfarklı bir havuzla ilgili olduğunu gösterecektir .


0

Bu soruyu iki kez sordum ve her zaman yerel şubemdeki git önbellek dosyasının bozulmasından kaynaklandı. Bu dosyaya eksik sağlama karmasını yazarak düzelttim. Ben sunucudan doğru taahhüt hash aldım ve yerel olarak aşağıdaki komutu koştu:

cat .git/refs/remotes/origin/feature/mybranch \
echo 1edf9668426de67ab764af138a98342787dc87fe \
>> .git/refs/remotes/origin/feature/mybranch

0

Sorun: Şubeniz 'orijin / master'a dayanıyor, ancak yukarı akış gitti.

Çözüm: Git Branch - Set upstream


3
Stackoverflow'a hoş geldiniz. Soru, hatanın nasıl düzeltilebileceği ile ilgili değil, bu hatanın neden ortaya çıktığını ve bu konuda bir şey yapması gerekip gerekmediğini bilmek istiyor. Lütfen cevabınızda bunu ele alın.
cronoik

0

aşağıdaki komutu uygulayarak yerel şubenizi silin

git branch -d branch_name

sende yapabilirsin

git branch -D branch_name 

temel olarak bir silme işlemini zorlar (yerel kaynakla birleştirilmemiş olsa bile)

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.