Lebih
Apa git tag, Cara membuat tag & Cara checkout git remote tag(s)
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.
467
3
Let's mulai dengan menjelaskan apa yang tag di git
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
Kemudian check out tag dengan menjalankan
Bukan
asal
menggunakantag/
awalan.Dalam contoh ini anda memiliki 2 kategori versi 1.0 & versi 1.1 anda dapat checkout mereka dengan salah satu dari berikut:
Semua hal di atas akan melakukan hal yang sama karena tag ini hanya pointer yang diberikan komit.
Cara melihat daftar semua kategori?
Cara membuat tag?
Ada 2 cara untuk membuat tag:
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
Bagaimana cara menghapus tag?
Cara clone tag tertentu?
Dalam rangka ambil isi tag yang diberikan, anda dapat menggunakan
checkout
perintah. Seperti yang dijelaskan di atas kategori seperti lainnya melakukan begitu kita dapat menggunakancheckout
dan bukannya menggunakan SHA-1 cukup menggantinya dengan tag_nameOpsi 1:
Pilihan 2:
Menggunakan perintah clone
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 relevanBagaimana untuk mendorong tag?
git push-tags
Untuk mendorong semua kategori:
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
(Jawaban ini butuh waktu beberapa saat untuk menulis, dan codeWizard's jawaban adalah benar dalam tujuan dan esensi, tapi tidak sepenuhnya selesai, jadi saya'll posting ini toh.)
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 denganref/kepala/
nama cabang; string dimulai denganref/remote/ nama jauh-pelacakan cabang; dan string yang dimulai dengan
ref/tag/nama tag. Nama
ref/simpanan adalah simpanan referensi (seperti yang digunakan oleh gitsimpanan
; catatan kurangnya trailing slash). Ada beberapa yang tidak biasa khusus-kasus nama-nama yang tidak dimulai denganref/
:KEPALA
,ORIG_HEAD
,MERGE_HEAD
, danCHERRY_PICK_HEAD
khususnya semua juga nama-nama yang mungkin merujuk tertentu melakukan (meskipunKEPALA
biasanya berisi nama cabang, yaitu, berisiref: ref/kepala/cabang
). Tapi secara umum, referensi dimulai denganref/
. Satu hal Git lakukan untuk membuat ini membingungkan adalah bahwa hal itu memungkinkan anda untuk menghilangkanref/
, dan sering kata setelahref/
. Misalnya, anda dapat menghilangkanref/kepala/
atauref/tag/
ketika mengacu pada cabang lokal atau tag—dan pada kenyataannya anda harus menghilangkanref/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 (untukgit 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, selamaambil
danpush
operasi. Anda juga dapat menggunakan gitls-jauh
ataugit remote show
untuk melihat mereka, tapiambil
danpush
yang lebih menarik titik kontak.Refspecs
Selama
ambil
danpush
, 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 diambil
, meskipun, dan itu mempengaruhi kedua cabang nama dan tag nama. Anda harus berpikirgit 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 diref/kepala/
dan segala sesuatu diref/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 bernamaasal
:Ini refspec menginstruksikan anda Git untuk mengambil setiap nama yang cocok
ref/kepala/*
—yaitu, setiap cabang pada remote dan mengubah namanya menjadiref/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 yangasal
's cabang menjadi remote-cabang pelacakan untuk remoteasal
. Nama cabang menjadi remote-cabang pelacakan nama, dengan nama remote, dalam hal iniasal
, 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.)Tag
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 penambahanref/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 remoteasal
memiliki tagtidak ada
, dan anda don't, dan andagit fetch asal "ref/tag/*:ref/tag/*"
, anda mendapatkanref/tag/xyzzy
ditambahkan ke repositori anda (menunjuk ke commit sama seperti pada remote). Jika anda menggunakan+ref/tag/*:ref/tag/*
maka anda tagtidak ada
, jika anda memiliki satu, adalah *diganti oleh salah satu dariasal
. Artinya,+
memaksa bendera pada refspec berarti "mengganti referensi saya's nilai dengan satu saya Git mendapat dari mereka Git".Automagic tags selama fetch
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 yanggit 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.Bottom line
Anda mungkin harus menggunakan git fetch-kategori
untuk 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, simplegit 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.Ketika anda perlu memenuhi syarat nama
Yang saya sebutkan di atas bahwa anda dapat menghilangkan
ref/
hampir selalu, danref/kepala/
danref/tag/
dan sebagainya sebagian besar waktu. Tapi ketika dapat't anda? Lengkap (atau dekat-lengkap sih) jawabannya adalah digitrevisions
dokumentasi. Git akan menyelesaikan sebuah nama untuk komit ID menggunakan enam langkah urutan yang diberikan di link. Anehnya, kategori menimpa cabang: jika ada tagtidak ada
dan cabangtidak ada
, dan mereka titik yang berbeda untuk melakukan, maka:akan memberikan anda ID untuk yang tag poin. Namun, dan ini adalah apa yang's hilang dari
gitrevisions
—git checkout
lebih suka nama cabang, jadigit 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
atauref/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.Untuk mendapatkan hasil yang spesifik kode tag cobalah untuk membuat cabang baru tambahkan mendapatkan kode tag di dalamnya. Saya telah melakukannya dengan perintah :
$git checkout -b newBranchName tagName