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.

Larutan

Let's mulai dengan menjelaskan apa yang tag di git

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/ -b 

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


Cara melihat daftar semua kategori?

# list all tags
git tag

# list all tags with given pattern ex: v-
git tag --list 'v-*'

Cara membuat tag?

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

Bagaimana cara menghapus tag?

# delete any given tag
git tag -d 

# Don't forget to remove the deleted tag form the server with push tags

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 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/ -b 

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 relevan

# Clone a specific tag name using git clone 
 git clone  --branch=

git clone --cabang=<nama>

--cabang juga dapat menggunakan tag dan melepaskan KEPALA yang berkomitmen dalam menghasilkan repository.


Bagaimana untuk mendorong tag?

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:

  • Dijelaskan kategori (sehingga anda dapat melewatkan local/temp membangun tag)
  • Pilihan kategori (nenek moyang) dari arus cabang (terletak pada sejarah)

Dari Git 2.4 anda dapat mengaturnya dengan menggunakan konfigurasi

git config --global push.followTags true

Komentar (8)

(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 dengan ref/kepala/ nama cabang; string dimulai dengan ref/remote/ nama jauh-pelacakan cabang; dan string yang dimulai denganref/tag/nama tag. Namaref/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.

Refspecs

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.)

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 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".

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 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.

Bottom line

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.

Ketika anda perlu memenuhi syarat nama

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

akan memberikan anda ID untuk yang tag poin. Namun, dan ini adalah apa yang's hilang dari gitrevisionsgit 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 bahwagit checkoutakan menggunakan nama pendek sebagai nama cabang pertama: bahwa&#39;s bagaimana anda check out cabangtidak adabahkan jika tagtidak adaada. Jika anda ingin memeriksa tag, anda dapat menggunakanref/tag/xyzzy.) Karena (sepertigitrevisionscatatan) Git akan mencoba <code>ref/*nama*</code>, anda juga dapat hanya menulistag/xyzzyuntuk mengidentifikasi melakukan taggedtidak ada. (Jika seseorang telah berhasil menulis sebuah referensi yang valid bernamatidak 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.

Komentar (2)

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

Komentar (0)