Πώς μπορώ να επαναφέρω όλες τις τοπικές αλλαγές σε έργο που διαχειρίζεται το Git στην προηγούμενη κατάσταση;

Έχω ένα έργο στο οποίο έτρεξα το git init. Μετά από αρκετές δεσμεύσεις, έκανα το git status το οποίο μου είπε ότι όλα ήταν ενημερωμένα και δεν υπήρχαν τοπικές αλλαγές.

Στη συνέχεια έκανα αρκετές διαδοχικές αλλαγές και συνειδητοποίησα ότι ήθελα να τα πετάξω όλα και να επιστρέψω στην αρχική μου κατάσταση. Θα το κάνει αυτή η εντολή για μένα;

git reset --hard HEAD
Λύση

Αν θέλετε να επαναφέρετε τις αλλαγές που έγιναν στο αντίγραφο εργασίας σας, κάντε αυτό:

git checkout .

Αν θέλετε να επαναφέρετε τις αλλαγές που έγιναν στο ευρετήριο (δηλ. που έχετε προσθέσει), κάντε αυτό. Προσοχή, αυτό θα επαναφέρει όλες τις μη προωθημένες δεσμεύσεις σας στο master!:

git reset

Αν θέλετε να επαναφέρετε μια αλλαγή που έχετε κάνει commit, κάντε αυτό:

git revert  

Αν θέλετε να αφαιρέσετε αρχεία που δεν έχουν εντοπιστεί (π.χ. νέα αρχεία, αρχεία που δημιουργήθηκαν):

git clean -f

Ή μη εντοπισμένους καταλόγους (π.χ. νέους ή αυτόματα δημιουργημένους καταλόγους):

git clean -fd
Σχόλια (19)

Σημείωση: Μπορεί επίσης να θέλετε να εκτελέσετε

git clean -fd

ως

git reset --hard

δεν θα αφαιρέσει τα μη παρακολουθούμενα αρχεία, ενώ το git-clean θα αφαιρέσει όλα τα αρχεία από τον παρακολουθούμενο ριζικό κατάλογο που δεν είναι υπό παρακολούθηση από το git. ΠΡΟΕΙΔΟΠΟΊΗΣΗ - ΝΑ ΕΊΣΤΕ ΠΡΟΣΕΚΤΙΚΟΊ ΜΕ ΑΥΤΌ! Είναι χρήσιμο να εκτελέσετε πρώτα μια δοκιμαστική εκτέλεση με το git-clean, για να δείτε τι θα διαγράψει.

Αυτό είναι επίσης ιδιαίτερα χρήσιμο όταν λαμβάνετε το μήνυμα σφάλματος

~"performing this command will cause an un-tracked file to be overwritten"

Το οποίο μπορεί να εμφανιστεί όταν κάνετε διάφορα πράγματα, ένα από αυτά είναι η ενημέρωση ενός αντιγράφου εργασίας όταν εσείς και ο φίλος σας έχετε προσθέσει ένα νέο αρχείο με το ίδιο όνομα, αλλά αυτός το έχει δεσμεύσει πρώτα στον έλεγχο πηγής και εσείς δεν ενδιαφέρεστε να διαγράψετε το μη παρακολουθούμενο αντίγραφό σας.

Σε αυτή την περίπτωση, η εκτέλεση μιας δοκιμαστικής εκτέλεσης θα σας βοηθήσει επίσης να δείτε μια λίστα με τα αρχεία που θα αντικατασταθούν.

Σχόλια (4)

Κοιτάξτε το git-reflog. Θα παραθέσει όλες τις καταστάσεις που θυμάται (η προεπιλογή είναι 30 ημέρες) και μπορείτε απλά να ελέγξετε αυτή που θέλετε. Για παράδειγμα:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d
Σχόλια (4)