Saya mengalami kesulitan memahami cara menggunakan tag versus cabang digit.
Saya baru saja memindahkan versi kode kami saat ini dari cvs untuk git, dan sekarang saya akan mengerjakan subset dari kode itu untuk fitur tertentu. Beberapa pengembang lain akan mengerjakan ini juga, tetapi tidak semua pengembang di grup kami akan peduli dengan fitur ini. Haruskah saya membuat cabang atau tag? Dalam situasi apa saya harus menggunakan yang satu versus yang lain?
git
version-control
branch
git-branch
git-tag
Bialecki
sumber
sumber
Jawaban:
Sebuah tag merupakan versi cabang tertentu pada saat dalam waktu. Sebuah cabang mewakili thread terpisah dari pembangunan yang dapat berjalan bersamaan dengan upaya pembangunan lainnya pada basis kode yang sama. Perubahan pada cabang akhirnya dapat digabungkan kembali ke cabang lain untuk menyatukannya.
Biasanya Anda akan tag versi tertentu sehingga Anda dapat menciptakan itu, misalnya, ini adalah versi kita dikirim ke XYZ Corp . Sebuah cabanglebih merupakan strategi untuk menyediakan pembaruan yang sedang berlangsung pada versi kode tertentu sambil terus melakukan pengembangan di atasnya. Anda akan membuat cabang dari versi yang dikirimkan, melanjutkan pengembangan di jalur utama, tetapi melakukan perbaikan bug ke cabang yang mewakili versi yang dikirimkan. Akhirnya, Anda akan menggabungkan perbaikan bug ini kembali ke jalur utama. Seringkali Anda akan menggunakan kedua percabangan dan penandaan bersama. Anda akan memiliki berbagai tag yang mungkin berlaku untuk jalur utama dan cabangnya yang menandai versi tertentu (misalnya yang dikirimkan ke pelanggan) di sepanjang setiap cabang yang mungkin ingin Anda buat ulang - untuk pengiriman, diagnosis bug, dll.
Ini sebenarnya lebih rumit dari ini - atau serumit yang Anda inginkan - tetapi contoh-contoh ini seharusnya memberi Anda gambaran tentang perbedaan.
sumber
git checkout 88c9f229f
Anda dapat melakukan sesuatu sepertigit checkout your_tag
dan Anda akan checkout komit yang telah dihapus oleh tag.Dari sudut pandang teoritis :
Dari sudut pandang teknis :
refs/tags/
namespace, dan dapat menunjuk ke objek tag (tag bertanda GPG beranotasi dan opsional) atau langsung melakukan objek (tag ringan yang jarang digunakan untuk nama lokal), atau dalam kasus yang sangat jarang bahkan untuk objek pohon atau objek gumpalan (misalnya tanda tangan GPG ).refs/heads/
namespace, dan hanya bisa menunjuk ke objek komit . TheHEAD
pointer harus mengacu ke cabang (referensi simbolik) atau langsung ke komit (KEPALA terpisah atau cabang yang tidak disebutkan namanya).refs/remotes/<remote>/
namespace, dan ikuti cabang biasa di repositori jarak jauh<remote>
.Lihat juga halaman manual gitglossary :
sumber
git checkout <tag>
" akan menghasilkan cabang tanpa nama anonim (disebut 'kepala terpisah') dan memilih status tag. Membuat komit baru melakukannya di cabang yang tidak disebutkan namanya ini, dan tidak mengubah tag yang ditunjuk.git checkout -b <branch name> <tag name>
Jika Anda menganggap repositori Anda sebagai buku yang mencatat kemajuan proyek Anda ...
Ranting
Anda dapat menganggap cabang sebagai salah satu penanda tempel tersebut :
Repositori baru hanya memiliki salah satu dari mereka (dipanggil
master
), yang secara otomatis pindah ke halaman terbaru (anggap komit ) yang Anda tulis. Namun, Anda bebas membuat dan menggunakan lebih banyak bookmark, untuk menandai tempat menarik lainnya di buku, sehingga Anda dapat kembali ke sana dengan cepat.Selain itu, Anda selalu dapat memindahkan bookmark tertentu ke beberapa halaman buku lainnya (menggunakan
git-reset
, misalnya); tempat menarik biasanya bervariasi dari waktu ke waktu.Tag
Anda dapat menganggap tag sebagai judul bab .
Ini mungkin berisi judul (pikirkan tag beranotasi ) atau tidak. Tag mirip tetapi berbeda dengan cabang, karena menandai titik minat historis pada buku. Untuk mempertahankan aspek historisnya, setelah Anda membagikan tag (yaitu mendorongnya ke remote bersama), Anda tidak seharusnya memindahkannya ke tempat lain di buku.
sumber
Apa yang perlu Anda sadari, berasal dari CVS, adalah bahwa Anda tidak lagi membuat direktori saat membuat cabang.
Tidak ada lagi "tag lengket" (yang dapat diterapkan hanya pada satu file), atau "tag cabang".
Cabang dan tag adalah dua objek berbeda di Git, dan mereka selalu berlaku untuk semua repo.
Anda tidak lagi (dengan SVN saat ini) harus secara terstruktur membuat repositori Anda dengan:
Struktur itu berasal dari kenyataan bahwa CVS adalah sistem revisi dan bukan sistem versi (lihat Kontrol sumber vs. Kontrol Revisi? ).
Itu berarti cabang ditiru melalui tag untuk CVS, salinan direktori untuk SVN.
Pertanyaan Anda masuk akal jika Anda terbiasa checkout tag, dan mulai bekerja di dalamnya .
Yang tidak seharusnya Anda lakukan;)
Tag seharusnya mewakili konten yang tidak dapat diubah , hanya digunakan untuk mengaksesnya dengan jaminan untuk mendapatkan konten yang sama setiap kali.
Di Git, sejarah revisi adalah serangkaian komitmen, membentuk grafik.
Cabang adalah satu jalur dari grafik itu
Lihat jawaban Jakub Narębski untuk semua teknis, tetapi terus terang, pada titik ini, Anda tidak perlu (belum) semua detail;)
Poin utamanya adalah: sebuah tag menjadi pointer sederhana ke sebuah komit, Anda tidak akan pernah bisa mengubah kontennya. Anda membutuhkan cabang.
Dalam kasus Anda, setiap pengembang mengerjakan fitur tertentu:
Alih-alih melacak langsung cabang kolega Anda, Anda hanya dapat melacak cabang dari satu repositori pusat "resmi" tempat setiap orang mendorong pekerjaannya untuk mengintegrasikan dan membagikan karya semua orang untuk fitur khusus ini.
sumber
Cabang-cabangnya terbuat dari kayu dan tumbuh dari batang pohon. Tag terbuat dari kertas (turunan dari kayu) dan digantung seperti Ornamen Natal dari berbagai tempat di pohon.
Proyek Anda adalah pohon, dan fitur Anda yang akan ditambahkan ke proyek akan tumbuh di cabang. Jawabannya adalah cabang.
sumber
Sepertinya cara terbaik untuk menjelaskan adalah bahwa tag bertindak sebagai hanya cabang baca. Anda dapat menggunakan cabang sebagai tag, tetapi Anda dapat memperbaruinya secara tidak sengaja dengan komitmen baru. Tag dijamin untuk menunjuk komit yang sama selama ada.
sumber
git tag -f
.Tag dapat ditandatangani atau tidak ditandatangani ; cabang tidak pernah masuk.
Tag yang ditandatangani tidak pernah bisa bergerak karena terikat secara kriptografis (dengan tanda tangan) ke komit tertentu. Tag yang tidak ditandatangani tidak terikat dan dimungkinkan untuk memindahkannya (tetapi memindahkan tag bukanlah hal yang biasa).
Cabang tidak hanya bisa pindah ke komit yang berbeda tetapi diharapkan juga melakukannya. Anda harus menggunakan cabang untuk proyek pengembangan lokal Anda. Tidak masuk akal untuk melakukan pekerjaan pada repositori Git "pada tag".
sumber
Saya suka menganggap cabang sebagai tujuan Anda , tag sebagai tujuan Anda .
Tag terasa seperti penunjuk titik penting tertentu di masa lalu, seperti rilis versi.
Sedangkan cabang adalah jalan tertentu proyek turun, dan dengan demikian penanda cabang maju bersama Anda. Setelah selesai, Anda menggabungkan / menghapus cabang (yaitu penanda). Tentu saja, pada saat itu Anda dapat memilih untuk menandai komit itu.
sumber
The Git Perumpamaan menjelaskan bagaimana DVCS khas akan dibuat dan mengapa pencipta mereka melakukan apa yang mereka lakukan. Juga, Anda mungkin ingin melihat Git for Computer Scientist ; itu menjelaskan apa yang dilakukan setiap jenis objek di Git, termasuk cabang dan tag.
sumber
Tag digunakan untuk menandai versi, lebih khusus itu merujuk titik waktu pada cabang. Cabang biasanya digunakan untuk menambahkan fitur ke proyek.
sumber
sederhana:
Git User Manual
sumber
jawaban sederhana adalah:
tapi
sumber