Neden açıkça yeni bir şube açmam gerekiyor?


180

Ben yeniyim gitve pratik yapıyorum. Yerel bir şube oluşturdum ama yaptığım zaman git pushşubemin depoya yüklenmediğini gördüm . Aslında yapmak zorunda: git push -u origin --all.
Bu neden? Bir şube varsayılan olarak aktarılacak yeni bir değişiklik değil mi? Neden ikinci komutu çalıştırmam gerekiyor?


15
Bunun yapılandırılabilir olduğuna dikkat edin (ayar push.default, bkz. man git-config). Bunu yaparsanız git config --add push.default current, git pushgerekirse dalı otomatik olarak uzak depoda oluşturur. Bunun neden varsayılan olmadığı cevaplarda açıklanmaktadır.
sleske

@sleske katılıyorum. Diğer politikalar ' current' ve ' upstream' için eski cevabım stackoverflow.com/a/13751847/6309 adresine bakın .
VonC

Neden bir cevabı kabul etmiyorsun?
laike9m

Yanıtlar:


225

Asıl sebep, yeni bir repoda (git init) şube olmamasıdır (hayır master, hiç şube yok, sıfır şube)

Dolayısıyla, ilk kez boş bir yukarı akış repo (genellikle çıplak bir repo) için bastırırken , yukarı akış repo aynı adı taşıyan bir dalı yoktur.

Ve:

Her iki durumda da, yukarı yönlü boş repoda şube olmadığı için:

  • henüz adlandırılmış şube yok
  • hiçbir yukarı akış şubesi yoktur (aynı adla veya adsız! İzleme veya izleme)

Bu, yerel ilk itişinizin hiçbir fikri olmadığı anlamına gelir :

  • nereye itmek
  • ne itmeli (herhangi bir yukarı akış dalının uzaktan izleme dalı olarak kaydedildiğini ve / veya aynı ada sahip olduğunu bulamadığı için)

Yani en azından aşağıdakileri yapmanız gerekir:

git push origin master

Ama sadece bunu yaparsanız, siz:

  • yukarı masterakışta (şimdi boş olmayan bir repo) bir yukarı akış dalı oluşturacak : iyi.
  • olmaz kaydetmek yerel şube 'o master' (akıntıya karşı aktarılması gereken origin) ' masterfeci:' (yukarı dalı).

Bu nedenle, ilk itme için aşağıdakileri yapmanız önerilir:

git push -u origin master

Bu, origin/masterbir uzaktan izleme dalı olarak kayıt yapar ve bir sonraki push'un otomatik olarak itilmesini mastersağlar origin/master.

git checkout master
git push

Ve bu ' current' veya ' upstream' itme politikalarıyla da işe yarayacak .
Her durumda, git push -u origin masterilkinden sonra, master'ı sağ yukarı akış dalına itmeye devam etmek için basit bir git push yeterli olacaktır.


2
Bu noktadan sonra, bir sonraki git pushdalın zaten var olmasını bekliyor mu?
Cratylus

2
Evet. Bu dalda yapılan güncellemeleri akış yukarı deposuna gönderir.
RyPeck

@Cratylus evet çünkü yeni varsayılan itme politikası " simple': Herhangi kaydedildi memba şubesine itme, eğer o memba şube yerel olarak aynı adı taşıyor. Basit bir git pushşey yeterli olacaktır.
VonC

1
@ButtleButkus Teşekkür ederim. Bağlantıyı geri yükledim.
VonC

3
Sorucunun yeni bir 'new_branch' şubesine ilişkin daha genel durumu için git push --set-upstream origin new_branchveya git push -u origin new_branchkısaca kullanabilirsiniz . -allSorgulayıcı bütün dalları dahil ederek belirli bir yeni şube adlandırma bypass kullanılan söyledi. Bu, cevabında + Klas Mellbourn tarafından kapsanmaktadır.
Paul Masri-Stone

106

Yapmıyorsunuz, aşağıya bakın

Bu 'özelliği' oldukça rahatsız edici buluyorum, çünkü aya roket atmaya çalışmıyorum, sadece lanet şubemi itiyorum. Muhtemelen siz de yaparsınız, yoksa burada olmazdınız!

İşte düzeltme: bu dalın başlangıçta var olup olmadığına bakılmaksızın örtülü olarak geçerli dal için itmesini istiyorsanız, bu komutu bir kez verin ve bir daha asla bir yere gitmenize gerek kalmayacak :

git config --global push.default current

Yani böyle dallar yaparsanız:

git checkout -b my-new-branch

ve sonra bazı taahhütlerde bulunun ve

git push -u

(bu dalda olmak) ve çıkış yapmak için söz konusu dalı sizin için yaratacaktır.

-U bitinin, daha sonra adı geçen daldan çekilecek olursanız, bunların birbirine bağlı olduğundan emin olun. Şubeyi daha sonra çekme planınız yoksa (veya yaparsanız başka bir astarla iyi durumdaysanız) -u gerekli değildir.


3
Bunu yaptığımda, bir git çekme yaparsam, hemen sonra - iki dal bağlı değildir. :(
Alisso

sorunumu çözen tek cevap bu.
Raymond Chenon

2
Bunları bağlamak içingit push -u
Ben Creasy

Teşekkürler! Bu cevap hızlı ve 'kirli' çözüm olarak kabul edilmelidir. OP'nin niyetine en yakın olduğuna eminim.
youngrrrr

3
> Aya roket atmaya çalışmıyorum. -- EVET.
VCavallo

39

git pushYeni bir dalı iterken çıktı

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

Basit git push, geçerli yerel dalın izlediği uzak bir dalın var olduğunu varsayar. Böyle bir uzak dal yoksa ve oluşturmak istiyorsanız, -u(kısa biçim --set-upstream) bayrağını kullanarak belirtmeniz gerekir .

Neden böyle? Sanırım uygulayıcılar uzaktan kumandada bir şube oluşturmanın o kadar büyük bir eylem olduğunu hissettiler ki yanlışlıkla yapmak zor olmalı. git pushher zaman yaptığınız bir şeydir.

"Bir şube varsayılan olarak iletilecek yeni bir değişiklik değil mi?" Git'teki "bir değişiklik" in bir taahhüt olduğunu söyleyebilirim. Şube bir taahhüdün göstergesidir. Bana göre, bir itmeyi diğer depolara iten bir şey olarak düşünmek daha mantıklı. Hangi taahhütlerin itildiği, hangi şubede olduğunuz ve o şubenin uzaktan kumandadaki şubelerle olan izleme ilişkisi tarafından belirlenir.

Pro Git kitabının Uzak Dallar bölümünde şubeleri izleme hakkında daha fazla bilgi edinebilirsiniz .


Ben alamadım fatalama zaten bir bu mesele branch.Does içinde taahhüt yapmıştı?
Cratylus

@Cratylus hayır önemli değil. Taahhüt, deponuzda güvenlidir git push -u originve uzak depoya kopyalanır.
Klas Mellbourn

Hayır demek istediğim fatalcevapta bahsettiğin gibi bir mesaj almadım.Bu fark, şubeye bir şey yaptığım gerçeğine mi bağlı?
Cratylus

@Cratylus Neden fatalmesajı alamadığını bilmiyorum . Farkın tam olarak hangi git uygulamasını kullandığınıza bağlı olduğunu tahmin ediyorum. Çıktım 1.8.1.msysgit.1'den Windows 8'de çalışıyor.
Klas Mellbourn

Aynı sürüme sahibim ama Vista'da
Cratylus

4

Orijinal geliştiriciler tarafından bu kadar hızlı bir neden bulamadım, ancak Git'in birkaç yıllık deneyimine dayanan eğitimli bir tahmin verebilirim.

Hayır, her dal dış dünyaya itmek istediğiniz bir şey değildir. Özel bir deneyi temsil edebilir.

Üstelik git pushtüm şubeleri nereye göndermeliyiz? Git birden fazla uzaktan kumanda ile çalışabilir ve her birinde farklı dal kümeleri olmasını isteyebilirsiniz. Örneğin, merkezi bir proje GitHub repo'nun serbest bırakma dalları olabilir; GitHub çatalının incelenmek üzere konu dalları olabilir; ve yerel bir Git sunucusunun yerel yapılandırmayı içeren şubeleri olabilir. Eğer git pushgeçerli dal parçaları o uzak konuma tüm dalları itecek, düzeni bu tür berbat kolay olurdu.


1). It might represent a private experimentTamam ama önemli olan nedir? Herkesin çalıştığı "ana" dal yani masteretkilenmez. Kaynak kodunu gizli tutmak istemiyorsanız 2) git push, without a remote, pushes to the current branch's remoteSeni burada kaybettim :(
Cratylus

@Cratylus: 1) hepsi şube reklam lib onlarca geliştirici ile bir projede, çok dağınık depoları alacak. Bu tür projeler üzerinde git fetchçalışıyorum ve her seferinde yüzlerce yarım çalışan şubeye gitmek istemem . 2) git pushVarsayılan davranışından bahsediyorum . Varsa, geçerli dalın izlediğini uzaktan kumandaya iter.
Fred Foo

3

HEAD geçerli dal için kısadır, bu yüzden git push -u orijinli HEAD çalışır. Takma ad kullandığımda bu yazmayı önlemek için:

git config - küresel takma ad.pp 'push -u origin HEAD'

Bundan sonra, git -b şubesi ile oluşturulan şubeyi itmek istediğim her zaman şunu kullanarak itebilirim:

git pp

Umarım bu biri için zaman kazandırır!


2

İlk kontrolde

Adım-1: git remote -v
// bulunursa Git'i başlat, sonra Adım 2'yi kaldır veya atla

Adım-2: git remote rm origin
// Sonra e-posta adresinizi global olarak yapılandırın git

Aşama 3: git config --global user.email "youremail@example.com"

Adım 4: git initial

Adım-5: git commit -m "Initial Project"
// Proje repo'yu zaten eklediyseniz, adım 6'yı atlayın.

Adım 6: git remote add origin %repo link from bitbucket.org%

Adım 7: git push -u origin master


1

Bu konunun daha fazla permütasyonunu yaşadım.

Bir dal adlı vardı feat/XYZ-1234-some-descriptionben işin daha küçük bir parçasını izlemek için yeni bir JIRA sorunu yarattı İşten sırasında JIRA konuyla 1234. üzerinde çalışıyordu çünkü, ben zorlamaya geldiğimde bu yeni sayısı numarası ile bir şube adına zorlamaya karar verdi içinde:

git push -u origin feat/XYZ-5678-a-different-description # failed

Bu bana bu SO iş parçacığında tartışılan hata verdi. Fakat şu anki şubemden farklı bir şube ismine geçmeye çalıştığım için , sorunum burada açıklanandan farklıydı. Ben onu itmek önce yerel şubem yeniden adlandırmak sona erdi:

git branch -m feat/XYZ-1234-some-description feat/XYZ-5678-a-different-description
git push -u origin feat/XYZ-5678-a-different-description # now works

Biraz daha ben ayarlamış olabileceğini fark etti etrafında okuduktan sonra srcüzerinde git pushya da sadece şimdiki şube adının, HEADeğer uygunsa:

git push -u origin feat/XYZ-1234-some-description:feat/XYZ-5678-a-different-description # also works

-1

Yeni şubenizden ilk kez yeni değişiklikler aktarmayı etkinleştirirseniz. Ve aşağıdaki hatayı alıyorum:

*git push -f
fatal: The current branch Coding_Preparation has no upstream branch.

Geçerli dalı itmek ve uzaktan kumandayı yukarı akış olarak ayarlamak için

git push -u origin new_branch_name


** Successful Result:** 
 git push -u origin Coding_Preparation
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 599 bytes | 599.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'Coding_Preparation' on GitHub by visiting: ...
 * [new branch]      Coding_Preparation -> Coding_Preparation
Branch 'Coding_Preparation' set up to track remote branch 'Coding_Preparation' from 'origin'.
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.