Git reset = Επιστροφή στον χρόνο ακυρώνοντας commits.
Έννοια:
Αναλογία: Είναι σαν να σβήνετε σελίδες από ένα τετράδιο.
| Λειτουργία | Commits | Index/Staging | Working Directory |
|---|---|---|---|
| --soft | Ακυρώνει | Διατηρεί | Διατηρεί |
| --mixed | Ακυρώνει | Σβήνει | Διατηρεί |
| --hard | Ακυρώνει | Σβήνει | Σβήνει |
Απλό σημείωμα:
Χρήση: Ξανακάντε το τελευταίο commit με περισσότερες αλλαγές.
mkdir demo-reset && cd demo-reset
git init
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
echo "print('v2')" > app.py && git add . && git commit -m "Version 2"
# Reset soft: ακυρώνει το commit, κρατά τα πάντα στο staging
git reset --soft HEAD~1
git status # Αλλαγές σταδιοποιημένες και έτοιμες
git log --oneline # Ένα commit λιγότερο
cat app.py # Το περιεχόμενο v2 είναι ακόμα εκεί
# Νέο commit με βελτιωμένο μήνυμα
git commit -m "Version 2 - Avec nouvelles features"Χρήση: Ακύρωση commits ΚΑΙ αποσταδιοποίηση (προεπιλεγμένη λειτουργία).
echo "print('v3')" > app.py && git add . && git commit -m "Version 3"
# Reset mixed (ή απλά git reset)
git reset HEAD~1
git status # Αλλαγές ΜΗ σταδιοποιημένες
git log --oneline # Commits ακυρωμένα
cat app.py # Το περιεχόμενο v3 είναι ακόμα εκεί, αλλά όχι σταδιοποιημένο
# Πρέπει να κάνετε add ξανά πριν το commit
git add . && git commit -m "Version 3 - Refait proprement"ΚΙΝΔΥΝΟΣ: Διαγράφει ΤΑ ΠΑΝΤΑ, ακόμα και τις μη καταχωρημένες τροποποιήσεις σας!
echo "print('v4')" > app.py && git add . && git commit -m "Version 4"
# Τροποποιήσεις σε εξέλιξη
echo "print('work in progress')" >> app.py
# Reset hard: ΟΛΑ ΕΞΑΦΑΝΙΖΟΝΤΑΙ
git reset --hard HEAD~1
git status # Working directory clean
cat app.py # Επιστροφή στο v2, η εργασία σε εξέλιξη ΧΑΘΗΚΕ!Χρήση: Όταν θέλετε ΠΡΑΓΜΑΤΙΚΑ να πετάξετε τα πάντα και να επιστρέψετε πίσω.
Το reset είναι ΚΑΤΑΣΤΡΟΦΙΚΟ με κοινόχρηστα commits!
ΠΟΤΕ μην κάνετε αυτό:
git push origin main # Commits κοινόχρηστα με την ομάδα
git reset --hard HEAD~3 # Διαγράφει 3 κοινόχρηστα commits
git push --force # Επιβάλλει τη διαγραφή σε όλους
# = ΧΑΟΣ στην ομάδα!Κανόνας ασφαλείας:
git revert (ασφαλέστερο)| Εντολή | Ενέργεια |
|---|---|
git reset HEAD~1 | Ακυρώνει 1 commit (mixed) |
git reset --soft HEAD~2 | Ακυρώνει 2 commits, κρατά το staging |
git reset --hard HEAD~1 | Ακυρώνει 1 commit, διαγράφει ΤΑ ΠΑΝΤΑ |
git reset <hash> | Επιστροφή σε συγκεκριμένο commit |
git reset --hard origin/main | Reset στην απομακρυσμένη έκδοση |
Reset = ισχυρό αλλά επικίνδυνο. Χρησιμοποιήστε το με προσοχή!