Git squash = Συνδυασμός πολλών commits σε ΕΝΑ ΜΟΝΟ commit.
Αναλογία: Έχετε 5 πρόχειρα ενός email → τα συνδυάζετε σε 1 καθαρό τελικό email.
Παράδειγμα:
ΠΡΙΝ από το squash:
- "fix typo"
- "add feature"
- "fix bug"
- "another fix"
ΜΕΤΑ το squash:
- "Add complete login feature"Πρόβλημα: βρώμικο ιστορικό
git log --oneline
abc123 oops fix typo
def456 forgot semicolon
ghi789 actually implement feature
jkl012 fix indent
mno345 real commit messageΛύση: squash!
git log --oneline
xyz999 Implement user authentication systemΠλεονεκτήματα:
Η μαγική εντολή:
git rebase -i HEAD~4 # Squash των 4 τελευταίων commitsΔιεπαφή που ανοίγει:
pick abc123 oops fix typo
pick def456 forgot semicolon
pick ghi789 actually implement feature
pick jkl012 fix indentΑλλάξτε σε:
pick ghi789 actually implement feature
squash abc123 oops fix typo
squash def456 forgot semicolon
squash jkl012 fix indentΑποτέλεσμα: 4 commits → 1 καθαρό commit!
mkdir demo-squash && cd demo-squash
git init
# Δημιουργία πολλών «βρώμικων» commits
echo "print('v1')" > app.py && git add . && git commit -m "start feature"
echo "print('v1.1')" > app.py && git add . && git commit -m "oops fix"
echo "print('v1.2')" > app.py && git add . && git commit -m "another fix"
echo "print('v2 done')" > app.py && git add . && git commit -m "feature complete"
# Βρώμικο ιστορικό
git log --oneline
# Διαδραστικό squash
git rebase -i HEAD~4
# Στον επεξεργαστή: κρατήστε το πρώτο "pick", αλλάξτε τα άλλα σε "squash"
# Αποθηκεύστε και κλείστε
# Γράψτε το μήνυμα του τελικού commit
# Αποτέλεσμα: 1 καθαρό commit!
git log --onelineΤυπικές καταστάσεις:
Κλάδος feature πριν από το merge:
git checkout feature-login
# ... 15 commits ανάπτυξης με τυπογραφικά/διορθώσεις
git rebase -i HEAD~15 # Squash σε 2-3 λογικά commits
git checkout main && git merge feature-loginΚαθαρισμός πριν από το push:
# Τοπική πρόχειρη ανάπτυξη
git rebase -i HEAD~8 # Καθαρισμός πριν την κοινοποίηση
git push origin feature-branchΔιόρθωση δημόσιου ιστορικού (προσοχή!):
# Μόνο αν κανείς δεν έχει ακόμα ανακτήσει τα commits σας
git rebase -i HEAD~5
git push --force-with-lease # Ασφαλέστερο από --forceSquash = η ηλεκτρική σκούπα σας για να καθαρίσετε το ιστορικό!