-
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 Αποθέματα και Καθαρισμός
- 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 στο Visual Studio Code
- A1.4 Git στο IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git στο Sublime Text
- A1.6 Το Git στο Bash
- A1.7 Το Git στο Zsh
- A1.8 Το Git στο Powershell
- A1.9 Ανακεφαλαίωση
-
A2. Appendix B: Ενσωμάτωση του Git στις εφαρμογές μας
- A2.1 Γραμμή εντολών Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
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.4 Τα θεμελιώδη στοιχεία του Git - Αναιρέσεις (undoing)
Αναιρέσεις (undoing)
Οποιαδήποτε στιγμή, μπορεί να θελήσουμε να αναιρέσουμε κάτι. Σε αυτό το κεφάλαιο, θα δούμε μερικά βασικά εργαλεία με τα οποία μπορούμε να αναιρέσουμε αλλαγές που έχουμε ήδη κάνει. Θα πρέπει να είμαστε προσεκτικοί γιατί δεν θα μπορούμε πάντα να αναιρέσουμε κάποιες από αυτές τις αναιρέσεις. Αυτή είναι μία από τις λίγες περιπτώσεις στο Git όπου μπορεί να χάσουμε μέρος της δουλειάς μας αν κάνουμε τις αναιρέσεις λανθασμένα.
Μια συχνή αναίρεση που χρησιμοποιείται είναι η περίπτωση κατά την οποία υποβάλλουμε κάτι πολύ νωρίς και ενδεχομένως ξεχάσουμε να προσθέσουμε κάποια αρχεία ή κάνουμε κάποιο σφάλμα στο μήνυμα υποβολής.
Αν θέλουμε να ξανακάνουμε τη συγκεκριμένη υποβολή, να προσθέσουμε τις αλλαγές που ξεχάσαμε, να τις βάλουμε στο στάδιο καταχώρησης και να τις ξαναϋποβάλλουμε, θα πρέπει να χρησιμοποιήσουμε την επιλογή --amend:
$ git commit --amend
Η εντολή αυτή παίρνει το στάδιο καταχώρησης και το χρησιμοποιεί για την υποβολή. Αν δεν έχουμε κάνει περαιτέρω αλλαγές από την τελευταία μας υποβολή (για παράδειγμα, αν εκτελέσουμε αυτή την εντολή αμέσως μετά από μια υποβολή), τότε το στιγμιότυπο του αποθετηρίου θα είναι ακριβώς το ίδιο και το μόνο που θα αλλάξαμε είναι το μήνυμα υποβολής.
Όταν εκτελέσουμε την εντολή, θα εκκινήσει ο επεξεργαστής κειμένου, που θα περιέχει το μήνυμα της προηγούμενης υποβολής μας. Μπορούμε να επεξεργαστούμε το μήνυμα ως συνήθως, αλλά θα αντικαταστήσει την τελευταία μας υποβολή.
Για παράδειγμα, αν κάνουμε μια υποβολή και μετά διαπιστώσουμε ότι ξεχάσαμε να καταχωρήσουμε τις αλλαγές ενός αρχείου που θέλουμε να συμπεριλάβουμε στην υποβολή αυτή, τότε μπορούμε να:
$ git commit -m 'Initial commit'
$ git add forgotten_file
$ git commit --amend
Καταλήγουμε με μια και μοναδική υποβολή· η δεύτερη υποβολή αντικαθιστά τα αποτελέσματα της πρώτης.
|
Note
|
Είναι σημαντικό να καταλάβετε ότι όταν τροποποιούμε (amend) την τελευταία σας υποβολή, στην πραγματικότητα δεν την τροποποιείτε αλλά την αντικαθιστείτε με μια εντελώς νέα, βελτιωμένη υποβολή που διώχνει την παλιά υποβολή και βάζει την νέα υποβολή στη θέση της. Ουσιαστικά, είναι σαν η προηγούμενη υποβολή να μη συνέβη ποτέ και δεν θα εμφανίζεται στο ιστορικό του αποθετηρίου. Η αξία της τροποποίησης των υποβολών είναι ότι κάνετε ελάσονες βελτιώσεις στην τελευταία σας υποβολή, χωρίς να μπουκώνετε το ιστορικό του αποθετηρίου σας με μηνύματα υποβολής της μορφής “Ωχ, ξέχασα να προσθέσω ένα αρχείο” ή “Να πάρει, διόρθωσα ένα τυπογραφικό στην προηγούμενη υποβολή”. |
|
Note
|
Να τροποποιείτε (amend) υποβολές που υπάρχουν μόνο τοπικα και δεν τις έχετε ωθήσει πουθενά. Η τροποποίηση υποβολών που έχουν ήδη ωθηθεί και η ώθησή του κλάδου θα δημουργήσει προβλήματα στους συνεργάτες σας. Περισσότερες λεπτομέρειες για το τι συμβαίνει όταν κάνετε κάτι τέτοιο, και πώς να το διορθώσετε όταν είμαστε αυτός που την πατάει υπάρχουν στο Οι κίνδυνοι της αλλαγής βάσης. |
Αφαίρεση αρχείου από το στάδιο καταχώρησης (staging)
Στις επόμενες δύο ενότητες θα δούμε πώς μπορούμε να διαχειριστούμε τις αλλαγές που έχουν γίνει στο στάδιο κατάχωρησης και στον κατάλογο εργασίας.
Το καλό είναι ότι η εντολή που χρησιμοποιούμε για να προσδιορίσουμε την κατάσταση αυτών των δύο περιοχών, μας υπενθυμίζει και πώς να αναιρέσουμε τις αλλαγές σε αυτές τις περιοχές.
Για παράδειγμα, έστω ότι έχουμε κάνει αλλαγές σε δύο αρχεία και θέλουμε να τα υποβάλλουμε ως ξεχωριστές αλλαγές, αλλά τα υποβάλαμε κατά λάθος και τα δύο με την εντολή git add *.
Πώς μπορούμε να αναιρέσουμε την καταχώριση του ενός από τα δύο;
Η εντολή git status μας υπενθυμίζει:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
Ακριβώς κάτω από το “Changes to be committed”, μας λέει να εκτελέσουμε git reset HEAD <file>… ώστε να αφαιρέσουμε την αλλαγή από το στάδιο καταχώρησης.
Ας χρησιμοποιήσουμε λοιπόν αυτή τη συμβουλή για το αρχείο CONTRIBUTING.md:
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Η εντολή φαίνεται λίγο περίεργη, αλλά κάνει τη δουλειά.
Το αρχείο CONTRIBUTING.md είναι τροποποιημένο, αλλά δεν βρίσκεται στο στάδιο καταχώρησης.
|
Note
|
Πράγματι, η εντολή |
Προς το παρόν, το μόνο που χρειάζεται να γνωρίζουμε για την εντολή git reset είναι η παραπάνω χρήση της.
Θα μπούμε σε περισσότερες λεπτομέρειες για το τι κάνει η εντολή reset και πώς να γίνουμε καλύτεροι, ώστε να κάνουμε πραγματικά ενδιαφέροντα πράγματα στην ενότητα Απομυθοποίηση της reset.
Αναίρεση τροποποίησης ενός αρχείου
Τι μπορούμε να κάνουμε όμως αν διαπιστώσουμε ότι δεν θέλουμε να κρατήσουμε τις αλλαγές που κάναμε στο αρχείο CONTRIBUTING.md;
Πώς μπορούμε να το ξετροποποιήσουμε εύκολα — να το φέρουμε στη μορφή που είχε στην τελευταία του υποβολή (ή όπως ήταν όταν το κλωνοποιήσαμε ή όπως το φέραμε στον κατάλογο εργασίας μας);
Ευτυχώς, η εντολή git status μας λέει πώς να το κάνουμε.
Στο αποτέλεσμα του προηγούμενου παραδείγματος, η περιοχή με τα μη καταχωρημένα αρχεία είναι κάπως έτσι:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Η εντολή μας πληροφορεί ρητά πώς να απορρίψουμε τις αλλαγές που έχουμε κάνει. Ας κάνουμε ό,τι λέει:
$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
Μπορούμε να δούμε ότι οι αλλαγές έχουν επανέρθει στην προηγούμενη μορφή.
|
Important
|
Είναι σημαντικό να καταλάβουμε ότι η εντολή |
Αν θέλουμε να κρατήσουμε τις αλλαγές που κάνουμε στο αρχείο, αλλά παρόλα αυτά χρειάζεται να το κάνουμε στην άκρη, θα πρέπει να εξετάσουμε τη φύλαξη των αλλαγών (stashing) και τη διακλάδωση (branching) στο κεφάλαιο Διακλαδώσεις στο Git, αυτοί συνήθως είναι καλύτεροι τρόποι.
Θυμόμαστε, ότι έχει υποβληθεί (committed) στο Git μπορεί σχεδόν πάντα να ανακτηθεί.
Μπορούμε να ανακτήσουμε ακόμα και υποβολές σε κλάδους που έχουν διαγραφεί ή υποβολές που επανεγγράφηκαν, με την εντολή git commit --amend (βλ. Ανάκτηση δεδομένων σχετικά με την ανάκτηση δεδομένων).
Ωστόσο, αν κάτι δεν είναι υποβεβλημένο και το χάσουμε, είναι πολύ πιθανό να μην μπορέσουμε να το ανακτήσουμε.
Αναίρεση αλλαγών με το git restore
Στην έκδοση 2.23.0 του Git εισήχθη νεά εντολή: git restore.
Βασικά είναι μια εναλλακτική της εντολής git reset που μόλις συζητήσαμε.
Από την Git έκδοση 2.23.0 και μετά, το Git χρησιμοποιεί την git restore αντί της git reset για πολλές λειτουργίες αναίρεσης.
Ας ξαναδούμε τα βήματά μας, και να αναιρέσουμε αλλαγές με την git restore αντί της git reset.
Αφαίρεση αρχείου από το στάδιο καταχώρησης με χρήση της git restore
Στις επόμενες δύο ενότητες θα δούμε πώς μπορούμε να διαχειριστούμε τις αλλαγές που έχουν γίνει στο στάδιο καταχώρησης και στον κατάλογο εργασίας.
Το καλό είναι ότι η εντολή που χρησιμοποιούμε για να προσδιορίσουμε την κατάσταση αυτών των δύο περιοχών, μας υπενθυμίζει και πώς να αναιρέσουμε τις αλλαγές σε αυτές τις περιοχές.
Για παράδειγμα, έστω ότι έχουμε κάνει αλλαγές σε δύο αρχεία και θέλουμε να τα υποβάλλουμε ως ξεχωριστές αλλαγές, αλλά τα υποβάλλαμε κατά λάθος και τα δύο με την εντολή git add *.
Πώς μπορούμε να αναιρέσουμε την καταχώριση του ενός από τα δύο;
Η εντολή git status μας υπενθυμίζει:
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: CONTRIBUTING.md
renamed: README.md -> README
Ακριβώς κάτω από το “Changes to be committed”, μας λέει να εκτελέσουμε git restore --staged <file>… ώστε να αφαιρέσουμε την αλλαγή από το στάδιο καταχώρησης.
Ας χρησιμοποιήσουμε λοιπόν αυτή τη συμβουλή αυτή για το αρχείο CONTRIBUTING.md:
$ git restore --staged CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.md -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Το αρχείο CONTRIBUTING.md είναι τροποποιημένο, αλλά δεν βρίσκεται στο στάδιο καταχώρησης.
Αναίρεση τροποποίησης ενός αρχείου με την χρήση της git restore
Τι μπορούμε να κάνουμε όμως αν διαπιστώσουμε ότι δεν θέλουμε να κρατήσουμε τις αλλαγές που κάναμε στο αρχείο CONTRIBUTING.md;
Πώς μπορούμε να το ξετροποποιήσουμε εύκολα — να το φέρουμε στη μορφή που είχε στην τελευταία του υποβολή (ή όπως ήταν όταν το κλωνοποιήσαμε ή όπως το φέραμε στον κατάλογο εργασίας μας);
Ευτυχώς, η εντολή git status μας λέει πώς να το κάνουμε.
Στο αποτέλεσμα του προηγούμενου παραδείγματος, η περιοχή με τα μη καταχωρημένα αρχεία είναι κάπως έτσι:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Η εντολή μας πληροφορεί ρητά πώς να απορρίψουμε τις αλλαγές που έχουμε κάνει. Ας κάνουμε ό,τι λέει:
$ git restore CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.md -> README
|
Important
|
Είναι σημαντικό να καταλάβουμε ότι η εντολή |