Το Git, όπως και τα περισσότερα VCS, δίνει τη δυνατότητα να βάζουμε ετικέτες (tags) σε συγκεκριμένα σημεία του ιστορικού ενός έργου.
Η λειτουργικότητα αυτή χρησιμοποείται συνήθως για σημειωθούν συγκεκριμένες εκδόσεις (π.χ. έκδοση 1.0
, 2.0
κ.ο.κ.).
Σε αυτή την ενότητα θα μάθετε πώς να βλέπετε ποιες ετικέτες έχει ένα έργο, πώς να δημιουργείτε ετικέτες και ποια είδη ετικετών υπάρχουν.
Για να δείτε τις ετικέτες ενός έργου, η εντολή στο Git είναι αρκετά απλή.
Απλά πληκτρολογήστε git tag
(και προαιρετικά -l
ή --list
):
$ git tag
v0.1
v1.3
Η εντολή παραθέτει τις ετικέτες σε αλφαβητική σειρά, αν και η σειρά αυτή δεν έχει κάποια ιδιαίτερη σημασία.
Μπορείτε επίσης να αναζητήσετε ετικέτες που ακολουθούν κάποιο μοτίβο. Για παράδειγμα, το αποθετήριο με τον πηγαίο κώδικα του Git περιέχει περισσότερες από 500 ετικέτες. Αν ενδιαφέρεστε να δείτε μόνο αυτές που έχουν σχέση με την έκδοση 1.8.5, τότε μπορείτε να εκτελέσετε:
$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
Note
|
Παράθεση ετικετών με χαρακτήρες υποκατάστασης απαιτεί την επιλογή
-l ή --list Αν θέλετε μόνο την πλήρη λίστα των ετικετών, τότε αν εκτελέσετε την εντολή Αν όμως δίνετε και ένα μοτίβο με χαρακτήρες υποκατάσταση (wildcards), τότε η χρήση ενός από τα |
Το Git χρησιμοποιεί δύο κατηγορίες ετικετών, τις απλές (lightweight) και τις ετικέτες με επισημείωση (annotated).
Μια απλή ετικέτα μοιάζει πολύ με έναν κλάδο που δεν αλλάζει· είναι απλά ένας δείκτης σε μια συγκεκριμένη υποβολή.
Οι ετικέτες με επισημειώσεις από την άλλη, αποθηκεύονται στη βάση δεδομένων του Git ως πλήρη αντικείμενα. Για καθεμία επισημειωμένη ετικέτα: υπολογίζεται το άθροισμα ελέγχου (checksum) της· περιέχει το όνομα, και τη διεύθυνση e-mail αυτού που βάζει την ετικέτα και την ημερομηνία· έχει ένα μήνυμα· μπορεί να υπογραφεί και να επαληθευθεί με του GNU Privacy Guard (GPG). Γενικά συνιστάται να δημιουργείτε ετικέτες με επισημειώσεις (annotations) έτσι ώστε να έχετε όλες αυτές τις πληροφορίες. Παρόλα αυτά, αν για κάποιο λόγο θέλετε μία προσωρινή ετικέτα ή να μια ετικέτα χωρίς περαιτέρω πληροφορίες, μπορείτε να χρησιμοποιήσετε τις απλές ετικέτες.
Η δημιουργία επισημασμένων ετικετών είναι απλή.
Ο ευκολότερος τρόπος είναι να χρησιμοποιήσετε την επιλογή -a
όταν εκτελείτε την εντολή tag
:
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4
Η επιλογή -m
σημαίνει ότι ακολουθεί το μήνυμα της ετικέτας, το οποίο και αποθηκεύεται μαζί με αυτή.
Αν δεν προσδιορίσετε μήνυμα σε μια καινούρια επισημειωμένη ετικέτα, τότε το Git θα εκκινήσει τον επεξεργαστή κειμένου σας, ώστε να γράψετε το μήνυμα εκεί.
Χρησιμοποιώντας την εντολή git show
μπορείτε να δείτε τις πληροφορίες που περιέχει μια ετικέτα:
$ git show v1.4
tag v1.4
Tagger: Ben Straub <[email protected]>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
Η εντολή αυτή σας δείχνει πληροφορίες για τον χρήστη που έφτιαξε την ετικέτα, την ημερομηνία που τοποθετήθηκε η ετικέτα στην υποβολή (commit) και το μήνυμά της.
Ένας άλλος τρόπος για να βάζετε ετικέτες στις υποβολές είναι οι απλές (lightweight) ετικέτες.
Μία τέτοια ετικέτα δεν είναι τίποτα άλλο από το άθροισμα ελέγχου της υποβολής σας, που αποθηκεύεται σε ένα αρχείο· δεν διατηρείται καμία άλλη πληροφορία.
Για να δημιουργήσετε μια απλή ετικέτα, θα πρέπει να μην χρησιμοποιήσετε τις επιλογές -a
, -s
ή -m
:
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
Αν τώρα εκτελέσετε git show
για τη συγκεκριμένη ετικέτα, δεν θα δείτε τις επιπλέον πληροφορίες που έχουν οι επισημασμένες ετικέτες.
Θα δείτε μόνο την υποβολή:
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <[email protected]>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
Μπορείτε επίσης να προσαρτήσετε ετικέτες σε παλαιότερες υποβολές. Ας υποθέσουμε ότι το ιστορικό υποβολών σας είναι κάπως έτσι:
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
Ας υποθέσουμε τώρα ότι ξεχάσατε να βάλετε ετικέτα στο έργο σας στην έκδοση v1.2 που ήταν η υποβολή με το μήνυμα updated rakefile
.
Μπορείτε να προσαρτήσετε την ετικέτα αργότερα.
Για να το κάνετε αυτό, θα πρέπει να προσδιορίσετε το άθροισμα ελέγχου της υποβολής σας (ή ένα μέρος του) στο τέλος της εντολής:
$ git tag -a v1.2 9fceb02
Μπορείτε να δείτε ότι έχετε προσθέσει την ετικέτα στην υποβολή:
$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5
$ git show v1.2
tag v1.2
Tagger: Scott Chacon <[email protected]>
Date: Mon Feb 9 15:32:16 2009 -0800
version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <[email protected]>
Date: Sun Apr 27 20:43:35 2008 -0700
updated rakefile
...
Εξ ορισμού, η εντολή git push
δεν μεταφέρει ετικέτες στους απομακρυσμένους διακομιστές.
Θα πρέπει να ορίσετε ρητά ότι θέλετε να ωθήσετε τις ετικέτες στον διακομιστή, αφού προηγουμένως τις έχετε δημιουργήσει.
Η διαδικασία είναι παρόμοια με την κοινοποίηση απομακρυσμένων κλάδων· εκτελείτε την εντολή git push origin <tagname>
.
$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To [email protected]:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
Αν έχετε πολλές ετικέτες που θέλετε να ωθήσετε με τη μία, μπορείτε επίσης να χρησιμοποιήσετε την επιλογή --tags
στην εντολή git push
.
Με τον τρόπο αυτό θα μεταφέρετε στον διακομιστή όλες τις ετικέτες που δεν είναι ήδη εκεί.
$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:schacon/simplegit.git
* [new tag] v1.4 -> v1.4
* [new tag] v1.4-lw -> v1.4-lw
Πλέον, όταν κάποιος κλωνοποιήσει ή ελκύσει δεδομένα από το αποθετήριό σας, θα λάβει μαζί και όλες τις ετικέτες σας.
Note
|
Η εντολή
git push ωθεί και τα δύο είδη ετικετώνΗ εντολή |
Για να διαγράψετε μια ετικέτα στο τοπικό σας αποθετήριο, μπορείτε να εκτελέσετε git tag -d <tagname>
.
Για παράδειγμα, μπορείτε να διαγράψουμε την απλή ετικέτα που δημιουργήσαμε παραπάνω ως εξής:
$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)
Σημειώστε ότι η εντολή αυτή δεν διαγράφει την ετικέτα από τους απομακρυσμένους διακομιστές. Υπάρχουν δύο παραλλαγές για τη διαγραφή ετικετών από έναν απομακρυσμένο διακομιστή.
Η πρώτη είναι η εντολή git push <remote> :refs/tags/<tagname>
:
$ git push origin :refs/tags/v1.4-lw
To /[email protected]:schacon/simplegit.git
- [deleted] v1.4-lw
Αυτό ερμηνεύεται ως εξής: η ετικέτα της οποίας το ονομα είναι ο χαρακτήρας null πριν από το :
ωθείται στο απομακρυσμένο όνομα ετικέτας και ουσιαστικά το διαγράφει.
Η δεύτερη και πιο διαισθητική) είναι να διαγράψετε την ετικέτα ως εξής:
$ git push origin --delete <tagname>
Για να δείτε τις εκδόσεις των αρχείων σας στα οποία δείχνει μία ετικέτα, μπορείτε να εκτελέσετε git checkout
για αυτή την ετικέτα, αλλά αυτό θέτει το αποθετήριό σας σε κατάσταση “detached HEAD”, κάτι που έχει κάποιες παρενέργειες:
$ git checkout v2.0.0
Note: switching to 'v2.0.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final
$ git checkout v2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... Add atlas.json and cover image
Στην κατάσταση “detached HEAD”, αν κάνετε αλλαγές και δημιουργήσετε μια υποβολή (commit), η ετικέτα θα παραμείνει η ίδια, αλλά η νέα υποβολή δεν θα ανήκει σε κανέναν κλάδο και δεν θα είναι προσβάσιμη με κανέναν τρόπο εκτός κι αν χρησιμοποιήσετε το ακριβές hash της υποβολής. Με άλλα λόγια, αν χρειάζετα να κάνετε αλλαγές — ας πείτε ότι διορθώνετε κάποιο σφάλμα κάποιας παλιότερης έκδοσης, για παράδειγμα — καλό θα είναι να δημιουργήσετε έναν κλάδο:
$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'
Αν βέβαια εκτελέσετε την παραπάνω εντολή και πραγματοποιήσετε μια υποβολή, ο κλάδος version2
θα είναι λίγο διαφορετικός από την ετικέτα v2.0.0
διότι θα έχει προχωρήσει με τις νέες αλλαγές· συνεπώς προσοχή.