Πώς να αφαιρέσετε το παλιό ιστορικό Git πριν από μια δέσμευση
Όταν εργάζεστε με τον έλεγχο έκδοσης Git, είναι συχνά απαραίτητο να τροποποιείτε το ιστορικό δεσμεύσεων με μη αυτόματο τρόπο, παρόλο που προορίζεται να είναι αμετάβλητο. Με μερικές εντολές, μπορείτε να ξεκινήσετε εκ νέου και να διαγράψετε όλο το ιστορικό του Git πριν από ένα συγκεκριμένο σημείο.
Γιατί να αφαιρέσετε τις Old Git Commits;
Μερικές φορές όταν εργάζεστε με αποθετήρια Git, μπορεί να χρειαστεί να αφαιρέσετε όλο το ιστορικό του Git πριν από μια συγκεκριμένη δέσμευση. Αυτό είναι συνήθως χρήσιμο όταν θέλετε να ξεκινήσετε νέα με ένα νέο ιστορικό. Όλος ο κώδικας θα παραμείνει ίδιος, αλλά η εγγραφή όλων των αλλαγών του μπορεί να διαγραφεί χωρίς πρόβλημα.
Για παράδειγμα, ας πούμε ότι έχετε ένα πραγματικά υπέροχο έργο ιστότοπου με όλο το boilerplate ήδη ρυθμισμένο και θέλετε να δημιουργήσετε έναν άλλο ιστότοπο. Θα μπορούσατε να ξεκινήσετε από το μηδέν ή θα μπορούσατε να χρησιμοποιήσετε τον πρώτο ιστότοπο ως πρότυπο κλωνοποιώντας τον, αφαιρώντας όλες τις σελίδες και τον κώδικα που δεν χρειάζεστε και, στη συνέχεια, δεσμεύοντάς τον ξανά σε ένα νέο αποθετήριο. Ωστόσο, αν το κάνετε αυτό, θα έχετε ένα ακατάστατο ιστορικό δεσμεύσεων, γεμάτο με όλες τις αλλαγές πριν το κλωνοποιήσετε. Αυτό είναι χρήσιμο για τα πιρούνια των αποθετηρίων, αλλά σε αυτήν την περίπτωση, μπορεί να αφαιρεθεί.
Η κατάργηση παλαιών δεσμεύσεων μπορεί επίσης να είναι χρήσιμη όταν θέλετε να αφαιρέσετε ευαίσθητα δεδομένα που μπορεί να έχουν δεσμευτεί κατά λάθος. Επειδή το ιστορικό Git είναι συνήθως αμετάβλητο, δεν μπορείτε να αφαιρέσετε εντελώς μυστικά ή διακριτικά που κατέληξαν στα αρχεία καταγραφής δεσμεύσεων επαναφέροντας τη δέσμευση — πρέπει να το διαγράψετε εντελώς.
Είναι σημαντικό να σημειωθεί ότι η αλλαγή του ιστορικού του Git, με οποιονδήποτε τρόπο, μπορεί να προκαλέσει προβλήματα όταν άλλα μέλη της ομάδας καταλήξουν σε ένα παλιό αποθετήριο. Το ιστορικό Git προορίζεται να είναι αμετάβλητο – οι δεσμεύσεις προστίθενται μόνο, ποτέ δεν αφαιρούνται. Εάν θέλετε να καταργήσετε μια δέσμευση από ένα κοινόχρηστο αποθετήριο GitHub, πρέπει είτε να το κάνετε πριν προωθηθούν οι δεσμεύσεις είτε να “πιέσετε αναγκαστικά” για να αντικαταστήσετε τα περιεχόμενα του αποθετηρίου. Εάν ασκήσετε πίεση, θα χρειαστεί να δώσετε εντολή σε όλους τους συνεργάτες σας να επανακλωνοποιήσουν το αποθετήριο.
Αφαίρεση όλων των δεσμεύσεων πριν από μια δέσμευση
Το πρώτο βήμα είναι να λάβετε μια αναφορά στο αναγνωριστικό δέσμευσης που θέλετε να στοχεύσετε. Αυτό είναι εύκολο με μια εφαρμογή GUI ή μέσω του ιστότοπου GitHub, όπου μπορείτε να δείτε απευθείας το αρχείο καταγραφής δέσμευσης. Διαφορετικά, μπορείτε να χρησιμοποιήσετε το
git log
εντολή για προβολή μιας λίστας δεσμεύσεων.
git log
Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε
git checkout
με το ειδικό
--orphan
flag, το οποίο δεν θα ελέγξει κανένα ιστορικό έκδοσης πριν από τη συγκεκριμένη δέσμευση. Για παράδειγμα, ας πούμε ότι θέλαμε να δημιουργήσουμε ένα αντίγραφο του αποθετηρίου μετά την “μετάβαση σε .NET 6”, θα μπορούσαμε να αντιγράψουμε το SHA1 ID αυτής της δέσμευσης και να εκτελέσουμε:
git checkout --orphan orphan-branch ee96691d2785da4bbbbb058382d41e0ccf2a7e7b
Αυτό θα αφήσει το αποθετήριο σε μια κατάσταση όπου οι παραπομπές HEAD που έχουν ελεγχθεί δεν θα δεσμεύουν, κάτι που μπορεί στην πραγματικότητα να προκαλέσει σφάλματα σε πελάτες Git GUI όπως το GitKraken, που εμφανίζονται εδώ. Θα χρειαστεί να σκηνοθετήσετε όλα τα αρχεία και να επαναλάβετε την εκκίνηση:
git add -A git commit -m "Truncated history"
Αυτό θα σας αφήσει με ένα νέο «ορφανό κλάδο» χωρίς αναφορές σε δεσμεύσεις πριν από το περικομμένο ιστορικό.
Ωστόσο, δεν έχει επίσης αναφορές σε δεσμεύσεις μετά το περικομμένο ιστορικό και ο κύριος κλάδος εξακολουθεί να δείχνει σε λάθος τοποθεσία. Για να τα πάρουμε πίσω, πρέπει να επαναφέρουμε τον κύριο κλάδο στον ορφανό κλάδο. Αυτό ουσιαστικά θα κόψει όλες τις δεσμεύσεις μετά τον στόχο από τον κύριο, θα τις σύρει πάνω από τον ορφανό κλάδο και, στη συνέχεια, θα ενημερώσει την ετικέτα κλάδου “κύριος” για να δείχνει σε αυτήν τη νέα θέση.
Χρησιμοποιώντας το ίδιο αναγνωριστικό δέσμευσης όπως πριν, χρησιμοποιήστε την ακόλουθη εντολή για να εκτελέσετε την επαναφορά:
git rebase --onto orphan-branch ee96691d2785da4bbbbb058382d41e0ccf2a7e7b master
Τώρα θα πρέπει να έχετε ένα σωστό ιστορικό δεσμεύσεων, όπου ο κύριος κλάδος δεν αναφέρεται σε παλιές δεσμεύσεις. Εάν είστε συνδεδεμένοι σε τηλεχειριστήριο, η διακλάδωση “απομακρυσμένου κύριου” μπορεί να εξακολουθεί να δείχνει τις παλιές δεσμεύσεις, αλλά αυτές θα εξαφανιστούν μόλις πιέσετε αναγκαστικά.
Το τελευταίο πράγμα που πρέπει να κάνετε είναι να διαγράψετε τα παλιά δεδομένα, να αφαιρέσετε τον προσωρινό ορφανό κλάδο και να καθαρίσετε με το Git:
git branch -D orphan-branch git prune --progress git gc --aggressive
Μόλις γίνει αυτό, το μόνο που μένει να κάνετε είναι να προσθέσετε ένα τηλεχειριστήριο και να πιέσετε στο νέο αποθετήριο GitHub. Ωστόσο, εάν περικόπτετε το ιστορικό σε ένα υπάρχον αποθετήριο, θα χρειαστεί να πιέσετε για να αντικαταστήσετε το ιστορικό:
git push --force
Και αυτό είναι το μόνο που υπάρχει. Τακτοποιήσατε την παλιά ιστορία σας για να διατηρήσετε τα πράγματα τακτοποιημένα και οργανωμένα.


