Κατηγορίες
tech

Το git και οι κλάδοι (branches)

Με τη χρήση του git δεν χρειάζεται να διστάζουμε να πειραματιστούμε με τον κώδικά μας, γιατί ανά πάσα στιγμή μπορούμε να επαναφέρουμε το αποθετήριο σε μια προηγούμενη κατάσταση. Σε αυτό βοηθούν πολύ και οι κλάδοι.

Αν δεν γνωρίζεται τι είναι το git, διαβάστε πρώτα το άρθρο Το git με απλά λόγια.

Τι είναι οι κλάδοι

Οι κλάδοι είναι μια ανεξάρτητη πορεία εξέλιξης του κώδικα, η οποία αρχίζει σε ένα συγκεκριμένο χρονικό σημείο.

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

Κατά την διάρκεια ανάπτυξης του κώδικα μας, σε οποιαδήποτε στιγμή, μπορούμε να δημιουργήσουμε ένα παρακλάδι το οποίο μπορεί να εξελιχθεί ανεξάρτητα. Έτσι, αφού και ο βασικός μας κώδικας θεωρείται κλάδος, όταν δημιουργήσουμε έναν ακόμη κλάδο, τότε έχουμε δύο ανεξάρτητους αλλά σχετιζόμενους κλάδους. Ο νέος κλάδος αν και ανεξάρτητος, κληρονομεί το παρελθόν του κύριου κλάδου μέχρι εκείνη τη στιγμή.

Πριν εξασκηθούμε στην χρήση των κλάδων, αν δεν αισθανόμαστε άνετα με ένα αποθετήριο που ήδη χρησιμοποιούμε, μπορούμε να δημιουργήσουμε ένα άλλο δοκιμαστικό αποθετήριο στον υπολογιστή μας και πειραματιστούμε εκεί.

Οι βασικές εντολές που θα χρειαστούμε είναι της μορφής:
git branch (προβολή κλάδων),
git branch devel (δημιουργία κλάδου με όνομα devel ή ότι άλλο θέλουμε),
git checkout devel (εναλλαγή κλάδου, μεταφερόμαστε στον κλάδο devel),
git checkout main (εναλλαγή κλάδου, μεταφερόμαστε στον κλάδο που ήδη υπάρχει και ονομάζεται main),
git show v2.3.1:src/myfile.js (προβολή παλαιότερης έκδοσης συγκεκριμένου αρχείου),
git checkout v2.4.1 src/myfile.js (επαναφορά παλαιότερης έκδοσης συγκεκριμένου αρχείου).

Συγχώνευση κλάδων με χρήση merge ή rebase

Αν χρησιμοποιούμε διάφορους κλάδους, το πιθανότερο είναι ότι κάποια στιγμή θα θελήσουμε να ενσωματώσουμε τον κώδικα του ενός στον άλλο. Προτιμούμε να κάνουμε merge ή rebase μόνο σε καλά ορισμένα στάδια της ανάπτυξης, για ελαχιστοποίηση των προβλημάτων. Αποφεύγουμε το rebase επειδή αλλάζει το ιστορικό και ίσως άλλοι που δούλευαν πάνω στον κώδικα μας να έχουν προβλήματα.

Συγχώνευση κλάδων (έλεγχος να μην υπάρχουν εκκρεμότητες πριν την συγχώνευση)
$ git checkout devel
$ git status
$ git checkout main
$ git status
$ git merge devel

Αν ο αποθετήριο χρησιμοποιείται από περισσότερους χρήστες και έχουν κάνει ταυτόχρονα τροποποιήσεις στο ίδιο αρχείο, τότε το merge μπορεί να αποτύχει. Σ’ αυτή την περίπτωση κάνουμε κάτι από τα παρακάτω:

Επίλυση αποτυχίας αυτόματου merge με τροποποίηση του συγκρουόμενου αρχείου
$ git ls-files (στα συγκρουόμενα αρχεία, εμφανίζεται το ίδιο όνομα αρχείου τρεις φορές)
Επεξεργασία του συγκρουόμενου αρχείου (που περιέχει τις πρόσθετες σημειώσεις των διαφορών), ώστε να το φέρουμε στην κατάσταση που επιθυμούμε.
$ git add όνομααρχείου
$ git commit -m "Επίλυση διαφοράς κατά το merge"
$ git ls-files

Επίλυση αποτυχίας αυτόματου merge με επαναφορά στην προηγούμενη κατάσταση
$ git ls-files (εμφανίζεται το ίδιο όνομα αρχείου τρεις φορές)
$ git status
$ git reset --hard main

Ακύρωση διαδικασίας merge (αν δεν θέλουμε να κάνουμε τώρα επίλυση των συγκρούσεων)
$ git status
$ git merge --abort

Επίσης μπορούμε με απλούστερο τρόπο, να έχουμε παραπλήσια λειτουργικότητα, μέσω των κατάλληλων πρόσθετων στο γραφικό περιβάλλον ανάπτυξης που χρησιμοποιούμε, όπως το GitLens στο VSCodium. Δεν πρέπει όμως να ξεχνάμε, ειδικά όταν ο ομάδα ανάπτυξης αποτελείται από πολλά άτομα, ότι η γραμμή εντολών είναι απαραίτητη.

Μπορείτε να μελετήσετε περισσότερα για το git στο https://git-scm.com/doc