Chapters ▾ 2nd Edition

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

Εφόσον δεν δώσετε το όνομα μίας υποβολής ή ενός κλάδου οι επιλογές --merged και --no-merged θα σας δείξουν τι έχει ή δεν έχει συγχωνευτεί, αντίστοιχα, στον τρέχοντα κλάδο σας.

Μπορείτε επίσης να δώσετε μία επιπρόσθετη παράμετρο για να ρωτήσετε την κατάσταση συγχώνευσης σε σχέση με κάποιον άλλο κλάδο χωρίς να έχετε μεταβεί σε αυτό τον κλάδο προηγουμένως, όπως για παράδειγμα, τι δεν έχει συγχωνευτεί στον κλάδο master ακόμα;

$ git checkout testing
$ git branch --no-merged master
  topicA
  featureB

Μετονομασία κλάδου

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