Σε αυτό το παράδειγμα, έχουμε ένα αποθετήριο με έναν κύριο κλάδο main που περιέχει ένα βασικό αρχείο fichier1.txt και ένα πρώτο αρχικό commit. Από το main, δημιουργούμε δύο κλάδους, branche1 και branche2, ο καθένας προορισμένος να δοκιμάσει αντίστοιχα το rebase και το merge. Έπειτα δημιουργούνται δύο επιπλέον κλάδοι εργασίας, branche-rebase από το branche1 και branche-merge από το branche2, για να προστεθούν τροποποιήσεις.
Το έργο ξεκινά με ένα αποθετήριο που περιέχει ένα μόνο commit στο main, που αντιστοιχεί στη δημιουργία του αρχείου fichier1.txt:
(main)
A # Αρχικό commit με fichier1.txtΣτο commit A, προσθέσαμε το αρχείο fichier1.txt με αρχικό περιεχόμενο.
Έπειτα δημιουργούνται δύο νέοι κλάδοι από το main:
branche1: προορίζεται να φιλοξενήσει το branche-rebase για δοκιμή του git rebase.branche2: προορίζεται να φιλοξενήσει το branche-merge για δοκιμή του git merge.Σε κάθε κλάδο εργασίας (branche-rebase και branche-merge), κάνουμε τρία διακριτά commits. Ακολουθούν τα commits λεπτομερώς για κάθε κλάδο:
(main)
A
(branche-rebase)
\
D---E---F # Commits προστεθειμένα στο branche-rebase
(branche-merge)
\
G---H---I # Commits προστεθειμένα στο branche-mergeCommits στο branche-rebase:
fichier-2-rebase.txt με αρχικό περιεχόμενο "Modification 1 dans branche-rebase".fichier-2-rebase.txt.fichier-2-rebase.txt.Commits στο branche-merge:
fichier-2-merge.txt με αρχικό περιεχόμενο "Modification 1 dans branche-merge".fichier-2-merge.txt.fichier-2-merge.txt.Αυτά τα commits προσθέτουν πανομοιότυπο περιεχόμενο, αλλά σε διαφορετικά αρχεία (fichier-2-rebase.txt και fichier-2-merge.txt), για σαφή σύγκριση μεταξύ merge και rebase.
branche-merge στο branche2 με git mergeΓια να ενσωματώσουμε τις τροποποιήσεις του branche-merge στο branche2, χρησιμοποιούμε την εντολή git merge στο branche2. Αυτή η λειτουργία δημιουργεί ένα commit συγχώνευσης που διατηρεί πλήρες ιστορικό και περιλαμβάνει τα commits του κλάδου εργασίας χωρίς να τα αναδιοργανώνει.
Το ιστορικό μετά το merge:
(branche2)
A-------J # J είναι το commit συγχώνευσης
\ |
\ |
G---H---I # το branche-merge διατηρεί το διακριτό ιστορικό τουbranche2 με τις τροποποιήσεις του branche-merge (G, H, I) χωρίς να τις μετακινεί ούτε να αλλάζει τη σειρά τους.git merge, το ιστορικό δείχνει ένα «σημείο σύνδεσης» που υποδεικνύει οπτικά πού συγχωνεύθηκε το branche-merge στο branche2. Αυτό διατηρεί πλήρες και διακριτό ιστορικό για κάθε κλάδο, κάτι που είναι συχνά χρήσιμο σε συνεργατικά έργα.branche-rebase στο branche1 με git rebaseΓια να ενσωματώσουμε τις τροποποιήσεις του branche-rebase στο branche1, χρησιμοποιούμε την εντολή git rebase. Σε αντίθεση με το merge, το rebase επανατοποθετεί τα commits (D, E, F) του branche-rebase σαν να είχαν δημιουργηθεί μετά το τελευταίο commit του branche1 (A).
Το ιστορικό μετά το rebase:
(branche1)
A---D'---E'---F' # Commits του branche-rebase ξαναεφαρμοσμένα στο τέλος του branche1branche-rebase εφαρμοσμένα γραμμικά μετά το A στο branche1.git rebase, τα commits του branche-rebase αναδιοργανώνονται ώστε να σχηματίσουν γραμμικό ιστορικό χωρίς «σημείο σύνδεσης», σαν να είχαν προστεθεί απευθείας μετά το αρχικό commit A. Αυτό απλοποιεί το ιστορικό κάνοντάς το καθαρότερο, αλλά μπορεί να κρύψει τη διαδρομή των αρχικών κλάδων εργασίας.Οι διαφορές που παρατηρούνται στα logs του Git επιτρέπουν καλύτερη κατανόηση των ειδικών χρήσεων του merge και του rebase.
git merge:
git rebase:
| Εντολή | Ιστορικό | Ιδανική περίπτωση χρήσης |
|---|---|---|
git merge | Πλήρες ιστορικό με σημείο σύνδεσης | Συνεργατικά έργα με πολλούς κλάδους |
git rebase | Γραμμικό ιστορικό χωρίς σημεία σύνδεσης | Καθαρισμός του ιστορικού πριν από κοινόχρηστο merge |
Συνοπτικά:
git merge -> Πλήρες ιστορικό με commit συγχώνευσης
git rebase -> Γραμμικό ιστορικό χωρίς commit συγχώνευσηςΑυτός ο οδηγός σας επιτρέπει να κατανοήσετε και να οπτικοποιήσετε τις διαφορές μεταξύ git merge και git rebase, και να επιλέξετε την καταλληλότερη μέθοδο ανάλογα με το πλαίσιο του έργου σας.