-
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.4 Τα θεμελιώδη στοιχεία του Git - Αναιρώντας κάτι
Αναιρώντας κάτι
Μπορούμε να αναιρέσουμε κάποια αλλαγή οποιαδήποτε στιγμή. Σε αυτό το κεφάλαιο, θα αναλύσουμε κάποια βασικά εργαλεία για να αναιρέσουμε αλλαγές που έχουμε ήδη κάνει. Θα χρειαστεί να είμαστε προσεκτικοί γιατί δεν θα μπορούμε πάντα να αναιρέσουμε κάποιες από αυτές τις αναιρέσεις. Θα δούμε κάποιες από τις ελάχιστες περιπτώσεις στο Git όπου μπορεί να χάσουμε μέρος της δουλειάς σας αν χρησιμοποιήσουμε με λάθος τρόπο τις εντολές.
Μια συχνή αναίρεση που χρησιμοποιείται είναι η περίπτωση κατά την οποία υποβάλλουμε κάτι πολύ νωρίς, αλλά ξεχάσαμε να προσθέσουμε κάποια αρχεία ή κάναμε κάποιο σφάλμα στο μήνυμα υποβολής.
Αν θέλουμε να ξανακάνουμε τη συγκεκριμένη υποβολή, να προσθέσουμε τις αλλαγές που ξεχάσαμε, να τις βάλουμε στο στάδιο καταχώρισης και να τις ξαναϋποβάλλουμε, θα πρέπει να χρησιμοποιήσουμε την επιλογή --amend
:
$ git commit --amend
Η εντολή αυτή παίρνει την περιοχή καταχώρησης και τη χρησιμοποιεί για την υποβολή. Αν δεν έχουμε κάνει περαιτέρω αλλαγές από την τελευταία μας υποβολή (για παράδειγμα, αν εκτελέσουμε την εντολή αμέσως μετά από μια υποβολή), τότε το στιγμιότυπο του αποθετηρίου θα είναι ακριβώς το ίδιο και το μόνο που θα αλλάξουμε είναι το μήνυμα υποβολής.
Όταν εκτελέσουμε την εντολή, θα σας εμφανιστεί το μήνυμα από την προηγούμενή σας υποβολή. Το μήνυμα αυτό μπορούμε να το επεξεργαστούμε, αλλά η τελευταία υποβολή θα αντικατασταθεί.
Για παράδειγμα, αν κάνουμε μια υποβολή και μετά διαπιστώσουμε ότι ξεχάσαμε να καταχωρήσουμε τις αλλαγές ενός αρχείου που θέλαμε να συμπεριλάβουμε στην υποβολή αυτή, τότε μπορούμε να:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
Έτσι καταλήγουμε με μια και μοναδική υποβολή. Η δεύτερη υποβολή αντικαθιστά τα αποτελέσματα της πρώτης.
Αφαίρεση αρχείου από το στάδιο καταχώρισης
Στις επόμενες δύο ενότητες θα δούμε πώς μπορούμε να διαχειριστούμε τις αλλαγές στην περιοχή καταχώρησης και στον κατάλογο εργασίας.
Κάτι που θα σας φανεί πολύ χρήσιμο είναι ότι η εντολή που μας προσδιορίζει την κατάσταση αυτών των περιοχών, μας υπενθυμίζει και πώς να αναιρέσουμε τις αλλαγές σε αυτές.
Για παράδειγμα, έστω ότι έχουμε κάνει αλλαγές σε δύο αρχεία και θέλουμε να τα υποβάλλουμε ως ξεχωριστές αλλαγές, αλλά τα καταχωρήσαμε και τα δύο κατά λάθος με την εντολή 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
Όπως βλέπουμε, το κείμενο της εντολής μας συμβουλεύει να χρησιμοποιήσουμε την εντολή 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
.
Αναιρώντας τροποποιήσεις ενός αρχείου
Τι μπορούμε να κάνουμε όμως αν διαπιστώσουμε ότι δεν θέλουμε να κρατήσουμε τις αλλαγές που κάναμε στο αρχείο 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) στο κεφάλαιο [ch03-git-branching].
Ο,τιδήποτε έχει υποβληθεί στο Git μπορεί να ανακτηθεί.
Μπορούμε να ανακτήσουμε ακόμα και υποβολές σε κλάδους που έχουν διαγραφεί ή υποβολές που επανεγγράφηκαν, με την εντολή git commit --amend
(βλ. Ανάκτηση δεδομένων για περισσότερα σχετικά με την ανάκτηση δεδομένων).
Ωστόσο, αν κάτι δεν είναι υποβεβλημένο και το χάσουμε, είναι πολύ πιθανό να μην μπορέσουμε να το ανακτήσουμε.