Πώς να αντιστρέψετε μια συγχώνευση Git
Το να κάνετε κατά λάθος το λάθος είναι πολύ συνηθισμένο όταν εργάζεστε με το Git, αλλά ευτυχώς, έχει δημιουργηθεί για να παρακολουθείτε το ιστορικό εκδόσεων του αποθετηρίου σας. Υπάρχει πάντα ένας τρόπος να αντιστρέψετε τις αλλαγές που έγιναν και αν θέλετε να αναιρέσετε μια συγχώνευση Git, είναι αρκετά εύκολο.
Αναίρεση συγχώνευσης Git
Βασικά, υπάρχουν δύο τρόποι για να το κάνετε αυτό και όλα εξαρτώνται από το αν έχετε ήδη προωθήσει τις αλλαγές στο στοιχείο ελέγχου πηγής. Εάν έχετε ήδη δεσμευτεί και προωθηθεί σε μια υπηρεσία όπως το GitHub, θεωρείται γενικά ότι είναι αμετάβλητη, εκτός εάν θέλετε να ασκήσετε πίεση, κάτι που είναι επικίνδυνο. Δεν θέλετε ποτέ να “διαγράψετε” δεσμεύσεις και οι συγχωνεύσεις git προστίθενται ως “δεσμεύσεις συγχώνευσης”. Θα θελήσετε να χρησιμοποιήσετε
git revert
για να αναιρέσετε με ασφάλεια τις αλλαγές και να πραγματοποιήσετε αυτήν την αναίρεση ως νέα δέσμευση.
Ωστόσο, αν μόλις μπερδέψατε κάτι τοπικά, καταραστείτε στο πληκτρολόγιό σας και αναζητήσατε μια λύση στο
Google
, μπορείτε ακόμα να διαγράψετε με ασφάλεια τη δέσμευση συγχώνευσης και να διατηρήσετε το ιστορικό σας Git καθαρό με ένα απλό
git reset
.
Επαναφορά τοπικά
Είναι πιο εύκολο και ασφαλές να χειριστείτε τις επαναφορές Git με έναν πελάτη GUI Git, όπου μπορείτε να δείτε εύκολα το ιστορικό του κλάδου. Δεν είναι απαραίτητο βέβαια, αλλά το οπτικό βοηθάει όταν έχεις πολύπλοκα κλαδιά.
Σε αυτό το παράδειγμα, θέλουμε να αναιρέσουμε τη συγχώνευση του κλάδου χαρακτηριστικών στον κύριο κλάδο. Δεδομένου ότι ο κλάδος χαρακτηριστικών δεν έχει αγγίξει στην πραγματικότητα, θέλουμε να επαναφέρουμε την ετικέτα “κύριας” κλάδου ώστε να δείχνει την τελευταία δέσμευση.
Για να το κάνουμε αυτό, θέλουμε
git checkout
τον κύριο κλάδο και, στη συνέχεια, επαναφέρετε την προηγούμενη δέσμευση. Η συντομογραφία για αυτό είναι HEAD^, και μπορούμε να εκτελέσουμε μια σκληρή επαναφορά στην τελευταία δέσμευση. Εάν δεν αισθάνεστε άνετα με μια «καταστροφική» επαναφορά, μπορείτε να κάνετε μια μαλακή επαναφορά και, στη συνέχεια, να απορρίψετε χειροκίνητα τις αλλαγές δέσμευσης συγχώνευσης.
git reset --hard HEAD^
Όπως μπορείτε να δείτε, αυτό απαλλαγεί εντελώς από τη δέσμευση συγχώνευσης και αφήνει ανέγγιχτο τον κλάδο των χαρακτηριστικών.
Εάν η δέσμευση στην οποία πρέπει να επαναφέρετε δεν είναι η τελευταία πριν από την τρέχουσα HEAD του κλάδου, μπορείτε απλώς να αντιγράψετε το αναγνωριστικό SHA1 για αυτό και να επαναφέρετε τη συγκεκριμένη δέσμευση.
Επαναφορά μιας δέσμευσης που έχει ήδη προωθηθεί
Δυστυχώς, εάν έχετε ήδη προωθήσει, δεν υπάρχει τρόπος να καταργήσετε τη δέσμευση συγχώνευσης χωρίς να αντικαταστήσετε το ιστορικό του αποθετηρίου σας. Θα μπορούσατε να κάνετε τα ίδια βήματα που φαίνονται παραπάνω και να μεταβείτε στο αποθετήριο upstream (όπως το GitHub) με το
--force
σημαία. Αλλά αυτό γενικά θεωρείται καταστροφικό και μη ασφαλές όταν έχετε πολλούς συνεργάτες, καθώς όλοι θα πρέπει να ενημερώσουν τα τοπικά repos τους.
Ο άλλος τρόπος για να αναιρέσετε τις δεσμεύσεις στο Git είναι να τις επαναφέρετε. Η επαναφορά μιας δέσμευσης θα εφαρμόσει τις αντίθετες αλλαγές στο αποθετήριο—για κάθε γραμμή που προστίθεται, αυτή η γραμμή αφαιρείται. Για οτιδήποτε έχει διαγραφεί, προστίθεται ξανά και ούτω καθεξής. Αυτό αντιστρέφει αποτελεσματικά τη δέσμευση, με το μειονέκτημα να είναι ότι αυτή η διαδικασία θα γεμίσει λίγο το ιστορικό εκδόσεων σας. Γενικά όμως, αυτή είναι καλή πρακτική για την αντιστροφή λαθών.
Η επαναφορά μιας δέσμευσης είναι αρκετά απλή. Πρώτα, θα πρέπει να τρέξεις
git log
για να λάβετε μια λίστα με δεσμεύσεις και τους αριθμούς ταυτότητας τους.
Στη συνέχεια, μπορείτε να αντιγράψετε τον κατακερματισμό SHA1 και να επαναφέρετε τη δέσμευση με
git revert
:
git revert 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f
Θα χρειαστεί να ωθήσετε αυτήν τη νέα «δέσμευση επαναφοράς» στο GitHub για να διορθώσετε το πρόβλημα.


