Skip to content

Latest commit

 

History

History
150 lines (116 loc) · 11.9 KB

undoing.asc

File metadata and controls

150 lines (116 loc) · 11.9 KB

Αναιρέσεις (undoing)

Οποιαδήποτε στιγμή, μπορεί να θελήσετε να αναιρέσετε κάτι. Σε αυτό το κεφάλαιο, θα δείτε μερικά βασικά εργαλεία με τα οποία μπορείτε να αναιρέσετε αλλαγές που έχετε ήδη κάνει. Θα πρέπει να είστε προσεκτικοί γιατί δεν θα μπορείτε πάντα να αναιρέσετε κάποιες από αυτές τις αναιρέσεις. Αυτή είναι μία από τις λίγες περιπτώσεις στο 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 μπορεί να είναι επικίνδυνη, ιδιαίτερα αν την καλέσετε με τη σημαία --hard. Όμως στο συγκεκριμένο σενάριο, το αρχείο στον κατάλογο εργασίας σας δεν τροποποιείται, οπότε είναι σχετικά ασφαλές. Η εκτέλεση της εντολής git reset χωρίς επιπλέον επιλογές δεν είναι επικίνδυνη, τροποποιεί μόνο τον προθάλαμο.

Προς το παρόν, το μόνο που χρειάζεται να γνωρίζετε για την εντολή 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

Είναι σημαντικό να καταλάβετε ότι η εντολή git restore — <αρχείο> είναι αρκετά επικίνδυνη. Όλες οι αλλαγές που έχετε κάνει τοπικά σε αυτό το αρχείο έχουν πλέον χαθεί — το Git αντικατέστησε αυτό το αρχείο με την τελευταία έκδοσή του από τον προθάλαμο ή την υποβεβλημένη καθώς έχετε αντιγράψει ένα αρχείο πάνω από αυτό. Μην χρησιμοποιείτε αυτή την εντολή παρά μόνο αν είστε απολύτως σίγουροι ότι δεν θέλετε να κρατήσετε αυτές τις μη αποθηκευμένες τοπικές αλλαγές.

<!--- Αν θέλετε να κρατήσετε τις αλλαγές που κάνατε στο αρχείο, αλλά παρόλα αυτά χρειάζεστε να το κάνετε στην άκρη, θα πρέπει να εξετάσετε τη φύλαξη των αλλαγών (stashing) και τη διακλάδωση (branching) στο κεφάλαιο ch03-git-branching.asc.

Οτιδήποτε έχει υποβληθεί στο Git μπορεί να ανακτηθεί. Μπορείτε να ανακτήσετε ακόμα και υποβολές σε κλάδους που έχουν διαγραφεί ή υποβολές που επανεγγράφηκαν, με την εντολή git commit --amend (βλ. ch10-git-internals.asc για περισσότερα σχετικά με την ανάκτηση δεδομένων). Ωστόσο, αν κάτι δεν είναι υποβεβλημένο και το χάσετε, είναι πολύ πιθανό να μην μπορέσετε να το ανακτήσετε. -→