Οποιαδήποτε στιγμή, μπορεί να θελήσετε να αναιρέσετε κάτι. Σε αυτό το κεφάλαιο, θα δείτε μερικά βασικά εργαλεία με τα οποία μπορείτε να αναιρέσετε αλλαγές που έχετε ήδη κάνει. Θα πρέπει να είστε προσεκτικοί γιατί δεν θα μπορείτε πάντα να αναιρέσετε κάποιες από αυτές τις αναιρέσεις. Αυτή είναι μία από τις λίγες περιπτώσεις στο Git όπου μπορεί να χάσετε μέρος της δουλειάς σας αν κάνετε τις αναιρέσεις λανθασμένα.
Μια συχνή αναίρεση που χρησιμοποιείται είναι η περίπτωση κατά την οποία υποβάλλετε κάτι πολύ νωρίς και ενδεχομένως ξεχάσατε να προσθέσετε κάποια αρχεία ή κάνατε κάποιο σφάλμα στο μήνυμα υποβολής.
Αν θέλετε να ξανακάνετε τη συγκεκριμένη υποβολή, να προσθέσετε τις αλλαγές που ξεχάσατε, να τις βάλετε στον προθάλαμο και να τις ξαναϋποβάλλετε, θα πρέπει να χρησιμοποιήσετε την επιλογή --amend
:
$ git commit --amend
Η εντολή αυτή παίρνει τον προθάλαμο και τον χρησιμοποιεί για την υποβολή. Αν δεν έχετε κάνει περαιτέρω αλλαγές από την τελευταία σας υποβολή (για παράδειγμα, αν εκτελέσετε αυτή την εντολή αμέσως μετά από μια υποβολή), τότε το στιγμιότυπο του αποθετηρίου θα είναι ακριβώς το ίδιο και το μόνο που θα αλλάξετε είναι το μήνυμα υποβολής.
Όταν εκτελέσετε την εντολή, θα εκκινήσει ο επεξεργαστής κειμένου, που θα περιέχει το μήνυμα της προηγούμενης υποβολής σας. Μπορείτε να επεξεργαστείτε όπως πάντα, αλλά αντικαταστήσει την τελευταία σας υποβολή.
Για παράδειγμα, αν κάνετε μια υποβολή και μετά διαπιστώσετε ότι ξεχάσατε να καταχωρήσετε τις αλλαγές ενός αρχείου που θέλατε να συμπεριλάβετε στην υποβολή αυτή, τότε μπορείτε να:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
Καταλήγετε με μια και μοναδική υποβολή· η δεύτερη υποβολή αντικαθιστά τα αποτελέσματα της πρώτης.
Note
|
Είναι σημαντικό να καταλάβετε ότι όταν τροποποιείτε (amend) την τελευταία σας υποβολή, στην πραγματικότητα δεν την τροποποιείτε αλλά την αντικαθιστάτε με μια εντελώς νέα, βελτιωμένη υποβολή που διώχνει την παλιά υποβολή και βάζει την νέα υποβολή στη θέση της. Ουσιαστικά, είναι σαν η προηγούμενη υποβολή να μη συνέβη ποτέ και δεν θα εμφανίζετα στο ιστορικό του αποθετηρίου. Η αξία της τροποποίησης των υποβολών είναι ότι κάνετε ελάσονες βελτιώσεις στην τελευταία σας υποβολή, χωρίς να μπουκώνετε το ιστορικό του αποθετηρίου σας με μηνύματα υποβολής της μορφής “Ωχ, ξέχασα να προσθέσω ένα αρχείο” ή “Να πάρει, διόρθωσα ένα τυπογραφικό στην προηγούμενη υποβολή”. |
Note
|
Να τροποποιείτε (amend) υποβολές που υπάρχουν μόνο τοπικα και δεν τις έχετε ωθήσει πουθενά. Η τροποποίηση υποβολών που έχουν ήδη ωθηθεί και η ώθησή του κλάδου θα δημουργήσει προβλήματα στους συνεργάτες σας. Περισσότερες λεπτομέρειες για το τι συμβαίνει ότι κάνετε κάτι τέτοιο, και πώς να το διορθώσετε όταν είστε αυτός που την πατάει υπάρχουν στο [_rebase_peril]. |
Στις επόμενες δύο ενότητες θα δείτε πώς μπορείτε να διαχειριστείτε τις αλλαγές που έχουν γίνει στον προθάλαμο και στον κατάλογο εργασίας.
Το καλό είναι ότι η εντολή που χρησιμοποιείτε για να προσδιορίσετε την κατάσταση αυτών των δύο περιοχών, σας υπενθυμίζει και πώς να αναιρέσετε τις αλλαγές σε αυτές τις περιοχές.
Για παράδειγμα, έστω ότι έχετε κάνει αλλαγές σε δύο αρχεία και θέλετε να τα υποβάλλετε ως ξεχωριστές αλλαγές, αλλά τα υποβάλατε κατά λάθος και τα δύο με την εντολή 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
και πώς να την κατακτήσετε, ώστε να κάνετε πραγματικά ενδιαφέροντα πράγματα στην ενότητα ch07-git-tools.asc.
Τι μπορείτε να κάνετε όμως αν διαπιστώσετε ότι δεν θέλετε να κρατήσετε τις αλλαγές που κάνατε στο αρχείο 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
|
Είναι σημαντικό να καταλάβετε ότι η εντολή |
<!--- Αν θέλετε να κρατήσετε τις αλλαγές που κάνατε στο αρχείο, αλλά παρόλα αυτά χρειάζεστε να το κάνετε στην άκρη, θα πρέπει να εξετάσετε τη φύλαξη των αλλαγών (stashing) και τη διακλάδωση (branching) στο κεφάλαιο ch03-git-branching.asc.
Οτιδήποτε έχει υποβληθεί στο Git μπορεί να ανακτηθεί.
Μπορείτε να ανακτήσετε ακόμα και υποβολές σε κλάδους που έχουν διαγραφεί ή υποβολές που επανεγγράφηκαν, με την εντολή git commit --amend
(βλ. ch10-git-internals.asc για περισσότερα σχετικά με την ανάκτηση δεδομένων).
Ωστόσο, αν κάτι δεν είναι υποβεβλημένο και το χάσετε, είναι πολύ πιθανό να μην μπορέσετε να το ανακτήσετε.
-→