git
master
ή main
)ή εναλλακτικά:
Όλες οι εντολές του git
συντάσσονται ως δύο λέξεις, π.χ.:
Για να δούμε το εκάστοτε help page απλά δίνουμε στην εντολή που μας ενδιαφέρει την παράμετρο --help
, δηλαδή:
Στο git
υπάρχει η έννοια της προετοιμασίας (staging) ενός commit. Όσα αρχεία (ή αλλαγές) κρίνεται ότι είναι έτοιμα γίνονται stage για commit με την git add
, π.χ:
Για να γίνουν commit οι αλλαγές χρησιμοποιούμε την git commit
.
Όταν εκτελείται η git commit
το Git μαζεύει τα αρχεία που κάναμε stage με την git add
και αποθηκεύει ένα αντίγραφο μέσα στον φάκελο .git
. Αυτό το αντίγραφο αποτελεί το commit και το d37b3ae
είναι το αναγνωριστικό του.
Με την παράμετρο -m
δώσαμε το commit message (την περιγραφή των αλλαγών). Καλό είναι το μήνυμα αυτό να είναι περιεκτικό και να συμπληρώνει την πρόταση "this commit will/does/is…". Για περαιτέρω διάβασμα:
Ας προχωρήσουμε να προσθέσουμε και το 2ο φάκελο σε νέο commit:
Aν εκτελέσουμε τώρα πλέον git status
βλέπουμε τα εξής:
Επιπλέον με την git log
μπορούμε να δούμε το ιστορικό των αλλαγώ:
Π.χ. ας αλλάξουμε το username zzz
σε beta
χρησιμοποιώντας έναν editor, π.χ.:
Πριν κάνουμε οτιδήποτε μπορούμε να δούμε τι αλλαγές κάναμε ως diff
με την εντολή git diff
:
Αν οι αλλαγές είναι ΟΚ μπορούμε να προχωρήσουμε σε stage (git add
) και commit (git commit
):
ή
Ο τρόπος να αναιρέσουμε ένα commit είναι με την git revert
η οποία δέχεται ως όρισμα ένα commit id και επί της ουσίας εφαρμόζει ένα νέο commit με το "αρνητικό" του commit id.
.gitignore
Αν έχουμε αρχεία που δεν θέλουμε να αποτελέσουν μέρος του repository (π.χ. αρχεία με κωδικούς ή binary αρχεία) τότε χρησιμοποιούμε το αρχείο .gitignore
ώστε να υποδείξουμε στο git ποιά είναι τα αρχεία αυτά που δεν θέλουμε να γίνονται track. Ας φτιάξουμε μερικά αρχεία για να δούμε πώς δουλεύει:
Ας χρησιμοποιήσουμε το .gitignore
Αν είναι η πρώτη φορά που χρησιμοποιείτε το GitLab προκειμένου να χρησιμοποιήσετε ssh
για την μεταφορά των περιεχομένων του τοπικού Git repository θα χρειαστεί να ανεβάσετε το public ssh κλειδί σας στο GitLab. Αυτό το κάνετε επιλέγοντας από το avatar σας Edit Profile -> SSH Keys -> Add new key. Αν δεν έχετε φτιάξει ssh κλειδί μπορείτε να φτιάξετε ένα με την εντολή ssh-keygen
.
Για να φτιάξουμε ένα νέο αποθετήριο επιλέγουμε "New Project" -> "Create Blank Project". Στα πεδία επιλέγουμε το namespace, το όνομα και το visibility του project. Εφόσον θα κάνουμε git push
κάποιο υφιστάμενο Git repo καλό και σωστό είναι να μην έχει README.
Για να κάνουμε git push
τα περιεχόμενα από το τοπικό Git repository θα χρειαστεί να εκτελέσουμε τις εξής εντολές:
Αν έχουμε ήδη φτιάξει τοπικά και άλλα branches (πέρα από το main
ή το master
) μπορούμε να επιλέξουμε να τα κάνουμε push όλα μαζί με την εξής
Στο γραφικό περιβάλλον του GitLab επιλέγοντας F5 θα πρέπει να βλέπουμε πλέον ότι τα περιεχόμενα του τοπικού μας repository έχουν αντιγραφεί στο remote repository στο GitLab. Από το μενού Code -> Commits στα αριστερά μπορούμε να δούμε και τα commits που έχουμε κάνει.
Για να κάνουμε git push
επιλέξαμε στα παραπάνω ως remote να ορίσουμε το ssh endpoint (gitlab@repo.it.auth.gr:pkoro/shell-lesson-data.git). Θα μπορούσαμε να ρυθμίσουμε εναλλακτικά το https (https://repo.it.auth.gr/pkoro/shell-lesson-data.git). Ένα αρνητικό που έχει το https σε σχέση με το ssh είναι ότι κάθε φορά μας ζητάει το username password.
Με την εντολή git remote -v
βλέπουμε τι remotes έχουμε ορίσει:
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git |
git push
από το git commit
;H git commit
χρησιμοποιείται για να φτιάξουμε ένα commit (μιά εικόνα ή snapshot του κώδικά μας). H git push
για να μεταφέρουμε όλο το περιεχόμενο προς ένα remote git repository (για να μοιράσουμε τον κώδικά μας δηλαδή όχι για να κάνουμε αλλαγές σε αυτόν).
Εφόσον χρησιμοποιούμε ένα remote ως "source of truth" καλό είναι πλέον στο τοπικό μας repository να μην κάνουμε αλλαγές απευθείας στο main
(ή master
) branch αλλά να κάνουμε αλλαγές σε νέο branch. Για παράδειγμα αν έρθει ένας νέος φοιτητής και θέλουμε να τον προσθέσουμε στο πρόγραμμα είναι εύλογο να ξεκινήσουμε ανοίγωντας ένα νέο branch (π.χ. new_student
) και κάνοντας αλλαγές σε αυτό:
Έπειτα κάνουμε τις αλλαγές μας και όταν είμαστε έτοιμοι:
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git |
Για να περαστεί η αλλαγή και στο remote θα πρέπει να κάνουμε git push
το νέο branch:
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git |
Ανοίγωντας το URL που μας επιστρέφει το GitLab σε ένα browser μας δίνεται η επιλογή να ανοίξουμε ένα "Merge Request".
Στο "Merge Request" καλό και χρήσιμο είναι να βάζουμε καλή περιγραφή σε όλα τα πεδία (Subject και Body) ώστε αυτός που θα το διαβάσει (και ενδεχομένως θα χρειαστεί να κάνει review τις αλλαγές) να έχει μιά καλή αντίληψη του τι περιμένει να δει.
Εφόσον οι αλλαγές γίνουν approve και merge η εικόνα των δύο repositories είναι η εξής:
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git |
Για να φέρουμε τις αλλαγές πίσω στο τοπικό repo θα χρειαστεί να κάνουμε git fetch
το branch main από το remote repository και git merge
στο τοπικό main repository.
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git |
Για να επιτρέψουμε σε ένα συνεργάτη μας να κάνει αλλαγές στο repo που φτιάξαμε στο GitLab θα πρέπει να τον προσθέσουμε στα μέλη (members) του project. Για τα επίπεδα πρόσβασης μας δίνονται διάφορες επιλογές (συνήθως -αν δεν είμαστε σίγουροι- επιλέγουμε Developer ρόλο για συνεργάτες μας που πρόκειται να κάνουν αλλαγές στον κώδικα).
Ο συνεργάτης μας (έστω ο χρήστης beta
) έπειτα μπορεί να κάνει fork το remote repository στο προσωπικό του workspace και να αναλάβει να κάνει αλλαγές σε αυτό.
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git | Remote beta/shell-lesson-data.git |
Αφότου κάνει fork μπορεί να κάνει clone το repository στον υπολογιστή του ο χρήστης beta
.
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git | Remote beta/shell-lesson-data.git | Local (~beta/shell-lesson-data) |
Κατά "τα γνωστά" ο χρήστης beta κάνει κάποιες αλλαγές:
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git | Remote beta/shell-lesson-data.git | Local (~beta/shell-lesson-data) |
Έπειτα θα κάνει git push
τις αλλαγές του στο remote του (επίσης "κατά τα γνωστά"):
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git | Remote beta/shell-lesson-data.git | Local (~beta/shell-lesson-data) |
Το GitLab (όπως και το GitHub) δίνει τη δυνατότητα ένα Merge Request να γίνει από ένα remote προς ένα άλλο. Άρα εφόσον το "source of truth" είναι το pkoro/shell-lesson-data
το Merge Request θα πρέπει να γίνει προς αυτό το remote και συγκεκριμένα προς το main
branch. Αφότου γίνει merge η εικόνα των repositories είναι αυτή:
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git | Remote beta/shell-lesson-data.git | Local (~beta/shell-lesson-data) |
Ο συνεργάτης beta
προκειμένου να κάνει git fetch
και git merge
τις αλλαγές από το remote pkoro/shell-lesson-data
repository θα χρειαστεί να το ορίσει ως νέο remote. Κατά σύμβαση αυτό το remote που έχει το ρόλο "source of truth" το ονομάζουμε upstream
.
~beta/Desktop/shell-lesson-data
Προκειμένου να "συγχρονίσει" πλέον τις αλλαγές οι git fetch
και git merge
θα συνταχθούν ως εξής:
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git | Remote beta/shell-lesson-data.git | Local (~beta/shell-lesson-data) |
Έστω ότι παράλληλα με την αλλαγή στο πρόγραμμα του χρήστη beta
ο χρήστης pkoro
έκανε επίσης κάποια αλλαγή (π.χ. στις ώρες του χρήστη testakos
)
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git | Remote beta/shell-lesson-data.git | Local (~beta/shell-lesson-data) |
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git | Remote beta/shell-lesson-data.git | Local (~beta/shell-lesson-data) |
Καθώς έχει γίνει αλλαγή στην ίδια γραμμή από το Merge Request και commit που προηγήθηκε το GitLab μας ειδοποιεί ότι η νέα αλλαγή δεν μπορεί να περαστεί διότι υπάρχει conflict.
Για να δούμε εποπτικά που υπάρχει το πρόβλημα μπορούμε να επιλέξουμε το κουμπί "Resolve conflicts"
Βλέπουμε ότι η δική μας αλλαγή (our changes) είναι η αφαίρεση του χρήστη testakos
από το πρόγραμμα της Τρίτης. Η αλλαγή που έχει κάνει ο άλλος developer (their changes) είναι η προσθήκη του χρήστη beta
στο πρόγραμμα της Τετάρτης.
Από το γραφικό περιβάλλον μας δίνεται η επιλογή να επιλέξουμε μία από τις δύο αλλά εμείς θα θέλαμε και τις δύο να τις συμπεριλάβουμε. Αυτό μπορεί να γίνει είτε επιλέγοντας στο γραφικό περιβάλλον το κουμπί "Edit Inline" είτε Locally στο τοπικό Git repo. Το GitLab μας δίνει οδηγίες για το δεύτερο αν στην προηγούμενη σελίδα επιλέξουμε "Resolve locally".
git rebase
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git |
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git |
git push
που προηγήθηκε στο remote. Για το λόγο αυτό η git push
πλέον θα αποτύχει:
Προκειμένου να κάνουμε push θα χρειαστεί να χρησιμοποιήσουμε το -f
(ή --force
):
Local (~/Desktop/shell-lesson-data) | Remote pkoro/shell-lesson-data.git |