git: "şube adı" ve "başvuru / başlıklar / dal adı" arasındaki fark


97

Bir örnekte açıklanacak en iyisi: Deponun 0,58 şubesindeyim ve bu şekilde çekiyorum:

git pull origin 0.58

Sadece "git çekme" dediğimde şunu anlıyorum:

ip238:openlierox az$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.0.58.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 <repository> <refspec>').
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.0.58.remote = <nickname>
    branch.0.58.merge = <remote-ref>
    remote.<nickname>.url = <url>
    remote.<nickname>.fetch = <refspec>

See git-config(1) for details.

Görünüşe göre o şubeyi kontrol ettiğimde bazı seçenekleri (--track?) Unutmuşum. Her neyse, bunu şimdi ayarladım:

git config branch.0.58.merge 0.58
git config branch.0.58.remote origin

Ve bu işe yarıyor gibi görünüyor. Sonra, sırf ilgi nedeniyle, bu ayarlarla ilgili başka bir şubeye baktım:

ip238:openlierox az$ git config branch.0.57.merge
refs/heads/0.57
ip238:openlierox az$ git config branch.0.57.remote
origin

Şimdi merak ediyordum, "0.58" arasında bir fark var mı yoksa "referanslar / kafalar / 0.58" mi belirtmeliyim?

Aradaki fark tam olarak nedir?


1
Sadece başlık yazım hatası adres için (şimdi değiştirerek eski unvanı ile karışıklık olmadan) , bu okumalısınız "ref / kafaları / BRANCHNAME" , headsbir "s" ile.
RomainValeri

Yanıtlar:


129

A ref, bir işleme işaret eden herhangi bir şeydir, örneğin, dallar (başlıklar), etiketler ve uzak dallar. Deponuzda .git/refsher üç referans türüne de sahip olduğunuzu varsayarak dizininizde kafaları, uzaktan kumandaları ve etiketleri görmelisiniz .

refs/heads/0.580.58 adlı bir dalı belirtir . Referansın hangi isim alanını belirtmezseniz, git varsayılan olanlara bakacaktır. Bu, yalnızca 0,58'i makul olarak belirsiz hale getirir - hem bir dalınız hem de 0,58 adında bir etiketiniz olabilir.


3
Çok teşekkürler, bu durumu çok iyi açıklıyor. Böyle adlandırılmış bir etiket olmadığı için sadece "0.58" ile çalıştı.
Albert

1
Doğru, aslında her zaman tamamen iyi olacak, ancak güvende olmak güzel.
Cascabel

Bu cevap bir hazinedir. Sonunda birisi Git'i açıklar ve bundan zevk alıyorum! Teşekkürler.
aderchox

9
İşte netlik için bunların hepsi: refs/heads/ve refs/remotes/verefs/tags/
Jim Aho

41

Sadece merak eden biri için - git show-refGit v1.8.2.2'den beri mevcut olan, size yerel deponuzdaki tüm referansları gösterecektir.


3
Ayrıca git log --decorate=fulltarihteki referansların tam adlarını gösterecek
galath

19

Bakın, branchNameGIT bunu gerçekten tanımlamadan önce tam olarak çözülmesi gerekiyor. Tam olarak çözülmüş isim olacaktır refs/heads/branchName.

Ünlü komutlardan biri, git checkout branchNamenerede ödeme yapmak istediğinizi belirlemek için onu otomatik olarak tamamen çözer. Bunu otomatik olarak yaptığına dikkat edin, bu nedenle asla tamamen kendi başımıza yazmayız.

Bunu nasıl yapıyor? Buraya bakalım

REFNAME : Örneğin master, heads/master,refs/heads/master

Sembolik bir referans adı. Örneğin, ana, genellikle tarafından referans verilen commit nesnesi anlamına gelir refs/heads/master. Eğer her ikisine de sahipseniz heads/masterve tags/masteraçıkça heads/masterGit'e hangisini kastettiğinizi söylemesini söyleyebilirsiniz. Belirsiz olduğunda <refname>, aşağıdaki kurallara göre ilk eşleşme alınarak a belirsizliği ortadan kaldırılır:

1.If $GIT_DIR/<refname>ne demek olduğunu var, (bu yalnızca için genellikle yararlıdır HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADve CHERRY_PICK_HEAD);

2. Varsa, refs/<refname>aksi takdirde;

3. Aksi refs/tags/<refname>takdirde, varsa;

4. refs/heads/<refname>yoksa, varsa;

5. Aksi refs/remotes/<refname>takdirde, varsa;

6. refs/remotes/<refname>/HEADyoksa, varsa.

Yani 6 adımın üstünde, bunun ne olduğunu çözmeye çalışıyor branchName. Bu nedenle, ona hiçbir zaman tam olarak çözümlenmiş bir branchName vermemize gerek yok.

Bakın burada ve burada da.

Ayrıca .gitdizininize gidin ve refklasörün içine bakın .

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.