Αποστολή: Δημιουργήστε ένα έργο, κάντε 3 commits, διορθώστε το τελευταίο.
mkdir test-git && cd test-git && git init
# 3 commits
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
echo "print('v2')" > app.py && git add . && git commit -m "Version 2"
echo "print('v3 with bug')" > app.py && git add . && git commit -m "Version 3"
# Διόρθωση του τελευταίου commit
echo "print('v3 fixed')" > app.py && git add . && git commit --amend -m "Version 3 - Fixed"Επαλήθευση: git log --oneline → 3 commits, το τελευταίο λέει "Fixed"
Αποστολή: 2 λειτουργίες παράλληλα, καθαρή συγχώνευση.
# Βάση
echo "print('main')" > main.py && git add . && git commit -m "Main app"
# Λειτουργία 1
git checkout -b feature-login
echo "print('login')" > login.py && git add . && git commit -m "Add login"
# Λειτουργία 2
git checkout main && git checkout -b feature-api
echo "print('api')" > api.py && git add . && git commit -m "Add API"
# Συγχώνευση όλων στο main
git checkout main
git merge feature-login
git merge feature-api
# Καθαρισμός
git branch -d feature-login feature-apiΕπαλήθευση: git log --graph --oneline → προβολή των merges
Αποστολή: Ίδιο σενάριο, 2 διαφορετικές στρατηγικές.
mkdir test-merge && cd test-merge && git init
echo "print('base')" > app.py && git add . && git commit -m "Base"
# Κλάδος feature
git checkout -b feature
echo "print('feature')" > feature.py && git add . && git commit -m "Add feature"
# Το main προχωρά
git checkout main
echo "print('base v2')" > app.py && git add . && git commit -m "Update base"
# Merge
git merge feature
git log --graph --oneline # Προβολή του ιστορικού με mergemkdir test-rebase && cd test-rebase && git init
echo "print('base')" > app.py && git add . && git commit -m "Base"
git checkout -b feature
echo "print('feature')" > feature.py && git add . && git commit -m "Add feature"
git checkout main
echo "print('base v2')" > app.py && git add . && git commit -m "Update base"
# Rebase
git checkout feature && git rebase main
git checkout main && git merge feature
git log --oneline # Γραμμικό ιστορικόΕρώτηση: Ποια διαφορά βλέπετε στο git log;
Αποστολή: Ζογκλέρ με πολλές εργασίες.
mkdir test-stash && cd test-stash && git init
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
# Αρχίζετε να γράφετε κώδικα
echo "print('work in progress')" >> app.py
# ΕΠΕΙΓΟΝ! Πρέπει να αλλάξετε κλάδο
git stash # Αποθήκευση
git checkout -b hotfix
echo "print('URGENT FIX')" > fix.py && git add . && git commit -m "Critical fix"
# Cherry-pick της διόρθωσης προς το main
git checkout main
git cherry-pick <hash-du-fix>
# Επιστροφή στην εργασία σας
git stash pop
echo "print('feature complete')" >> app.py && git add . && git commit -m "Feature done"Πρόκληση: Η επείγουσα διόρθωση είναι στο main ΚΑΙ στο hotfix;
Αποστολή: Προσομοίωση επείγοντος με reset.
mkdir test-urgence && cd test-urgence && git init
# Πολλά commits
echo "print('v1')" > app.py && git add . && git commit -m "Version 1"
echo "print('v2')" > app.py && git add . && git commit -m "Version 2"
echo "print('v3')" > app.py && git add . && git commit -m "Version 3"
echo "print('v4 BROKEN')" > app.py && git add . && git commit -m "Version 4 - Bug!"
# Ωχ όχι! Η v4 σπάει τα πάντα στην παραγωγή
git log --oneline # Σημειώστε το hash της v3
# Λύση 1: Reset hard (καταστροφικό)
git reset --hard <hash-v3> # Επιστροφή στην v3, η v4 εξαφανίζεται
git log --oneline # Μόνο 3 commits πλέον
# Λύση 2: Revert (ασφαλές)
# Επαναφορά της v4 πρώτα
git reset --hard <hash-v4> # Επιστροφή στην v4
git revert HEAD # Δημιουργία commit που ακυρώνει την v4
git log --oneline # 5 commits: v1,v2,v3,v4,revert-v4Μάθημα: Revert = ασφαλές για την παραγωγή, Reset = ΟΚ για τοπικό
Μπορείτε να τα κάνετε όλα σε 15 λεπτά;
Αν ναι → κατέχετε το Git!