-
1. Ξεκινώντας με το Git
-
2. Τα θεμελιώδη στοιχεία του Git
-
3. Διακλαδώσεις στο Git
-
4. Το Git στον διακομιστή
- 4.1 Τα πρωτόκολλα
- 4.2 Εγκατάσταση του Git σε διακομιστή
- 4.3 Δημιουργία δημόσιου κλειδιού SSH
- 4.4 Στήσιμο του διακομιστή
- 4.5 Δαίμονες του Git
- 4.6 Έξυπνο HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Επιλογές φιλοξενίας από τρίτους
- 4.10 Ανακεφαλαίωση
-
5. Κατανεμημένο Git
-
6. GitHub
-
7. Εργαλεία του Git
- 7.1 Επιλογή αναθεώρησης
- 7.2 Διαδραστική εργασία με το στάδιο καταχώρισης
- 7.3 Αποθέματα και Καθαρισμός
- 7.4 Υπογραφή της δουλειάς μας
- 7.5 Αναζήτηση
- 7.6 Η ιστορία ξαναγράφεται
- 7.7 Απομυθοποίηση της reset
- 7.8 Προχωρημένη Συγχώνευση
- 7.9 Rerere
- 7.10 Αποσφαλμάτωση με το Git
- 7.11 Υπομονάδες
- 7.12 Δεμάτιασμα δεδομένων
- 7.13 Replace
- 7.14 Αποθήκευση διαπιστευτηρίων
- 7.15 Ανακεφαλαίωση
-
8. Εξατομίκευση του Git
-
9. Το Git και άλλα συστήματα
- 9.1 Το Git ως πελάτης
- 9.2 Μετανάστευση στο Git
- 9.3 Ανακεφαλαίωση
-
10. Εσωτερική λειτουργία του Git
- 10.1 Διοχετεύσεις και πορσελάνες
- 10.2 Αντικείμενα του Git
- 10.3 Αναφορές του Git
- 10.4 Πακετάρισμα αρχείων
- 10.5 Τα refspec
- 10.6 Πρωτόκολλα μεταφοράς
- 10.7 Διατήρηση και ανάκτηση δεδομένων
- 10.8 Μεταβλητές περιβάλλοντος
- 10.9 Ανακεφαλαίωση
-
A1. Appendix A: Το Git σε άλλα περιβάλλοντα
- A1.1 Γραφικές διεπαφές
- A1.2 Το Git στο Visual Studio
- A1.3 Git στο Visual Studio Code
- A1.4 Git στο IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git στο Sublime Text
- A1.6 Το Git στο Bash
- A1.7 Το Git στο Zsh
- A1.8 Το Git στο Powershell
- A1.9 Ανακεφαλαίωση
-
A2. Appendix B: Ενσωμάτωση του Git στις εφαρμογές μας
- A2.1 Γραμμή εντολών Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Appendix C: Εντολές Git
- A3.1 Ρύθμιση και διαμόρφωση
- A3.2 Λήψη και δημιουργία έργων
- A3.3 Βασική λήψη στιγμιοτύπων
- A3.4 Διακλάδωση και συγχώνευση
- A3.5 Κοινή χρήση και ενημέρωση έργων
- A3.6 Επιθεώρηση και σύγκριση
- A3.7 Αποσφαλμάτωση
- A3.8 Επιθέματα
- A3.9 Ηλεκτρονικό ταχυδρομείο
- A3.10 Εξωτερικά Συστήματα
- A3.11 Διοίκηση
- A3.12 Εντολές διοχέτευσης
3.3 Διακλαδώσεις στο Git - Διαχείριση κλάδων
Διαχείριση κλάδων
Τώρα που έχουμε δημιουργήσει, συγχωνεύσει και διαγράψει μερικούς κλάδους, ας δούμε μερικά εργαλεία διαχείρισης κλάδων που θα μας είναι χρήσιμα όταν αρχίσουμε να χρησιμοποιούμε κλάδους συχνότερα.
Η εντολή git branch εκτός από το να δημιουργεί και να διαγράφει κλάδους κάνει και κάποια άλλα πράγματα.
Αν την τρέξουμε χωρίς ορίσματα, τότε παίρνουμε μία λίστα όλων των κλάδων:
$ git branch
iss53
* master
testing
Ο χαρακτήρας * πριν από τον κλάδο master επισημαίνει ότι ο κλάδος αυτός είναι ο τρέχων κλάδος (δηλαδή ο κλάδος στον οποίο δείχνει ο δείκτης HEAD).
Αυτό σημαίνει ότι αν κάνουμε μία υποβολή σε αυτό το σημείο, ο κλάδος master θα προχωρήσει ώστε να συμπεριλάβει τη δουλειά μας.
Για να δούμε την τελευταία υποβολή του κάθε κλάδου μπορούμε να τρέξουμε την εντολή git branch -v:
$ git branch -v
iss53 93b412c Fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 Add scott to the author list in the readme
Οι επιλογές --merged και --no-merged φιλτράρουν τη λίστα των κλάδων και δείχνουν μόνον όσους κλάδους έχουν συγχωνευτεί και αντίστοιχα δεν έχουν ακόμα συγχωνευτεί στον τρέχοντα κλάδο.
Για να δούμε ποιοι κλάδοι έχουν ήδη συγχωνευτεί στον τρέχοντα κλάδο, τρέχουμε την εντολή git branch --merged:
$ git branch --merged
iss53
* master
Επειδή είχαμε ήδη συγχωνεύσει τον κλάδο iss53 προηγουμένως, φαίνεται στη λίστα μας.
Γενικά είναι ασφαλές να διαγράψουμε τους κλάδους αυτής της λίστας που δεν έχουν το * χρησιμοποιώντας την εντολή git branch -d· έχουμε ήδη ενσωματώσει τις αλλαγές τους σε κάποιον άλλο κλάδο, συνεπώς δεν πρόκειται να χάσουμε τίποτα.
Για να δούμε όλους τους κλάδους που περιέχουν εργασία που δεν έχουμε συγχωνεύσει σε κάποιον άλλο κλάδο ακόμα, μπορούμε να εκτελέσουμε την εντολή git branch --no-merged:
$ git branch --no-merged
testing
Αυτή δείχνει τον άλλο μας κλάδο.
Επειδή αυτός ο κλάδος περιέχει εργασία που δεν έχει ακόμα συγχωνευτεί σε κάποιον άλλο κλάδο, αν αποπειραθούμε να τον διαγράψουμε με την εντολή git branch -d θα αποτύχει:
$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.
Αν πραγματικά θέλουμε να διαγράψουμε έναν τέτοιο κλάδο και να χάσουμε τη δουλειά που περιέχει, μπορούμε να επιβάλουμε τη διαγραφή με την επιλογή -D, όπως υποδεικνύει και το παραπάνω μήνυμα.
|
Tip
|
Εφόσον δεν δώσετε το όνομα μίας υποβολής ή ενός κλάδου οι επιλογές Μπορείτε επίσης να δώσετε μία επιπρόσθετη παράμετρο για να ρωτήσετε την κατάσταση συγχώνευσης σε σχέση με κάποιον άλλο κλάδο χωρίς να έχετε μεταβεί σε αυτό τον κλάδο προηγουμένως, όπως για παράδειγμα, τι δεν έχει συγχωνευτεί στον κλάδο
|
Μετονομασία κλάδου
|
Caution
|
Μην μετονομάζουμε κλάδους που χρησιμοποιούνται ακόμα από άλλους συνεργάτες. Μην μετονομάζουμε κλάδους όπως τους master/main/mainline χωρίς να έχουμε διαβάσει την ενότητα Αλλαγή του ονόματος του κύριου κλάδου. |
Ας υποθέσουμε ότι έχουμε έναν κλάδο με το όνομα bad-branch-name και θέλουμε να το αλλάξουμε σε corrected-branch-name, διατηρώντας όλο το ιστορικό.
Επίσης θέλουμε να αλλάξουμε το όνομα του κλάδου στον απομακρυσμένο (GitHub, GitLab, ή άλλο) διακομιστή.
Πώς μπορούμε να το κάνουμε;
Μετονομάζουμε τον κλάδο τοπικά με την εντολή git branch --move:
$ git branch --move bad-branch-name corrected-branch-name
Η εντολή αυτή αντικαθιστά το bad-branch-name με το corrected-branch-name, αλλά αυτή η αλλαγή προς το παρόν έχει γίνει μόνο τοπικά.
Για να δουν και οι άλλοι τον διορθωμένο κλάδο, πρέπει να τον ωθήσουμε:
$ git push --set-upstream origin corrected-branch-name
Ας δούμε τώρα που βρισκόμαστε:
$ git branch --all
* corrected-branch-name
main
remotes/origin/bad-branch-name
remotes/origin/corrected-branch-name
remotes/origin/main
Παρατηρήρουμε ότι βρίσκομαστε στον κλάδο corrected-branch-name και ότι επιπλέον είναι διαθέσιμος και στον απομακρυσμένο διακομιστή.
Όμως και ο κλάδος με το προηγούμενο λάθος όνομα υπάρχει ακόμα στον απομακρυσμένο διακομιστή, αλλά μπορούμε να τον διαγράψουμε εκτελώντας την ακόλουθη εντολη:
$ git push origin --delete bad-branch-name
Τώρα το παλιό όνομα κλάδου έχει αντικαταστεθί πλήρως από το διορθωμένο όνομα.
Αλλαγή του ονόματος του κύριου κλάδου
|
Warning
|
Η μετονομασία των κλάδων όπως οι master/main/mainline/default θα διακόψει την αφομοίωση, τις υπηρεσίες, τα βοηθητικά προγράμματα και τα script μεγαλώττισης που χρησιμοποιεί το αποθετήριό μας. Πριν το κάνουμε, οπωσδήποτε ενημερώνουμε τους συνεργάτες μας. Επίσης, κάνουμε μια ενδελεχή αναζήτηση στο αποθετήριό μας και ενημερώνουμε αναφορές στο παλιό όνομα του κύριου κλάδου μας στον κώδικα και τα script μας. |
Μπορούμε να μετονομάσουμε τον τοπικό μας κλάδο master σε main με την εξής εντολή:
$ git branch --move master main
Πλέον δεν υπάρχει τοπικός κλάδος master, διότι έχει μετονομαστεί σε main.
Για να δουν και οι άλλοι τον κλάδο main, πρέπει να τον ωθήσουμε στον απομακρυσμένο διακομιστή.
Αυτό γίνεται με την εξής εντολή.
$ git push --set-upstream origin main
Έχουμε καταλήξει στην ακόλουθη κατάσταση:
$ git branch --all
* main
remotes/origin/HEAD -> origin/master
remotes/origin/main
remotes/origin/master
Ο τοπικός μας κλάδος master έχει εξαφανιστεί, αφού αντικαταστάθηκε από τον κλάδο main.
Ο κλάδος main υπάρχει στον απομακρυσμένο διακομιστή.
Όμως και ο κλάδος master υπάρχει ακόμα στον απομακρυσμένο διακομιστή.
Κάποιοι συνεργάτες μας θα συνεχίσουν να χρησιμοποιούν τον κλάδο master ως τον κύριο κλάδο τους, μέχρι να κάνουμε μερικές ακόμα αλλαγές.
Πρέπει να κάνουμε μερικά ακόμα πράγματα ώστε να ολοκληρώσουμε τη μετάβαση:
-
Όσα έργα εξαρτώνται από αυτό, θα πρέπει να ενημερώσουν τον κώδικά τους ή/και την παραμετροποίησή τους.
-
Ενημερώνουμε όποια αρχεία παραμετροποίησης test-runner έχουμε.
-
Προσαρμόζουμε τα script build και release.
-
Ενημερώνουμε ρυθμίσεις στον διακομιστή του αποθετηρίου μας όσον αφορά στον προεπιλεγμένο κλάδο, τους κανόνες συγχώνευσης και ό,τι άλλο χρησιμοποιεί ονόματα κλάδων.
-
Ενημερώνουμε αναφορές στον παλιό όνομα στην τεκμηρίωση.
-
Κλείνουμε ή συγχωνεεύουμε όσα αιτήματα ελκυσμού έχουν ως στόχο τον παλιό κλάδο.
Αφού έχουμε κάνει όλα αυτά και είμαστε σίγουροι ότι ο κλάδος main αποδίδει όπως απέδιδε και ο κλάδος master, μπορούμε να διαγράψουμε τον κλάδο master:
$ git push origin --delete master