Git
Chapters ▾ 2nd Edition

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. Μπορούμε να κάνουμε διάφορες ενέργειες όπως για παράδειγμα να τον συγχωνεύσουμε σε έναν από τους δικούς μας κλάδους, ή να ενημερώσουμε έναν τοπικό μας κλάδο. Θα δούμε περισσότερα για τους κλάδους και πώς μπορούμε να τους χρησιμοποιήσουμε στο κεφάλαιο Διακλαδώσεις στο Git.

Ανάκτηση δεδομένων από απομακρυσμένα αποθετήρια

Όπως μόλις είδαμε, για να πάρουμε δεδομένα από απομακρυσμένα έργα, μπορούμε να εκτελέσουμε:

$ git fetch [remote-name]

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

Αν κλωνοποιήσουμε ένα αποθετήριο, ουσιαστικά το αποθηκεύουμε με το όνομα origin. Οπότε, η εντολή git fetch origin θα έλξει όλες τις νέες αλλαγές που έχουν γίνει από τότε που κλωνοποιήσαμε το αποθετήριο ή έλξαμε δεδομένα για τελευταία φορά από αυτό. Είναι σημαντικό να τονίσουμε ότι η εντολή git fetch τραβά δεδομένα στο τοπικό μας αποθετήριο. Η εντολή αυτή δεν συγχωνεύει τα δεδομένα αυτά με διάφορες αλλαγές που μπορεί να έχουμε κάνει εμείς τοπικά. Για αυτό, θα πρέπει να κάνουμε τη συγχώνευση χειροκίνητα όταν είμαστε εμείς έτοιμοι.

Αν έχουμε δημιουργήσει έναν κλάδο για να παρακολουθούμε έναν απομακρυσμένα κλάδο (περισσότερες λεπτομέρειες για αυτό στο επόμενο κεφάλαιο, Διακλαδώσεις στο Git), μπορούμε να χρησιμοποιήσουμε την εντολή git pull. Η εντολή αυτή θα πάρει έναν απομακρυσμένο κλάδο και θα τον συγχωνεύσει αυτόματα στον τρέχοντα κλάδο μας. Αυτή η ροή εργασιών είναι γενικά πιο εύκολη για εμάς. Η εντολή git clone θέτει αυτόματα τον τοπικό μας κύριο κλάδο να παρακολουθεί τις αλλαγές το απομακρυσμένου κύριου κλάδου (ή όπως έχουμε ονομάσει τον προεπιλεγμένο μας κλάδο). Εκτελώντας έπειτα την εντολή git pull, έλκουμε δεδομένα από τον διακομιστή που αρχικά είχαμε κλωνοποιήσει, και συγχωνεύουμε τα δεδομένα αυτά με τον κώδικα στον οποίο δουλεύουμε.

Ώθηση δεδομένων σε απομακρυσμένα αποθετήρια

Όταν έχουμε κάποιο έργο στο οποίο έχουμε κάνει αλλαγές και το έχουμε φτάσει σε σημείο που θέλουμε να το κοινοποιήσουμε, θα πρέπει να το ωθήσουμε. Η εντολή είναι απλή: git push [remote-name] [branch-name]. Αν θέλουμε για παράδειγμα να ωθήσουμε τον τοπικό μας κύριο κλάδο στον απομακρυσμένο διακομιστή origin (η εντολή κλωνοποίησης ενός αποθετηρίου μας βοηθάει για να έχουμε ρυθμισμένα σωστά τα ονόματα αυτά), θα πρέπει να εκτελέσουμε την εντολή αυτή έτσι ώστε να στείλουμε όσες υποβολές έχουμε κάνει πίσω στον διακομιστή:

$ git push origin master

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

Εξετάζοντας ένα απομακρυσμένο αποθετήριο

Αν θέλουμε να δούμε περισσότερες πληροφορίες σχετικά με ένα απομακρυσμένο αποθετήριο, μπορούμε να χρησιμοποιήσουμε την εντολή 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