Git Squash

1 λεπτά

Πίνακας περιεχομένων

  1. Τι είναι το squash;
  2. Γιατί squash;
  3. Διαδραστικό squash
  4. Άμεση πρακτική
  5. Περιπτώσεις χρήσης

1. Τι είναι το squash;

Git squash = Συνδυασμός πολλών commits σε ΕΝΑ ΜΟΝΟ commit.

Αναλογία: Έχετε 5 πρόχειρα ενός email → τα συνδυάζετε σε 1 καθαρό τελικό email.

Παράδειγμα:

ΠΡΙΝ από το squash:
- "fix typo"  
- "add feature"
- "fix bug"
- "another fix"

ΜΕΤΑ το squash:  
- "Add complete login feature"

Επιστροφή στον πίνακα περιεχομένων

2. Γιατί squash;

Πρόβλημα: βρώμικο ιστορικό

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

Πλεονεκτήματα:

  • Καθαρό και ευανάγνωστο ιστορικό
  • Λογικά commits ανά λειτουργία
  • Πιο εύκολο να κάνετε revert μια πλήρη λειτουργία

Επιστροφή στον πίνακα περιεχομένων

3. Διαδραστικό squash

Η μαγική εντολή:

bash
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!

Επιστροφή στον πίνακα περιεχομένων

4. Άμεση πρακτική

bash
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

Επιστροφή στον πίνακα περιεχομένων

5. Περιπτώσεις χρήσης

Τυπικές καταστάσεις:

  1. Κλάδος feature πριν από το merge:

    bash
    git checkout feature-login
    # ... 15 commits ανάπτυξης με τυπογραφικά/διορθώσεις
    git rebase -i HEAD~15    # Squash σε 2-3 λογικά commits
    git checkout main && git merge feature-login
  2. Καθαρισμός πριν από το push:

    bash
    # Τοπική πρόχειρη ανάπτυξη
    git rebase -i HEAD~8     # Καθαρισμός πριν την κοινοποίηση
    git push origin feature-branch
  3. Διόρθωση δημόσιου ιστορικού (προσοχή!):

    bash
    # Μόνο αν κανείς δεν έχει ακόμα ανακτήσει τα commits σας
    git rebase -i HEAD~5
    git push --force-with-lease    # Ασφαλέστερο από --force

Squash = η ηλεκτρική σκούπα σας για να καθαρίσετε το ιστορικό!

Επιστροφή στον πίνακα περιεχομένων