Ο απόλυτος οδηγός για επαναφορά Git και επαναφορά Git

Καλώς ορίσατε στον απόλυτο οδηγό μας για τις εντολές git resetκαι git revert. Αυτό το σεμινάριο θα σας διδάξει όλα όσα πρέπει να γνωρίζετε σχετικά με τη διόρθωση κοινών λαθών και την αναίρεση κακών διαπράξεων κατά τη χρήση του Git.

Κατανοήστε τις τρεις ενότητες ενός έργου Git

Ένα έργο Git έχει τις ακόλουθες τρεις κύριες ενότητες:

  1. Κατάλογος Git
  2. Κατάλογος εργασίας (ή δέντρο εργασίας)
  3. Περιοχή στάσης

Ο κατάλογος 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, and git 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.