Ο απόλυτος οδηγός για επαναφορά Git και επαναφορά Git
Καλώς ορίσατε στον απόλυτο οδηγό μας για τις εντολές git reset
και git revert
. Αυτό το σεμινάριο θα σας διδάξει όλα όσα πρέπει να γνωρίζετε σχετικά με τη διόρθωση κοινών λαθών και την αναίρεση κακών διαπράξεων κατά τη χρήση του Git.
Κατανοήστε τις τρεις ενότητες ενός έργου Git
Ένα έργο Git έχει τις ακόλουθες τρεις κύριες ενότητες:
- Κατάλογος Git
- Κατάλογος εργασίας (ή δέντρο εργασίας)
- Περιοχή στάσης
Ο κατάλογος Git (που βρίσκεται YOUR-PROJECT-PATH/.git/
) είναι όπου το Git αποθηκεύει ό, τι χρειάζεται για να παρακολουθεί με ακρίβεια το έργο. Αυτό περιλαμβάνει μεταδεδομένα και βάση δεδομένων αντικειμένων που περιλαμβάνει συμπιεσμένες εκδόσεις των αρχείων έργου.
Ο κατάλογος εργασίας είναι όπου ένας χρήστης κάνει τοπικές αλλαγές σε ένα έργο. Ο κατάλογος εργασίας τραβά τα αρχεία του έργου από τη βάση δεδομένων αντικειμένων του καταλόγου Git και τα τοποθετεί στον τοπικό υπολογιστή του χρήστη.
Σημείωση: Ο κατάλογος είναι επίσης γνωστός ως Repository ή short form repo. Το repo στον τοπικό υπολογιστή του χρήστη ονομάζεται "Local repo" ενώ το repo στον διακομιστή git ονομάζεται "Remote repo".
Η περιοχή σταδιοποίησης είναι ένα αρχείο (ονομάζεται επίσης "ευρετήριο", "στάδιο" ή "προσωρινή μνήμη") που αποθηκεύει πληροφορίες σχετικά με το τι θα πάει στην επόμενη δέσμευσή σας. Μια δέσμευση είναι όταν πείτε στο Git να αποθηκεύσει αυτές τις σταδιακές αλλαγές. Το Git παίρνει ένα στιγμιότυπο των αρχείων όπως είναι και αποθηκεύει μόνιμα αυτό το στιγμιότυπο στον κατάλογο Git.
Με τρεις ενότητες, υπάρχουν τρεις κύριες καταστάσεις ότι ένα αρχείο μπορεί να βρίσκεται σε οποιαδήποτε δεδομένη στιγμή: τροποποιημένο, δεσμευμένο ή σταδιακό. Μπορείτε να τροποποιήσετε ένα αρχείο όποτε κάνετε αλλαγές σε αυτόν στον κατάλογο εργασίας σας. Στη συνέχεια, γίνεται σταδιακή όταν το μετακινείτε στην περιοχή στάσης. Τέλος, δεσμεύεται μετά από μια δέσμευση.
Επαναφορά Git
Η git reset
εντολή σάς επιτρέπει να επαναφέρετε την τρέχουσα κεφαλή σας σε μια καθορισμένη κατάσταση. Μπορείτε να επαναφέρετε την κατάσταση συγκεκριμένων αρχείων καθώς και ολόκληρου του κλάδου. Αυτό είναι χρήσιμο εάν δεν έχετε προωθήσει ακόμα τη δέσμευσή σας στο GitHub ή σε άλλο απομακρυσμένο αποθετήριο.
Επαναφέρετε ένα αρχείο ή ένα σύνολο αρχείων
Η ακόλουθη εντολή σάς επιτρέπει να επιλέξετε επιλεκτικά κομμάτια περιεχομένου και να το επαναφέρετε ή να το σταματήσετε.
git reset (--patch | -p) [tree-ish] [--] [paths]
Καταργήστε τη στάση ενός αρχείου
Εάν μετακινήσατε ένα αρχείο στην περιοχή σταδιοποίησης με git add
, αλλά δεν θέλετε πλέον να είναι μέρος μιας δέσμευσης, μπορείτε να χρησιμοποιήσετε git reset
για να αποσυμπιέσετε αυτό το αρχείο:
git reset HEAD FILE-TO-UNSTAGE
Οι αλλαγές που κάνατε θα εξακολουθούν να υπάρχουν στο αρχείο. Αυτή η εντολή καταργεί το αρχείο από την περιοχή σταδιοποίησης.
Επαναφέρετε έναν κλάδο σε μια προηγούμενη δέσμευση
Η ακόλουθη εντολή επαναφέρει το HEAD του τρέχοντος κλάδου σας στο δεδομένο COMMIT
και ενημερώνει το ευρετήριο. Βασικά επαναφέρει την κατάσταση του υποκαταστήματός σας, και στη συνέχεια όλοι σας δεσμεύονται να προχωρήσετε προς τα εμπρός γράφοντας για οτιδήποτε ήρθε μετά το σημείο επαναφοράς. Εάν παραλείψετε το MODE
, προεπιλογή --mixed
:
git reset MODE COMMIT
Οι επιλογές MODE
είναι:
--soft
: δεν επαναφέρει το αρχείο ευρετηρίου ή το δέντρο εργασίας, αλλά επαναφέρει το HEAD σεcommit
. Αλλάζει όλα τα αρχεία σε "Αλλαγές προς δέσμευση"--mixed
: επαναφέρει το ευρετήριο, αλλά όχι το δέντρο εργασίας και αναφέρει τι δεν έχει ενημερωθεί--hard
: επαναφέρει το ευρετήριο και το δέντρο εργασίας. Τυχόν αλλαγές στα αρχεία που παρακολουθούνται στο δέντρο εργασίας από τότεcommit
απορρίπτονται--merge
: επαναφέρει το ευρετήριο και ενημερώνει τα αρχεία στο δέντρο εργασίας που είναι διαφορετικά μεταξύcommit
και HEAD, αλλά διατηρεί αυτά που είναι διαφορετικά μεταξύ του ευρετηρίου και του δέντρου εργασίας--keep
: επαναφέρει τις καταχωρίσεις ευρετηρίου και ενημερώνει αρχεία στο δέντρο εργασίας που διαφέρουν μεταξύcommit
και HEAD. Εάν ένα αρχείο που είναι διαφορετικό μεταξύcommit
και HEAD έχει τοπικές αλλαγές, η επαναφορά ακυρώνεται
Σημαντική σημείωση σχετικά με τις σκληρές επαναφορές
Να είστε πολύ προσεκτικοί όταν χρησιμοποιείτε την --hard
επιλογή με git reset
δεδομένου ότι επαναφέρει τη δέσμευση, την περιοχή στάσης και τον κατάλογο εργασίας σας. Εάν αυτή η επιλογή δεν χρησιμοποιηθεί σωστά, τότε μπορεί κάποιος να χάσει τον κωδικό που είναι γραμμένο.
Git Revert
Both the git revert
and git reset
commands undo previous commits. But if you've already pushed your commit to a remote repository, it is recommended that you do not use git reset
since it rewrites the history of commits. This can make working on a repository with other developers and maintaining a consistent history of commits very difficult.
Instead, it is better to use git revert
, which undoes the changes made by a previous commit by creating an entirely new commit, all without altering the history of commits.
Revert a commit or set of commits
The following command lets you revert changes from a previous commit or commits and create a new commit.
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[]] … git revert --continue git revert --quit git revert --abort
Common options:
-e --edit
- This is the default option and doesn't need to be explicitly set. It opens your system's default text editor and lets you edit the new commit message before commit the revert.
- This option does the opposite of
-e
, andgit revert
will not open the text editor. - This option prevents
git revert
from undoing a previous commit and creating a new one. Rather than creating a new commit,-n
will undo the changes from the previous commit and add them to the Staging Index and Working Directory.
--no-edit
-n -no-commit
Example.
Let's imagine the following situation: 1.) You are working on a file and you add and commit your changes. 2.) You then work on a few other things, and make some more commits. 3.) Now you realize, three or four commits ago, you did something that you would like to undo - how can you do this?
Ίσως σκέφτεστε, απλώς χρησιμοποιήστε git reset
, αλλά αυτό θα καταργήσει όλες τις δεσμεύσεις μετά από αυτήν που θέλετε να αλλάξετε - git revert
στη διάσωση! Ας δούμε αυτό το παράδειγμα:
mkdir learn_revert # Create a folder called `learn_revert` cd learn_revert # `cd` into the folder `learn_revert` git init # Initialize a git repository touch first.txt # Create a file called `first.txt` echo Start >> first.txt # Add the text "Start" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding first" # Commit with the message "Adding first.txt" echo WRONG > wrong.txt # Add the text "WRONG" to `wrong.txt` git add . # Add the `wrong.txt` file git commit -m "adding WRONG to wrong.txt" # Commit with the message "Adding WRONG to wrong.txt" echo More >> first.txt # Add the text "More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding More to first.txt" # Commit with the message "Adding More to first.txt" echo Even More >> first.txt # Add the text "Even More" to `first.txt` git add . # Add the `first.txt` file git commit -m "adding Even More to First.txt" # Commit with the message "Adding More to first.txt" # OH NO! We want to undo the commit with the text "WRONG" - let's revert! Since this commit was 2 from where we are not we can use git revert HEAD~2 (or we can use git log and find the SHA of that commit) git revert HEAD~2 # this will put us in a text editor where we can modify the commit message. ls # wrong.txt is not there any more! git log --oneline # note that the commit history hasn't been altered, we've just added a new commit reflecting the removal of the `wrong.txt`
Και με αυτό είστε ένα βήμα πιο κοντά για να φτάσετε τη μαύρη ζώνη σας στο Git.