Στο σημερινό μάθημα θα συνεχίσουμε την εισαγωγή στο git. Αν δεν το έχεις κάνει ήδη δες το πρώτο μάθημα, αλλά μπορείς να το κάνεις και αμέσως μετά.
Στο git ο κώδικας (και η ποίηση) δεν υπάρχει σε ένα μόνο υπολογιστή. Σε αντίθεση με την ποίηση όμως, ο κώδικας είναι μια συλλογική προσπάθεια, όπου δεκάδες ή και εκατοντάδες άτομα δουλεύουν μαζί πάνω στα ίδια αρχεία. Ο κώδικας και το ιστορικό υπάρχει σε κάθε υπολογιστή των ατόμων μιας ομάδας. Για καλύτερο συντονισμό η ομάδα χρησιμοποιεί κάποιο git service που είναι μια υπηρεσία web. Αν το έργο είναι δημόσιο ή υπηρεσία αυτή είναι συχνά και η βιτρίνα της ομάδας, το μέρος που εμείς οι υπόλοιποι θα κατεβάσουμε τον μόχθο τους και θα τους αναφέρουμε προβλήματα ή θα ζητήσουμε νέα χαρακτηριστικά.
Έχω δείξει πως μπορείς να έχεις μια τέτοια υπηρεσία σε ένα δικό σου υπολογιστή με την χρήση του gitea.
Αν και εδώ θα χρησιμοποιήσω αυτό, δεν υπάρχει καμία σημαντική διαφορά από οποιαδήποτε άλλη υπηρεσία.
Τι είναι ενα git remote
Είναι με απλά λόγια το μακρυνό εκείνο μέρος που είναι αποθηκευμένος ο κώδικας. Και μπορούμε να έχουμε πολλά τέτοια μέρη. Στο καθένα θα του δώσουμε το δικό του όνομα για να το ξεχωρίζουμε. Αν έχουμε μόνο ένα, που είναι το σύνηθες. τότε το λέμε origin
. Κάθε remote έχει και μια διεύθυνση σαν τις παρακάτω
https://github.com/user/repo.git
git@github.com:user/repo.git
Στην πρώτη μορφή το πρωτόκολλο επικοινωνίας είναι το http
και συνήθως χρησιμοποιείτε από τους πελάτες και όχι από τα μέλη της ομάδας. Η δεύτερη μορφή χρησιμοποιεί το SSH και θα επιλέγουμε αυτή για τα δικά μας αποθετήρια.
git clone, fetch, push, pull
Να ξεκαθαρίσουμε πρώτα τις βασικές ενέργειες που κάνουμε σε ένα απομακρυσμένο αποθετήριο. Με την πρώτη εντολή git clone
κάνουμε ένα αντίγραφο του αποθετηρίου τοπικά στον υπολογιστή μας. Αυτό θα το κάνουμε μια μόνο φορά.
Με την εντολή git push
σπρώχνουμε τις αλλαγές που έχουμε κάνει σε κάποιο κλάδο στο απομακρυσμένο αποθετήριο. Η συνήθης χρήση της εντολής είναι
git push origin master
και θα μεταφέρει τις αλλαγές του εξ ορισμού κλάδου master
στο αποθετήριο με όνομα origin
.
Οι εντολές git fetch
και git pull
θα τραβήξουν αλλαγές που έχουν κάνει τα άλλα μέλη της ομάδας στο τοπικό μας αντίγραφο. Εδώ τα πράγματα δυσκολεύουν. Τι θα συμβεί αν οι αλλαγές που εμείς έχουμε κάνει δεν είναι συμβατές; Αν έχουμε αλλάξει πολλά άτομα την ίδια γραμμή; Θα τα δούμε αυτά σε επόμενα μαθήματα. Προς στιγμήν θα πω μόνο πως η εντολή git fetch
τραβάει απλά τις αλλαγές αλλά δεν πειράζει κανένα αρχείο. Η εντολή git pull
θα κάνει ένα git fetch
πρώτα και μετά θα εφαρμόσει τις αλλαγές. Αν είμαστε οι μόνοι δημιουργοί και ξέρουμε πως πάντα κάνουμε git push
αυτή θέλουμε να ξέρουμε, τουλάχιστον για τα πρώτα μας βήματα.
Δημιουργία απομακρυσμένου αποθετηρίου
Υπάρχουν πολλά σενάρια, να το φτιάξουμε ενώ έχουμε γράψει ήδη κάποιο κώδικα, να πάρουμε τον κώδικα από κάποιο άλλο αποθετήριο, ή αυτό που θα δείξω εδώ, να ξεκινήσουμε με την δημιουργία του αποθετηρίου σαν το πρώτο μας βήμα.
Την τελευταία περίπτωση θα δείξω εδώ, και αν υπάρχει ενδιαφέρον θα επανέλθω και με άλλα σενάρια. Θα χρησιμοποιήσω το gitea, αλλά λίγα πράγματα θα αλλάξουν αν χρησιμοποιήσουμε κάτι άλλο.
Το πρώτο βήμα είναι να φτιάξουμε το αποθετήριο
θα πρέπει να απαντήσουμε σε κάποιες βασικές ερωτήσεις
Είναι καλή ιδέα να βάλουμε ένα αρχείο README που να εξηγεί τι κάνει το αποθετήριο, κάποια κατάλληλη άδεια χρήσης, και ένα αρχείο
.gitignore
, το οποίο περιέχει πραγματα που δεν θέλουμε να είναι στο αποθετήριο, εκτός αν ρητά το ζητήσουμε. Το gitea έχει κάποια πρότυπα για αυτά τα αρχεία τα οποία πάντα μπορούμε στην συνέχεια να τα αλλάξουμε.
Το νέο μας αποθετήριο είναι έτοιμο.
Κλωνοποίηση
Θα επιλέξουμε από την σελίδα το πρωτόκολλο ssh
και θα πατήσουμε το πλήκτρο copy όπως δείχνει η εικόνα. Αν δεν έχουμε δικαιώματα εγγραφής στο αποθετήριο και απλά θέλουμε τον κώδικα θα επιλέξουμε το http
. Σε ενα τερματικό θα πάμε στον κατάλογο που θέλουμε τα αρχεία και θα δώσουμε την εντολή
git clone git@____________________.git
κάνοντας επικόλληση την διεύθυνση. Έχουμε πλέον ένα τοπικό αντίγραφό στον υπολογιστή μας.
Χρήση απομακρυσμένου αποθετηρίου
Ας κάνουμε κάποιες αλλαγές
echo "Αρνάκι άσπρο και παχύ" > arni.txt
και ας τις περάσουμε στο απομακρυσμένο αποθετήριο
git add arni.txt
git commit -m "Η πρώτη γραμμή"
git status
git push origin master
Πρώτα θα πούμε στο git πως μας ενδιαφέρει να κρατήσει τις αλλαγές git add
, μετά θα του πούμε να τις κρατήσει στα αλήθεια λέγοντας και στην ομάδα το τι αλλάξαμε git commit
και μετά θα στείλουμε τις αλλαγές στο απομακρυσμένο αποθετήριο. Ουφ !!
workspace, index, local, remote
Αν καταλάβεις το παρακάτω έχεις καταλάβει πολλά. Το ερώτημα που πρέπει να απαντηθεί είναι απλό: Που είναι αποθηκευμένα τα αρχεία μου; Η απάντηση δεν είναι στον φάκελο που σου δείχνει το IDE σου. Τα αρχεία εκεί είναι θα έλεγα αδιάφορα
Αυτό που βλέπεις είναι το workspace κάποιος προσωρινός χώρος εργασίας. Τα αρχεία είναι στο local repository στο τοπικό αποθετήριο. Που είναι αυτό; Είναι κρυμμένο μέσα σε ενα κρυφό φάκελο με την ονομασία .git
. Στο αποθετήριο μπορούμε να βάλουμε μόνο πακέτα αλλαγών, δεν μπορούμε να βάλουμε, άμεσα τουλάχιστον, αρχεία. Προετοιμάζουμε ένα σύνολο από αλλαγές βάζοντας τα πρώτα σε και που λέμε index.
Τις αλλαγές τις στέλνουμε στην συνέχεια στο απομακρυσμένο αποθετήριο remote repository. Το παρακάτω σχήμα είναι αρκετά χρήσιμο. Ξέρουμε ήδη τις μισές εντολές, αλλά είναι αρκετές για να φτιάξεις στο git το επόμενο έργο σου.
Επόμενα βήματα
Εδώ θα βρεις οτι υπαχει εδώ μεσα για το git Νήματα με ετικέτες git