Προγραμματισμός

6 Git λάθη που θα κάνετε - και πώς να τα διορθώσετε

Ένας μεγάλος λόγος για τον οποίο οι προγραμματιστές χρησιμοποιούν ένα σύστημα ελέγχου πηγής όπως το Git είναι να αποφύγουν καταστροφές. Εάν κάνετε κάτι τόσο απλό όσο εσφαλμένα διαγράψετε ένα αρχείο ή ανακαλύψετε ότι οι αλλαγές που κάνατε σε δώδεκα αρχεία δεν ήταν σωστές, μπορείτε να αναιρέσετε αυτό που έχετε κάνει με λίγη ταλαιπωρία.

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

Ακολουθεί μια λίστα με πολλά από τα μεγαλύτερα Git boo-boos, μαζί με συμβουλές για την απόσυρσή τους και αποτρέποντας μερικά από αυτά. Όσο πιο κάτω πηγαίνετε στη λίστα, τόσο μεγαλύτερες είναι οι καταστροφές.

Λάθος Git # 1: Ξεχάσατε να προσθέσετε αλλαγές στην τελευταία δέσμευση

Αυτό είναι ένα από τα ευκολότερα Git blunderers για να ανακάμψετε. Ας υποθέσουμε ότι δεσμεύσατε κάποια δουλειά σε ένα τοπικό υποκατάστημα και, στη συνέχεια, συνειδητοποιήσατε ότι δεν καταγράψατε ορισμένα απαραίτητα αρχεία. Ή ξεχάσατε να προσθέσετε ορισμένες λεπτομέρειες στο μήνυμα δέσμευσης.

Χωρίς φόβο. Πρώτον, εάν έχετε νέες αλλαγές που θα πραγματοποιηθούν, κάντε το. Στη συνέχεια, πληκτρολογήστε git comm - τροποποίηση για να επεξεργαστείτε το μήνυμα δέσμευσης. Μόλις τελειώσετε, πατήστε Esc και μετά πληκτρολογήστε : xq για αποθήκευση και έξοδο από το πρόγραμμα επεξεργασίας. (Αυτό το τελευταίο βήμα είναι αυτό που συχνά φουσκώνει τους νεοεισερχόμενους του Git, οι οποίοι δεν συνειδητοποιούν πάντα ότι ο ενσωματωμένος επεξεργαστής Git είναι το δικό του ζώο.)

Εάν αλλάζετε απλά αρχεία και δεν χρειάζεται να τροποποιήσετε το μήνυμα δέσμευσης, μπορείτε να το χρησιμοποιήσετε git comm --amend --no-edit για να προσθέσετε τα αρχεία και να παραλείψετε τη διαδικασία επεξεργασίας μηνυμάτων.

Ένας τρόπος για να αποφύγετε τέτοιου είδους λάθη είναι να τροποποιήσετε τον τρόπο που κάνετε δεσμεύσεις στο Git. Εάν εργάζεστε σε κάτι όπου κάνετε συνεχώς μικρές δεσμεύσεις για την παρακολούθηση των στοιχειωδών αναθεωρήσεων, κάντε τις σε ένα κλαδί. Καθώς το κάνετε αυτό, τεκμηριώστε τις σημαντικές αλλαγές που κάνετε κάπου - μην περιμένετε μέχρι να αντιμετωπίσετε το git δεσμεύω γραμμή εντολών για να τα γράψετε όλα. Στη συνέχεια, όταν φτάσετε σε ένα σημαντικό ορόσημο, χρησιμοποιήστε git merge --squash από τον απορριπτόμενο κλάδο για να αποθηκεύσετε τα αποτελέσματα στον κλάδο εργασίας σε εξέλιξη ως ενιαίο, καθαρό δέσμευση και χρησιμοποιήστε τις σημειώσεις που έχετε λάβει για το μήνυμα δέσμευσης.

Σφάλμα Git # 2: Πραγματοποιήσατε αλλαγές στο (τοπικό) master

Ένα άλλο συνηθισμένο χάος: Έχετε πραγματοποιήσει υποχρεωτικά πολλές αλλαγές… αλλά κατά λάθος στον κύριο κλάδο του repo σας. Τι εσύ Πραγματικά ήθελα να κάνω ήταν να τους δεσμεύσουμε σε ένα νέος υποκατάστημα, ή σε αυτό dev υποκατάστημα που έχετε ειδικά για την αλλαγή αλλαγών.

Όλα δεν έχουν χαθεί. Αυτό το λάθος μπορεί να διορθωθεί με τρεις εντολές:

git branch new-branch

git reset HEAD ~ - σκληρό

git checkout new-branch

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

Εάν έχετε κάνει πολλές δεσμεύσεις, χρησιμοποιήστε το git reset HEAD ~ - σκληρό, όπου είναι ο αριθμός των δεσμεύσεων που θέλετε να πάτε. Ή μπορείτε να χρησιμοποιήσετε επαναφορά git , όπου είναι το αναγνωριστικό κατακερματισμού της δέσμευσης στόχου εάν έχετε αυτό το πρακτικό.

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

Λάθος Git # 3: Κάνατε ένα αρχείο ή έναν κατάλογο

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

Πρώτα, χρησιμοποιήστε git log ή το ενσωματωμένο εργαλείο Git του IDE για να βρείτε το αναγνωριστικό κατακερματισμού για μια δέσμευση από πριν το αρχείο τροποποιηθεί. Στη συνέχεια, χρησιμοποιήστε git checkout hash_id - / διαδρομή / προς / αρχείο να ελέγξω μόνο αυτό το αρχείο από την εν λόγω δέσμευση. Σημειώστε ότι η διαδρομή πρέπει να σχετίζεται με τη ρίζα του έργου. Αυτό θα τοποθετήσει την προηγούμενη έκδοση του αρχείου στην περιοχή σταδιοποίησης του έργου σας.

Αν θέλετε απλά να επιστρέψετε ν δεσμεύει, δεν χρειάζεστε το αναγνωριστικό κατακερματισμού. Μπορείτε απλώς να εκδώσετε την εντολή git checkout HEAD ~ - / διαδρομή / προς / αρχείο, όπου είναι ο αριθμός των δεσμεύσεων που θέλετε να πάτε.

Αν θέλετε να δείτε ολόκληρο Ευρετήριο αρχείων και, στη συνέχεια, χρησιμοποιήστε τη μορφή μπαλαντέρ του Git για διαδρομές αρχείων. Για παράδειγμα, η είσοδοςgit checkout HEAD ~ 1 - ./src/** θα σας πάρει πίσω μια δέσμευση και θα ανακτήσει τα πάντα στο / src κατάλογο από τη ρίζα του έργου σας.

Λάθος Git # 4: Διαγράψατε κατά λάθος ένα υποκατάστημα

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

Πρώτα, χρησιμοποιήστε git reflog για να βρείτε την τελευταία δέσμευση που έγινε στον κλάδο. Στη συνέχεια, χρησιμοποιήστε το αναγνωριστικό κατακερματισμού για να δημιουργήσετε έναν νέο κλάδο:

git checkout -b αποκατασταθεί-υποκατάστημα

Λάβετε υπόψη ότι αυτό θα ξεδιπλώσει το μπέικον σας μόνο εάν ο εν λόγω κλάδος είχε ήδη συγχωνευθεί. Εάν διαγράψετε αναγκαστικά ένα χωρίς συγχώνευση υποκατάστημα, έχετε έναν ακόμη τρόπο να το βρείτε, με την προϋπόθεση ότι δεν έχετε τρέξει git gc στο αποθετήριο:

git fsck --full --no-reflogs - unreachable --lost-found

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

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

Σφάλμα Git # 5: Με το απομακρυσμένο κλαδί σκατά

Μόλις δούλευα σε ένα τοπικό αντίγραφο ενός αποθετηρίου GitHub και έσπρωξα κατά λάθος το κύριο υποκατάστημα μου στο απομακρυσμένο αντίγραφο με το --δύναμη επιλογή. Κατέληξα με ένα δημόσιο αντίγραφο ενός repo που δεν βρισκόταν τότε σε κατάσταση χρήσης. Ωχ!

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

επαναφορά git --hard / @ {1}

Αυτό θα επαναφέρει το αντίγραφο του στην τελευταία συγχρονισμένη έκδοση του . Στην περίπτωσή μου το υποκατάστημα ήταν κύριος και το απομακρυσμένο ρεπό ήταν προέλευση, έτσι θα μπορούσα να το χρησιμοποιήσω επαναφορά git - σκληρή προέλευση / κύριο @ {1}.

Στη συνέχεια χρησιμοποιήστε git push -f για να επαναφέρετε το απομακρυσμένο αποθετήριο στην προηγούμενη κατάσταση.

Ένας τρόπος για να αποτρέψετε αυτό να συμβεί ξανά είναι να απαγορεύσετε την ώθηση. Μπορείτε να το ρυθμίσετε στο απομακρυσμένο repo Git με αυτήν την εντολή:

git config --system Rece.denyNonFastForwards true

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

Σφάλμα Git # 6: Έχετε δεσμεύσει ιδιωτικές πληροφορίες σε ένα δημόσιο repo

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

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

Τα καλά νέα: Μερικοί ατρόμητοι Git mavens δημιούργησαν ένα εργαλείο, το BFG Repo-Cleaner, ειδικά με σκοπό την αφαίρεση κακών δεδομένων από τα Git repos. Το BFG Repo-Cleaner σας επιτρέπει να εκτελείτε γρήγορα κοινές εργασίες σε ένα repo, όπως να αφαιρείτε όλα τα αρχεία που ταιριάζουν με ένα συγκεκριμένο μπαλαντέρ ή που περιέχουν συγκεκριμένα κείμενα. Μπορείτε ακόμη και να περάσετε σε ένα αρχείο που περιέχει όλα τα ανεπιθύμητα κείμενα.

Το BFG Repo-Cleaner είναι ουσιαστικά αυτοματοποίηση για μια διαδικασία πολλαπλών βημάτων git φίλτρο-κλάδος. Εάν προτιμάτε να κάνετε τα πράγματα με το χέρι, το GitHub έχει μια λεπτομερή περιγραφή της διαδικασίας. Ωστόσο, το εργαλείο BFG καλύπτει τη συντριπτική πλειονότητα των περιπτώσεων κοινής χρήσης, πολλές από τις οποίες ενσωματώνονται στις επιλογές της γραμμής εντολών του εργαλείου. Επιπλέον, η διαδικασία είναι μακρά και περίπλοκη και είναι πολύ εύκολο να πυροβολήσετε τον εαυτό σας με τα πόδια κάπου στο δρόμο, αν το κάνετε με το χέρι.

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

$config[zx-auto] not found$config[zx-overlay] not found