Bagaimana cara menandai komit yang lebih lama di Git?

949

Kami baru git, dan saya ingin menetapkan tag di awal repositori kami. Kode produksi kami sama dengan repositori awal, tetapi kami telah membuat komitmen sejak saat itu. Sebuah tag di awal akan memungkinkan kita untuk "memutar kembali" produksi ke kondisi stabil yang diketahui.

Jadi, bagaimana cara menambahkan tag ke komit yang sewenang-wenang dan lebih lama?

hogsolo
sumber
Saya datang ke sini mencari bantuan menghapus tag lama secara lokal dan pada remote dan akhirnya menemukan ini berguna, mungkin itu akan membantu orang lain juga: gist.github.com/mobilemind/7883996
Aleksander Lidtke
1
Dan jangan lupa Bagaimana cara mendorong tag ke repositori jarak jauh menggunakan Git? karena Git tidak akan mendorong tag tanpa melakukan sesuatu yang istimewa.
jww

Jawaban:

1511

Contoh:

git tag -a v1.2 9fceb02 -m "Message here"

Di mana 9fceb02bagian awal dari id komit.

Anda kemudian dapat mendorong tag menggunakan git push origin v1.2.

Anda dapat melakukannya git loguntuk menampilkan semua ID komit di cabang Anda saat ini.

Ada juga bab bagus tentang pemberian tag di buku Pro Git.

Peringatan: Ini membuat tag dengan tanggal saat ini (dan nilai itulah yang akan ditampilkan pada halaman rilis GitHub, misalnya). Jika Anda ingin tag diberi tanggal dengan tanggal komit, silakan lihat jawaban lain .

dkinzer
sumber
45
Anda juga dapat melakukan ini di menu klik kanan di gitk - nyaman jika memang begitulah cara Anda menemukan SHA1.
Cascabel
62
Hapus bagian -adan -m "Message here"jika Anda tidak ingin menambahkan pesan:git tag v1.2 9fceb02
devius
3
Anda dapat menggunakan ID komit penuh, juga.
j08lue
1
@devius Apa perbedaan antara menggunakan -adan -m. Halaman manual tampaknya mengatakan -atersirat saat -mdigunakan.
John Strood
7
git push --tags origin masterakan mendorong semua tag pada cabang lokal ke jarak jauh. Lebih suka git push origin <tag_name>menekan tag yang dibuat. Lihat: stackoverflow.com/a/5195913/452708 , git-scm.com/book/en/v2/Git-Basics-Tagging
Abhijeet
144

Hanya Kodenya

# Set the HEAD to the old commit that we want to tag
git checkout 9fceb02

# temporarily set the date to the date of the HEAD commit, and add the tag
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" \
git tag -a v1.2 -m"v1.2"

# set HEAD back to whatever you want it to be
git checkout master

Detail

Jawaban oleh @dkinzer membuat tag yang tanggalnya adalah tanggal saat ini (ketika Anda menjalankan git tagperintah), bukan tanggal dari komit. Bantuan Git untuk tagmemiliki bagian "Pada Tag Backdating" yang mengatakan:

Jika Anda telah mengimpor beberapa perubahan dari VCS lain dan ingin menambahkan tag untuk rilis utama karya Anda, ada baiknya untuk menentukan tanggal untuk menanamkan di dalam objek tag; data seperti itu di objek tag memengaruhi, misalnya, pemesanan tag di antarmuka gitweb.

Untuk mengatur tanggal yang digunakan dalam objek tag di masa mendatang, atur variabel lingkungan GIT_COMMITTER_DATE(lihat diskusi nanti tentang nilai yang mungkin; bentuk yang paling umum adalah "YYYY-MM-DD HH: MM").

Sebagai contoh:

$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1

Halaman "Cara Memberi Tag di Git" menunjukkan kepada kita bahwa kita dapat mengekstrak waktu komitmen HEAD melalui:

git show --format=%aD  | head -1
#=> Wed, 12 Feb 2014 12:36:47 -0700

Kami dapat mengekstraksi tanggal dari komitmen tertentu melalui:

GIT_COMMITTER_DATE="$(git show 9fceb02 --format=%aD | head -1)" \
git tag -a v1.2 9fceb02 -m "v1.2"

Namun, daripada mengulangi komit dua kali, tampaknya lebih mudah untuk hanya mengubah HEAD ke komit itu dan menggunakannya secara implisit dalam kedua perintah:

git checkout 9fceb02 

GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a v1.2 -m "v1.2"
Phrogz
sumber
4
@ColonelPanic, keinginan Anda adalah perintah saya! github.com/lucasrangit/git-custom-commands/blob/master/…
Lucas
Jika Anda menggunakan Github untuk mengelola rilis dan peduli dengan tanggal yang ditampilkan pada halaman / tag proyek Anda, pengaturan GIT_COMMITTER_DATE sangat penting!
Lesley
2
@ColonelPanic saya memberi Anda upvote untuk permainan kata, dan berharap saya bisa memberi Anda yang kedua untuk kode, tetapi bintang github harus melakukannya.
andyhasit
96

Cara paling sederhana untuk melakukan ini adalah:

git tag v1.0.0 f4ba1fc

dengan f4ba1fcmenjadi awal hash dari commit yang ingin Anda tandai dan v1.0.0menjadi versi yang ingin Anda tandai.

PatrickNLT
sumber
Sempurna terima kasih :).
Saleh Enam Shohag
36

OK , Anda cukup melakukan:

git tag -a <tag> <commit-hash>

Jadi jika Anda ingin menambahkan tag: 1.0.2 untuk dikomit e50f795, cukup lakukan:

git tag -a 1.0.2 e50f795

Anda juga menambahkan pesan di bagian akhir, menggunakan -m, sesuatu seperti ini:

git tag -a 1.0.2 e50f795 -m "my message"

Bagaimanapun, Anda perlu mendorongnya ke remote, untuk melakukan itu, cukup lakukan:

git push origin 1.0.2 

Jika Anda memiliki banyak tag yang tidak ingin Anda sebutkan satu per satu, cukup lakukan:

git push origin --tags

untuk menyatukan semua tag ...

Juga, saya membuat langkah-langkah pada gambar di bawah ini, untuk klarifikasi lebih lanjut dari langkah-langkah: membuat tag pada hash komit

Anda juga dapat menemukan tag di Hub atau menggunakan alat seperti SourceTree , untuk menghindari langkah-langkah sebelumnya, saya masuk ke Bitbucket saya dalam kasus ini dan melakukannya dari sana:

  1. Buka cabang Anda dan temukan komit yang ingin Anda tambahkan tagnya dan klik:

temukan komit Anda di bitbucket

  1. Di halaman komit , di sebelah kanan, temukan di mana dikatakan No tagsdan klik +ikon:

temukan di mana dikatakan Tidak ada tag

  1. Di kotak nama tag, tambahkan tag Anda:

tambahkan nama tag

  1. Sekarang Anda melihat bahwa tag telah berhasil dibuat:

masukkan deskripsi gambar di sini

Alireza
sumber
11

Ini adalah pertanyaan lama, dan jawabannya sudah memberikan semua pekerjaan, tetapi ada juga opsi baru yang dapat dipertimbangkan.

Jika Anda menggunakan SourceTree untuk mengelola repositori git Anda, Anda dapat mengklik kanan komit dan menambahkan tag ke sana. Dengan mouseclick lain Anda juga dapat mengirim tag langsung ke cabang asal.

Stephan Bijzitter
sumber
6

Membangun berdasarkan jawaban yang lain, berikut ini adalah solusi satu-liner yang menetapkan tanggal tag ketika itu benar-benar terjadi, menggunakan tag beranotasi dan tidak memerlukan git checkout:

tag="v0.1.3" commit="8f33a878" bash -c 'GIT_COMMITTER_DATE="$(git show --format=%aD $commit)" git tag -a $tag -m $tag $commit'
git push --tags origin master

di mana tagdiatur ke string tag yang diinginkan, dan commitke hash komit.

Stason
sumber
3

The jawabannya oleh @Phrogz besar, tetapi tidak bekerja pada Windows. Berikut ini cara menandai komit lama dengan tanggal asli komit menggunakan Powershell:

git checkout 9fceb02
$env:GIT_COMMITTER_DATE = git show --format=%aD | Select -First 1
git tag v1.2
git checkout master
ccoxtn
sumber