Το Git Squash εξήγησε

Τι είναι το Git Squash;

Ένα από τα πράγματα που οι προγραμματιστές ακούνε συχνά σχετικά με τα αιτήματα τραβήγματος είναι κάτι σαν "Αυτό μου φαίνεται καλό, παρακαλώ σκουός και συγχωνεύσου". Το διασκεδαστικό είναι ότι δεν υπάρχει τέτοια εντολή git squash(εκτός αν δημιουργήσετε ένα ψευδώνυμο σε αυτήν).

Το να squashτραβήξετε το αίτημα σημαίνει συνήθως να συμπιέσετε όλες τις δεσμεύσεις σε αυτό το αίτημα σε ένα (σπάνια σε άλλο αριθμό) για να το κάνετε πιο συνοπτικό, αναγνώσιμο και να μην μολύνει την ιστορία του κύριου κλάδου. Για να επιτευχθεί αυτό, ένας προγραμματιστής πρέπει να χρησιμοποιεί διαδραστική λειτουργία της εντολής Git Rebase.

Πολύ συχνά όταν αναπτύσσετε κάποια νέα δυνατότητα, καταλήγετε σε πολλές διαλείπουσες δεσμεύσεις στην ιστορία σας - εξελίσσεστε σταδιακά. Αυτό μπορεί να είναι μερικά τυπογραφικά λάθη ή βήματα για την τελική λύση. Τις περισσότερες φορές δεν έχει νόημα να έχετε όλες αυτές τις δεσμεύσεις στην τελική δημόσια έκδοση του κωδικού σας, επομένως είναι πιο ωφέλιμο να συμπιέσετε όλα αυτά σε μία, μία και τελική έκδοση.

Ας υποθέσουμε, λοιπόν, ότι ακολουθείτε το αρχείο καταγραφής δεσμεύσεων στον κλάδο που θέλετε να συγχωνεύσετε ως μέρος του αιτήματος έλξης:

$ git log --pretty=oneline --abbrev-commit 30374054 Add Jupyter Notebook stub to Data Science Tools 8490f5fc Minor formatting and Punctuation changes 3233cb21 Prototype for Notebook page

Προφανώς θα προτιμούσαμε να έχουμε μόνο μία δέσμευση εδώ, καθώς δεν υπάρχει κανένα όφελος από το να γνωρίζουμε τι ξεκινήσαμε να γράφουμε και ποια τυπογραφικά λάθη διορθώσαμε εκεί αργότερα. Μόνο το τελικό αποτέλεσμα είναι σημαντικό.

Αυτό που κάνουμε λοιπόν είναι να ξεκινήσουμε μια διαδραστική συνεδρία επαναφοράς από την τρέχουσα HEAD (δέσμευση 30374054 ) για να δεσμεύσουμε 3233cb21 , με την πρόθεση να συνδυάσουμε τις 3 τελευταίες δεσμεύσεις σε μία:

$ git rebase -i HEAD~3

Αυτό θα ανοίξει ένα πρόγραμμα επεξεργασίας με κάτι σαν το εξής:

pick 3233cb21 Prototype for Notebook page pick 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools # Rebase # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Όπως πάντα, το Git μας δίνει ένα πολύ ωραίο μήνυμα βοήθειας όπου μπορείτε να δείτε την squashεπιλογή που αναζητούμε.

Επί του παρόντος, οι οδηγίες για την διαδραστική επαναφορά αναφέρουν σε pickκάθε καθορισμένη δέσμευση και διατηρούν το αντίστοιχο μήνυμα ανάληψης. Δηλαδή - μην αλλάζεις τίποτα. Αλλά θέλουμε να έχουμε μόνο μία δέσμευση στο τέλος.

Έτσι, μπορείτε απλά να επεξεργαστείτε το κείμενο στον επεξεργαστή σας αντικαθιστώντας pickμε squash(ή απλά s) το επόμενο έτος κάθε δέσμευση που θέλουμε να ξεφορτωθούμε και να αποθηκεύσουμε / βγούμε από τον επεξεργαστή. Αυτό μπορεί να μοιάζει με αυτό:

s 3233cb21 Prototype for Notebook page s 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools

Όταν κλείσετε τον επεξεργαστή σας αφού αποθηκεύσετε αυτήν την αλλαγή, θα ανοίξει ξανά αμέσως και θα σας προτείνει να επιλέξετε και να επαναδιατυπώσετε αυτά τα μηνύματα δέσμευσης. Κάτι σαν αυτό:

# This is a combination of 3 commits. # The first commit's message is: Prototype for Notebook page # This is the 2nd commit message: Minor formatting and Punctuation changes # This is the 3rd commit message: Add Jupyter Notebook to Data Science Tools # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit.

Σε αυτό το σημείο μπορείτε να διαγράψετε όλα τα μηνύματα που δεν θέλετε να συμπεριληφθούν στην τελική έκδοση δέσμευσης. Μπορείτε επίσης να τις επαναδιατυπώσετε ή απλώς να γράψετε μήνυμα δέσμευσης από το μηδέν.

Απλώς θυμηθείτε ότι η νέα έκδοση θα περιλαμβάνει όλες τις γραμμές που δεν ξεκινούν με τον #χαρακτήρα. Για άλλη μια φορά, αποθηκεύστε και βγείτε από τον επεξεργαστή σας.

Το τερματικό σας θα πρέπει τώρα να εμφανίζει ένα μήνυμα επιτυχίας, καθώς Successfully rebased and updated και το αρχείο καταγραφής git θα πρέπει να εμφανίζει μια ωραία και συμπαγή ιστορία με μία μόνο δέσμευση. Όλες οι ενδιάμεσες δεσμεύσεις έχουν φύγει και είμαστε έτοιμοι να συγχωνευτούμε!

Προειδοποίηση για αναντιστοιχία ιστορικού και απομακρυσμένου ιστορικού δεσμεύσεων

Αυτή η λειτουργία είναι ελαφρώς επικίνδυνη εάν έχετε ήδη δημοσιεύσει το υποκατάστημα σας σε απομακρυσμένο αποθετήριο - τροποποιείτε το ιστορικό δεσμεύσεων. Γι 'αυτό είναι καλύτερο να κάνετε τη λειτουργία σκουός σε ένα τοπικό υποκατάστημα πριν κάνετε το σπρώξιμο .

Μερικές φορές, θα προωθηθεί - πώς θα δημιουργήσετε τελικά ένα αίτημα έλξης; Σε αυτήν την περίπτωση, θα πρέπει να επιβάλετε τις αλλαγές στο απομακρυσμένο κλάδο αφού κάνετε το squashing, καθώς το τοπικό σας ιστορικό και το ιστορικό κλάδου στο απομακρυσμένο αποθετήριο είναι διαφορετικά:

$ git push origin +my-branch-name

Κάντε το καλύτερό σας για να βεβαιωθείτε ότι είστε ο μόνος που χρησιμοποιεί αυτό το απομακρυσμένο υποκατάστημα σε αυτό το σημείο, ή θα κάνετε τη ζωή του άλλου προγραμματιστή πιο δύσκολη όταν έχουν αναντιστοιχία ιστορικού. Όμως, δεδομένου ότι το squashing γίνεται συνήθως ως η τελική λειτουργία σε ένα κλαδί πριν το ξεφορτωθεί, συνήθως δεν είναι τόσο ανησυχητικό.