ketika saya checkout remote git tag menggunakan perintah seperti ini:
git checkout -b local_branch_name origin/remote_tag_name
Saya mendapat error seperti ini:
error: pathspec `origin/remote_tag_name` did not match any file(s) known to git.
Saya dapat menemukan remote_tag_name ketika saya menggunakan git tag perintah.
tag ini digunakan untuk label dan tanda yang spesifik melakukan dalam sejarah. Hal ini biasanya digunakan untuk menandai rilis poin (misalnya. v1.0, dll.).
Meskipun tag dapat muncul mirip dengan cabang, tag, namun, tidak berubah. Itu poin langsung ke spesifik melakukan dalam sejarah.
Anda tidak akan dapat untuk checkout kategori jika itu's tidak hanya secara lokal di repositori anda jadi pertama, anda harus mengambil
tag untuk repositori lokal.
Pertama, pastikan bahwa tag ada secara lokal dengan melakukan
# --all will fetch all the remotes.
# --tags will fetch all tags as well
git fetch --all --tags --prune
Kemudian check out tag dengan menjalankan
git checkout tags/<tag_name> -b <branch_name>
Bukan asal
menggunakan tag/
awalan.
Dalam contoh ini anda memiliki 2 kategori versi 1.0 & versi 1.1 anda dapat checkout mereka dengan salah satu dari berikut:
git checkout A ...
git checkout version 1.0 ...
git checkout tags/version 1.0 ...
Semua hal di atas akan melakukan hal yang sama karena tag ini hanya pointer yang diberikan komit.
asal: https://backlog.com/git-tutorial/img/post/stepup/capture_stepup4_1_1.png
# list all tags
git tag
# list all tags with given pattern ex: v-
git tag --list 'v-*'
Ada 2 cara untuk membuat tag:
# lightweight tag
git tag
# annotated tag
git tag -a
Perbedaan antara 2 adalah bahwa ketika menciptakan dijelaskan tag anda dapat menambahkan metadata seperti yang anda miliki dalam git commit: nama, e-mail, tanggal, komentar & signature
# delete any given tag
git tag -d <tag name>
# Don't forget to remove the deleted tag form the server with push tags
Dalam rangka ambil isi tag yang diberikan, anda dapat menggunakan checkout
perintah.
Seperti yang dijelaskan di atas kategori seperti lainnya melakukan begitu kita dapat menggunakan checkout
dan bukannya menggunakan SHA-1 cukup menggantinya dengan tag_name
Opsi 1:
# Update the local git repo with the latest tags from all remotes
git fetch --all
# checkout the specific tag
git checkout tags/<tag> -b <branch>
Pilihan 2:
Karena dukungan git dangkal clone dengan menambahkan --cabang
untuk clone perintah yang dapat kita gunakan tag nama bukan nama cabang. Git tahu bagaimana "menerjemahkan" yang diberikan SHA-1 untuk melakukan relevan
# Clone a specific tag name using git clone
git clone <url> --branch=<tag_name>
git clone --cabang=<nama>
--cabang
juga dapat menggunakan tag dan melepaskan KEPALA yang berkomitmen dalam menghasilkan repository.
git push-tags
Untuk mendorong semua kategori:
git push --tags
Untuk mendorong dijelaskan kategori dan arus sejarah rantai kategori penggunaan::
git push-ikuti-tag
Bendera ini - ikuti-tag
mendorong kedua melakukan dan hanya kategori yang baik:
Dari Git 2.4 anda dapat mengaturnya dengan menggunakan konfigurasi
git config --global push.followTags true
Tidak ada hal seperti itu sebagai "remote Git tag". Hanya ada "tag". Aku arahkan semua ini tidak akan bertele-tele,1 tetapi karena ada banyak kebingungan tentang hal ini dengan santai Git pengguna, dan Git dokumentasi tidak sangat membantu2 untuk pemula. (Itu's tidak jelas jika kebingungan datang karena miskin dokumentasi, atau miskin dokumentasi datang karena ini adalah inheren agak membingungkan, atau apa.)
Ada adalah "remote cabang", lebih tepat disebut "remote-cabang pelacakan", tapi itu's dicatat bahwa ini adalah benar-benar entitas lokal. Tidak ada remote kategori, meskipun (kecuali anda (re)menciptakan mereka). Hanya ada lokal kategori, sehingga anda perlu untuk mendapatkan tag lokal dalam rangka untuk menggunakannya.
Bentuk umum untuk nama-nama tertentu untuk melakukan—yang Git panggilan referensi—adalah string yang dimulai dengan ref/
. String yang dimulai dengan ref/kepala/
nama cabang; string dimulai dengan ref/remote/ nama jauh-pelacakan cabang; dan string yang dimulai dengan
ref/tag/nama tag. Nama
ref/simpanan adalah simpanan referensi (seperti yang digunakan oleh git simpanan
; catatan kurangnya trailing slash).
Ada beberapa yang tidak biasa khusus-kasus nama-nama yang tidak dimulai dengan ref/
: KEPALA
, ORIG_HEAD
, MERGE_HEAD
, dan CHERRY_PICK_HEAD
khususnya semua juga nama-nama yang mungkin merujuk tertentu melakukan (meskipun KEPALA
biasanya berisi nama cabang, yaitu, berisi ref: ref/kepala/cabang
). Tapi secara umum, referensi dimulai dengan ref/
.
Satu hal Git lakukan untuk membuat ini membingungkan adalah bahwa hal itu memungkinkan anda untuk menghilangkan ref/
, dan sering kata setelah ref/
. Misalnya, anda dapat menghilangkan ref/kepala/
atau ref/tag/
ketika mengacu pada cabang lokal atau tag—dan pada kenyataannya anda harus menghilangkan ref/kepala/
ketika memeriksa sebuah cabang lokal! Anda dapat melakukan ini setiap kali hasilnya tidak ambigu, atau—seperti yang kita hanya mencatat—ketika anda harus melakukannya (untuk git checkout cabang
).
It's benar bahwa referensi yang ada tidak hanya dalam repositori sendiri, tetapi juga di remote repositori. Namun, Git memberikan anda akses ke remote repository's referensi hanya pada waktu tertentu: yaitu, selama ambil
dan push
operasi. Anda juga dapat menggunakan git ls-jauh
atau git remote show
untuk melihat mereka, tapi ambil
dan push
yang lebih menarik titik kontak.
Selama ambil
dan push
, Git menggunakan string panggilan refspecs untuk transfer referensi antara lokal dan remote repositori. Dengan demikian, pada saat ini, dan melalui refspecs, bahwa dua repositori Git dapat masuk ke sinkron dengan satu sama lain. Setelah nama anda di sync, anda dapat menggunakan nama yang sama bahwa seseorang dengan menggunakan remote. Ada beberapa sihir khusus di sini di ambil
, meskipun, dan itu mempengaruhi kedua cabang nama dan tag nama.
Anda harus berpikir git fetch
sebagai mengarahkan anda Git untuk menelepon (atau mungkin pesan teks) lain Git—"remote"—dan memiliki percakapan dengan itu. Di awal pembicaraan ini, remote daftar semua referensi: segala sesuatu di ref/kepala/
dan segala sesuatu di ref/tag/
, bersama dengan referensi lain yang dimilikinya. Anda Git scan melalui ini dan (didasarkan pada biasa mengambil refspec) mengganti nama cabang-cabang mereka.
Let's lihatlah normal refspec untuk remote bernama asal
:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$
Ini refspec menginstruksikan anda Git untuk mengambil setiap nama yang cocok ref/kepala/*
—yaitu, setiap cabang pada remote dan mengubah namanya menjadi ref/remote/asal/*
, yaitu, menjaga dicocokkan bagian yang sama, mengubah nama cabang (ref/kepala/
) untuk jarak jauh-melacak nama cabang (ref/remote/
, secara khusus, ref/remote/asal/
).
Hal ini melalui refspec yang asal
's cabang menjadi remote-cabang pelacakan untuk remote asal
. Nama cabang menjadi remote-cabang pelacakan nama, dengan nama remote, dalam hal ini asal
, termasuk. Ditambah tanda +
di bagian depan refspec menetapkan "memaksa" bendera, yaitu, anda remote-cabang pelacakan akan diperbarui untuk mencocokkan remote's nama cabang, terlepas dari apa yang dibutuhkan untuk membuat pertandingan. (Tanpa tanda +
, cabang update terbatas "cepat maju" perubahan, dan update tag hanya diabaikan sejak Git versi 1.8.2 atau jadi—sebelum kemudian sama fast-forward aturan yang diterapkan.)
Tetapi apa yang tentang tag? Ada's tidak ada refspec untuk mereka—setidaknya, tidak secara default. Anda dapat mengatur satu, dalam hal ini bentuk refspec terserah anda; atau anda dapat menjalankan git fetch-tags
. Menggunakan --tag
memiliki pengaruh penambahan ref/tag/*:ref/tag/*
ke refspec, yaitu, ia membawa lebih dari semua kategori (tetapi tidak update anda tag jika anda sudah memiliki sebuah tag dengan nama itu, terlepas dari apa yang remote's tag kata Edit, Jan 2017: sebagai Git 2.10, pengujian menunjukkan bahwa --tag
paksa update tag anda dari jarak jauh's kategori, seolah-olah refspec baca +ref/tag/*:ref/tag/*
; hal ini dapat menjadi perbedaan dalam perilaku dari versi sebelumnya Git).
Perhatikan bahwa ada tidak ada penggantian nama berikut: jika remote asal
memiliki tag tidak ada
, dan anda don't, dan anda git fetch asal "ref/tag/*:ref/tag/*"
, anda mendapatkan ref/tag/xyzzy
ditambahkan ke repositori anda (menunjuk ke commit sama seperti pada remote). Jika anda menggunakan +ref/tag/*:ref/tag/*
maka anda tag tidak ada
, jika anda memiliki satu, adalah *diganti oleh salah satu dari asal
. Artinya, +
memaksa bendera pada refspec berarti "mengganti referensi saya's nilai dengan satu saya Git mendapat dari mereka Git".
Untuk alasan historis,3 jika anda menggunakan baik --tag
pilihan maupun --no-tag
pilihan, git fetch
mengambil tindakan khusus. Ingat bahwa yang kita katakan di atas bahwa remote dimulai dengan menampilkan setempat Git semua referensi, baik lokal anda Git ingin melihat mereka atau tidak.4 Anda Git mengambil catatan dari semua kategori itu melihat pada titik ini. Maka, seperti itu mulai men-download setiap melakukan benda-benda yang dibutuhkan untuk menangani apa pun itu's fetching, jika salah satu dari orang-orang yang berbuat memiliki ID yang sama sebagai salah satu dari tag tersebut, git akan menambahkan tag atau tag tersebut, jika beberapa tag yang memiliki ID—repositori anda.
Edit, Jan 2017: pengujian menunjukkan bahwa perilaku di Git 2.10 sekarang: Jika mereka Git menyediakan tag bernama T, dan anda tidak memiliki tag yang bernama T, dan IDENTITAS komit terkait dengan T adalah nenek moyang dari salah satu cabang mereka yang git fetch
adalah memeriksa, anda Git menambahkan T untuk tag anda dengan atau tanpa --tag
. Menambahkan --tag
penyebab anda Git untuk mendapatkan semua tag mereka, dan juga kekuatan pembaruan.
Anda mungkin harus menggunakan git fetch-kategoriuntuk mendapatkan tag mereka. Jika mereka nama tag konflik dengan tag yang ada nama, anda mungkin ** (tergantung pada versi Git) bahkan harus menghapus (atau nama) beberapa kategori, dan kemudian jalankan git fetch-tag
, untuk kategori. Karena tag—tidak seperti remote cabang—tidak memiliki otomatis mengubah nama anda, nama tag harus sesuai dengan nama tag, yang mengapa anda dapat memiliki masalah dengan konflik.
Di paling kasus normal, meskipun, simple git fetch
akan melakukan pekerjaan, membawa lebih dari mereka yang melakukan dan mereka sesuai kategori, dan karena mereka—siapa pun mereka—akan melakukan tag pada saat mereka mempublikasikan mereka yang melakukan, anda akan bersaing dengan tag mereka. Jika anda don't membuat tag anda sendiri, atau campuran mereka dan repositori repositori lain (melalui beberapa remote), anda tidak't memiliki tag nama tabrakan baik, sehingga anda tidak't harus ribut-ribut dengan menghapus atau mengubah nama kategori dalam rangka untuk mendapatkan mereka tags.
Yang saya sebutkan di atas bahwa anda dapat menghilangkan ref/
hampir selalu, dan ref/kepala/
dan ref/tag/
dan sebagainya sebagian besar waktu. Tapi ketika dapat't anda?
Lengkap (atau dekat-lengkap sih) jawabannya adalah di gitrevisions
dokumentasi. Git akan menyelesaikan sebuah nama untuk komit ID menggunakan enam langkah urutan yang diberikan di link. Anehnya, kategori menimpa cabang: jika ada tag tidak ada
dan cabang tidak ada
, dan mereka titik yang berbeda untuk melakukan, maka:
git rev-parse xyzzy
gitrevisions
—git checkout
lebih suka nama cabang, jadi git checkout xyzzy
akan menempatkan anda pada cabang, mengabaikan tag.
Dalam kasus ambiguitas, anda dapat hampir selalu mengeja ref name menggunakan nama lengkapnya, ref/kepala/xyzzy
atau ref/tag/xyzzy
. (Catatan bahwa ini tidak bekerja dengan git checkout, tapi mungkin cara yang tak terduga:
git checkout ref/kepala/xyzzypenyebab terpisah-KEPALA checkout daripada cabang checkout. Ini adalah mengapa anda hanya perlu dicatat bahwa
git checkoutakan menggunakan nama pendek sebagai nama cabang pertama: bahwa's bagaimana anda check out cabang
tidak adabahkan jika tag
tidak adaada. Jika anda ingin memeriksa tag, anda dapat menggunakan
ref/tag/xyzzy.) Karena (seperti
gitrevisionscatatan) Git akan mencoba <code>ref/*nama*</code>, anda juga dapat hanya menulis
tag/xyzzyuntuk mengidentifikasi melakukan tagged
tidak ada. (Jika seseorang telah berhasil menulis sebuah referensi yang valid bernama
tidak adamenjadi
$GIT_DIR, namun, ini akan menyelesaikan sebagai
$GIT_DIR/xyzzy. Tapi biasanya hanya berbagai
*KEPALAnama harus di
$GIT_DIR`.) 1oke, Oke, "tidak hanya untuk menjadi bertele-tele". :-)
2Beberapa akan mengatakan "sangat tidak membantu", dan saya cenderung setuju, benar-benar.
3pada Dasarnya, git fetch
, dan seluruh konsep remote dan refspecs, sedikit terlambat samping Git, terjadi sekitar waktu Git 1.5. Sebelum kemudian hanya ada beberapa ad-hoc kasus-kasus khusus, dan tag-mengambil adalah salah satu dari mereka, sehingga harus diteruskan melalui kode khusus.
4Jika itu membantu, berpikir jauh Git sebagai flasher, dalam bahasa gaul arti.