git: perbedaan antara "branchname" dan "refs / heads / branchname"

97

Paling baik dijelaskan pada contoh: Saya di cabang 0,58 repositori dan ini cara saya menarik:

git pull origin 0.58

Saat saya memanggil "git pull", saya mendapatkan:

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.

Sepertinya saya mungkin lupa beberapa opsi (--track?) Ketika saya memeriksa cabang itu. Bagaimanapun, saya telah mengatur ini sekarang:

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

Dan ini sepertinya berhasil. Kemudian, hanya karena minat, saya melihat beberapa cabang lain tentang pengaturan ini:

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

Saya bertanya-tanya sekarang, apakah ada perbedaan antara "0,58" atau haruskah saya menentukan "refs / heads / 0.58"?

Apa sebenarnya perbedaannya?

Albert
sumber
1
Untuk mengatasi kesalahan ketik pada judul (tanpa mengotak-atik judul lama dengan memodifikasinya sekarang) , itu harus membaca "refs / heads / branchname" , headsdengan "s".
RomainValeri

Jawaban:

129

A refadalah segala sesuatu yang mengarah ke komit, misalnya, cabang (kepala), tag, dan cabang jarak jauh. Anda harus melihat head, remote, dan tag di .git/refsdirektori Anda , dengan asumsi Anda memiliki ketiga jenis ref di repositori Anda.

refs/heads/0.58menentukan cabang bernama 0,58. Jika Anda tidak menentukan namespace apa ref tersebut, git akan mencari di namespace default. Hal ini membuat penggunaan 0,58 menjadi ambigu - Anda bisa memiliki sebuah cabang dan sebuah tag bernama 0,58.

Bertingkat
sumber
3
Terima kasih banyak, ini menjelaskannya dengan sangat baik. Ini hanya bekerja dengan "0,58" sederhana karena tidak ada tag bernama seperti itu.
Albert
1
Benar, pada dasarnya akan selalu baik-baik saja, tetapi sebaiknya aman.
Kaskabel
Jawaban ini adalah harta karun. Akhirnya seseorang menjelaskan Git dan saya menikmatinya! Terima kasih.
aderchox
9
Berikut semua dari mereka untuk kejelasan: refs/heads/dan refs/remotes/danrefs/tags/
Jim Aho
41

Hanya untuk seseorang yang penasaran - git show-ref, yang tersedia sejak Git v1.8.2.2, akan menampilkan semua referensi yang Anda miliki di repositori lokal Anda.

Artem Dolobanko
sumber
3
Juga git log --decorate=fullakan menunjukkan nama lengkap referensi dalam sejarah
galath
19

Lihat, branchNameperlu diselesaikan sepenuhnya sebelum GIT benar-benar dapat mengidentifikasinya. Nama yang diselesaikan sepenuhnya akan menjadi refs/heads/branchName.

Salah satu perintah terkenal git checkout branchNamesebenarnya secara otomatis menyelesaikannya sepenuhnya untuk mengidentifikasi di mana Anda ingin melakukan pembayaran. Perhatikan bahwa itu melakukannya secara otomatis maka kita tidak pernah menulisnya sendiri sepenuhnya.

Bagaimana cara melakukannya? Mari kita lihat di sini

refname :, misalnya master, heads/master,refs/heads/master

Nama ref simbolis. Misalnya master biasanya berarti objek komit yang direferensikan oleh refs/heads/master. Jika Anda kebetulan memiliki keduanya heads/masterdan tags/master, Anda dapat secara eksplisit mengatakan heads/masteruntuk memberi tahu Git mana yang Anda maksud. Jika ambigu, a <refname>disingkirkan dengan mengambil pertandingan pertama dalam aturan berikut:

1.Jika $GIT_DIR/<refname>ada, itulah yang Anda maksud (ini biasanya hanya berguna untuk HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEADdan CHERRY_PICK_HEAD);

2. sebaliknya, refs/<refname>jika ada;

3. sebaliknya, refs/tags/<refname>jika ada;

4. sebaliknya, refs/heads/<refname>jika ada;

5. sebaliknya, refs/remotes/<refname>jika ada;

6. sebaliknya, refs/remotes/<refname>/HEADjika ada.

Jadi dengan 6 langkah di atas, ia mencoba menyelesaikan apa ini branchName. Oleh karena itu kita tidak perlu memberikan branchName yang telah diselesaikan sepenuhnya padanya.

Lihat di sini dan di sini juga.

Juga, masuk ke .gitdirektori Anda dan lihat di dalam reffolder.

Nomor 945
sumber