-
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 stash και clean
- 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 στο Eclipse
- A1.4 Το Git στο Bash
- A1.5 Το Git στο Zsh
- A1.6 Το Git στο Powershell
- A1.7 Ανακεφαλαίωση
-
A2. Appendix B: Ενσωμάτωση του Git στις εφαρμογές μας
- A2.1 Γραμμή εντολών Git
- A2.2 Libgit2
- A2.3 JGit
-
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 Εντολές διοχέτευσης
2.5 Τα θεμελιώδη στοιχεία του Git - Δουλεύοντας με απομακρυσμένα αποθετήρια
Δουλεύοντας με απομακρυσμένα αποθετήρια
Για να μπορέσουμε να συνεργαστούμε σε οποιοδήποτε έργο στο Git, θα πρέπει να γνωρίζουμε πώς να διαχειριζόμαστε τα απομακρυσμένα αποθετήριά μας. Τα απομακρυσμένα αποθετήρια είναι συγκεκριμένες εκδόσεις ενός έργου οι οποίες βρίσκονται στο διαδίκτυο ή σε κάποιο δίκτυο. Μπορούμε να δημιουργήσουμε όσα θέλουμε, συνήθως τα αποθετήρια αυτά είναι προσβάσιμα από εμάς μόνο. Για να μπορέσουμε να συνεργαστούμε με άλλους και να τους κοινοποιήσουμε τη δουλειά μας, θα πρέπει να μπορούμε να διαχειριστούμε τα αποθετήρια αυτά, να έλκουμε και να ωθούμε δεδομένα από και σε αυτά. Η διαχείριση τέτοιων αποθετηρίων χρειάζεται ικανότητες όπως: πρόσθεση καινούριων απομακρυσμένων αποθετηρίων, διαγραφή αποθετηρίων που δεν είναι πλέον σε ισχύ, διαχείριση απομακρυσμένων κλάδων και πολλά άλλα. Στο κεφάλαιο αυτό, θα ασχοληθούμε με κάποιες από αυτές τις ικανότητες.
Εμφάνιση των απομακρυσμένων αποθετηρίων μας
Για να δούμε τους απομακρυσμένους διακομιστές που έχουμε ρυθμίσει, εκτελούμε την εντολή git remote
.
Η εντολή αυτή θα μας επιστρέψει μια λίστα με τα ονόματα των απομακρυσμένων που έχουμε ορίσει.
Αν έχουμε κλωνοποιήσει το δικό μας αποθετήριο, θα πρέπει να πάρουμε σαν αποτέλεσμα το όνομα origin. Αυτό είναι το προεπιλεγμένο όνομα που δίνει το Git στον διακομιστή από τον οποίο μόλις κλωνοποιήσαμε:
$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin
Μπορούμε επίσης να χρησιμοποιήσουμε την επιλογή -v
, η οποία θα μας επιστρέψει τα ονόματα των απομακρυσμένων αποθετηρίων μας μαζί με τις διευθύνσεις που είναι συσχετισμένες για εγγραφή και ανάγνωση σε αυτά:
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
Αν έχουμε περισσότερα απομακρυσμένα, η εντολή αυτή θα τα απαριθμήσει όλα. Για παράδειγμα, αν συνεργάζονται πολλά άτομα σε ένα αποθετήριο τότε μπορεί να έχει και αντίστοιχα πολλά απομακρυσμένα:
$ cd grit
$ git remote -v
bakkdoor https://github.com/bakkdoor/grit (fetch)
bakkdoor https://github.com/bakkdoor/grit (push)
cho45 https://github.com/cho45/grit (fetch)
cho45 https://github.com/cho45/grit (push)
defunkt https://github.com/defunkt/grit (fetch)
defunkt https://github.com/defunkt/grit (push)
koke git://github.com/koke/grit.git (fetch)
koke git://github.com/koke/grit.git (push)
origin git@github.com:mojombo/grit.git (fetch)
origin git@github.com:mojombo/grit.git (push)
Αυτό μας βοηθάει ώστε να πάρουμε τις αλλαγές και τις συνεισφορές των άλλων χρηστών αρκετά εύκολα. Επιπλέον μπορούμε, αν έχουμε την εξουσιοδότηση, να ωθήσουμε αλλαγές σε αυτά. Η εντολή αυτή δεν μας δίνει πληροφορίες για το αν έχουμε την εξουσιοδότηση αυτή.
Ας σημειωθεί ότι τα απομακρυσμένα αποθετήρια χρησιμοποιούν μια πληθώρα από πρωτόκολλα. Θα καλύψουμε αναλυτικά τα πρωτόκολλα αυτά στο κεφάλαιο Εγκατάσταση του Git σε διακομιστή.
Προσθέτοντας απομακρυσμένα αποθετήρια
Πάμε να δούμε, λοιπόν, πώς να προσθέσουμε απομακρυσμένα αποθετήρια πιο αναλυτικά (έχουμε αναφερθεί πιο περιληπτικά σε αυτό σε προηγούμενα κεφάλαια).
Για να δώσουμε ένα συντομευμένο όνομα στο απομακρυσμένο αποθετήριο ώστε να μπορούμε να αναφερόμαστε σε αυτό εύκολα, εκτελούμε την εντολή git remote add [shortname] [url]
:
$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
pb https://github.com/paulboone/ticgit (fetch)
pb https://github.com/paulboone/ticgit (push)
Τώρα πλέον μπορούμε να χρησιμοποιούμε στη γραμμή εντολών τη συμβολοσειρά pb
αντί για ολόκληρη τη διεύθυνση του αποθετηρίου.
Για παράδειγμα, αν θέλουμε να πάρουμε όλες τις πληροφορίες που έχει ο Paul στο αποθετήριό του, μπορούμε να εκτελέσουμε την εντολή git fetch pb
:
$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
* [new branch] master -> pb/master
* [new branch] ticgit -> pb/ticgit
Πλέον έχουμε πρόσβαση στον κύριο κλάδο του Paul ως pb/master
. Μπορούμε να κάνουμε διάφορες ενέργειες όπως για παράδειγμα να τον συγχωνεύσουμε σε έναν από τους δικούς μας κλάδους, ή να ενημερώσουμε έναν τοπικό μας κλάδο.
Θα δούμε περισσότερα για τους κλάδους και πώς μπορούμε να τους χρησιμοποιήσουμε στο κεφάλαιο [ch03-git-branching].
Ανάκτηση δεδομένων από απομακρυσμένα αποθετήρια
Όπως μόλις είδαμε, για να πάρουμε δεδομένα από απομακρυσμένα έργα, μπορούμε να εκτελέσουμε:
$ git fetch [remote-name]
Η εντολή αυτή θα έλξει από το απομακρυσμένο έργο όλα τα δεδομένα του που δεν έχουμε ακόμα. Αφού εκτελέσουμε την εντολή αυτή, θα έχουμε πρόσβαση σε όλους τους κλάδους αυτού του απομακρυσμένου έργου. Τους κλάδους αυτούς μπορούμε έπειτα να τους συγχωνεύσουμε ή να τους αναλύσουμε περαιτέρω.
Αν κλωνοποιήσουμε ένα αποθετήριο, ουσιαστικά το αποθηκεύουμε με το όνομα origin
.
Οπότε, η εντολή git fetch origin
θα έλξει όλες τις νέες αλλαγές που έχουν γίνει από τότε που κλωνοποιήσαμε το αποθετήριο ή έλξαμε δεδομένα για τελευταία φορά από αυτό.
Είναι σημαντικό να τονίσουμε ότι η εντολή git fetch
τραβά δεδομένα στο τοπικό μας αποθετήριο. Η εντολή αυτή δεν συγχωνεύει τα δεδομένα αυτά με διάφορες αλλαγές που μπορεί να έχουμε κάνει εμείς τοπικά.
Για αυτό, θα πρέπει να κάνουμε τη συγχώνευση χειροκίνητα όταν είμαστε εμείς έτοιμοι.
Αν έχουμε δημιουργήσει έναν κλάδο για να παρακολουθούμε έναν απομακρυσμένα κλάδο (περισσότερες λεπτομέρειες για αυτό στο επόμενο κεφάλαιο, [ch03-git-branching]), μπορούμε να χρησιμοποιήσουμε την εντολή git pull
. Η εντολή αυτή θα πάρει έναν απομακρυσμένο κλάδο και θα τον συγχωνεύσει αυτόματα στον τρέχοντα κλάδο μας.
Αυτή η ροή εργασιών είναι γενικά πιο εύκολη για εμάς. Η εντολή git clone
θέτει αυτόματα τον τοπικό μας κύριο κλάδο να παρακολουθεί τις αλλαγές το απομακρυσμένου κύριου κλάδου (ή όπως έχουμε ονομάσει τον προεπιλεγμένο μας κλάδο).
Εκτελώντας έπειτα την εντολή git pull
, έλκουμε δεδομένα από τον διακομιστή που αρχικά είχαμε κλωνοποιήσει, και συγχωνεύουμε τα δεδομένα αυτά με τον κώδικα στον οποίο δουλεύουμε.
Ώθηση δεδομένων σε απομακρυσμένα αποθετήρια
Όταν έχουμε κάποιο έργο στο οποίο έχουμε κάνει αλλαγές και το έχουμε φτάσει σε σημείο που θέλουμε να το κοινοποιήσουμε, θα πρέπει να το ωθήσουμε.
Η εντολή είναι απλή: git push [remote-name] [branch-name]
.
Αν θέλουμε για παράδειγμα να ωθήσουμε τον τοπικό μας κύριο κλάδο στον απομακρυσμένο διακομιστή origin
(η εντολή κλωνοποίησης ενός αποθετηρίου μας βοηθάει για να έχουμε ρυθμισμένα σωστά τα ονόματα αυτά), θα πρέπει να εκτελέσουμε την εντολή αυτή έτσι ώστε να στείλουμε όσες υποβολές έχουμε κάνει πίσω στον διακομιστή:
$ git push origin master
Η εντολή αυτή θα εκτελεστεί επιτυχώς μόνο αν έχουμε κλωνοποιήσει από έναν διακομιστή στον οποίο έχουμε δικαιώματα εγγραφής δεδομένων και αν κανείς άλλος δεν έχει ωθήσει δεδομένα στο μεσοδιάστημα Αν εμείς και κάποιος άλλος έχουμε κλωνοποιήσει το έργο την ίδια ώρα και αυτός ωθήσει δεδομένα πίσω στον διακομιστή πριν από εμάς, η δικιάς μας εντολή για ώθηση δεδομένων θα απορριφθεί. Αυτό που θα πρέπει να κάνουμε είναι να έλξουμε τις αλλαγές του άλλου και να τις ενσωματώσουμε στις δικές μας, ώστε να μπορούμε να ωθήσουμε. Στο κεφάλαιο [ch03-git-branching] θα δούμε περισσότερες πληροφορίες σχετικά με την ώθηση δεδομένων σε απομακρυσμένους διακομιστές.
Εξετάζοντας ένα απομακρυσμένο αποθετήριο
Αν θέλουμε να δούμε περισσότερες πληροφορίες σχετικά με ένα απομακρυσμένο αποθετήριο, μπορούμε να χρησιμοποιήσουμε την εντολή git remote show [remote-name]
.
Αν για παράδειγμα εκτελέσουμε την εντολή αυτή για ένα αποθετήριο με το συντομευμένο όνομα origin
, θα δούμε ως αποτέλεσμα:
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
Όπως βλέπουμε, η εντολή μας επιστρέφει τη διεύθυνση του απομακρυσμένου αποθετηρίου καθώς και τους κλάδους που παρακολουθούμε.
Επίσης μας ενημερώνει ότι αν βρισκόμαστε στον κύριο κλάδο και εκτελέσουμε git pull
, θα συγχωνευτούν ο κύριος κλάδος με τον απομακρυσμένο κύριο κλάδο.
Επίσης μας ενημερώνει για τους απομακρυσμένους κλάδους που έχει έλξει.
Το παραπάνω είναι ένα απλό παράδειγμα που μπορεί να συναντήσουμε.
Όταν αρχίσουμε να χρησιμοποιούμε πιο εκτεταμένα το Git, μπορεί να δούμε πολύ περισσότερες πληροφορίες με την εντολή git remote show
, για παράδειγμα:
$ git remote show origin
* remote origin
URL: https://github.com/my-org/complex-project
Fetch URL: https://github.com/my-org/complex-project
Push URL: https://github.com/my-org/complex-project
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
markdown-strip tracked
issue-43 new (next fetch will store in remotes/origin)
issue-45 new (next fetch will store in remotes/origin)
refs/remotes/origin/issue-11 stale (use 'git remote prune' to remove)
Local branches configured for 'git pull':
dev-branch merges with remote dev-branch
master merges with remote master
Local refs configured for 'git push':
dev-branch pushes to dev-branch (up to date)
markdown-strip pushes to markdown-strip (up to date)
master pushes to master (up to date)
Η εντολή μας δείχνει σε αυτήν την περίπτωση σε ποιον κλάδο ωθούμε δεδομένα όταν βρισκόμαστε σε συγκεκριμένους κλάδους και εκτελούμε την εντολή git push
.
Επίσης μας δείχνει ποιους απομακρυσμένους κλάδους του διακομιστή δεν έχουμε ακόμα, τους απομακρυσμένους κλάδους που έχουμε, αλλά έχουν αφαιρεθεί από τον διακομιστή, καθώς και τους κλάδους που θα συγχωνευτούν αυτόματα αν εκτελέσουμε την εντολή git pull
.
Αφαιρώντας και μετονομάζοντας απομακρυσμένα αποθετήρια
Αν θέλουμε να μετονομάσουμε την αναφορά που έχουμε σε ένα απομακρυσμένο αποθετήριο, εκτελούμε την εντολή git remote rename
ώστε να αλλάξουμε το συντομευμένο όνομά του.
Για παράδειγμα, αν θέλουμε να μετονομάσουμε το pb
σε paul
, μπορούμε να εκτελέσουμε git remote rename
:
$ git remote rename pb paul
$ git remote
origin
paul
Αξίζει να σημειώσουμε ότι η εντολή αυτή αλλάζει επίσης και τα ονόματα των απομακρυσμένων κλάδων.
Για παράδειγμα, ένας κλάδος που αναφερόταν ως pb/master
πλέον θα αναφέρεται ως paul/master
.
Μπορεί επίσης για κάποιο λόγο να θέλουμε να διαγράψουμε ένα απομακρυσμένο αποθετήριο. Για παράδειγμα, μπορεί να έχουμε μετακινήσει τον διακομιστή σε άλλη διεύθυνση, ή να μην χρησιμοποιούμε το συγκεκριμένο αποθετήριο, ή απλά να μην θέλουμε να συνεισφέρουμε πλέον σε αυτό. Σε αυτήν την περίπτωση μπορούμε να χρησιμοποιήσουμε την εντολή git remote rm
:
$ git remote rm paul
$ git remote
origin