Πώς επιλύω συγκρούσεις συγχώνευσης στο Git;
Δοκιμάστε: git mergetool
Ανοίγει ένα γραφικό περιβάλλον που σας καθοδηγεί σε κάθε σύγκρουση και μπορείτε να επιλέξετε τον τρόπο συγχώνευσης. Μερικές φορές απαιτεί λίγη χειροκίνητη επεξεργασία στη συνέχεια, αλλά συνήθως είναι αρκετό από μόνο του. Είναι σίγουρα πολύ καλύτερο από το να το κάνετε όλο αυτό με το χέρι.
Σύμφωνα με το σχόλιο του @JoshGlover:
Η εντολή δεν ανοίγει απαραίτητα ένα GUI, εκτός αν εγκαταστήσετε ένα. Η εκτέλεση του git mergetool
για μένα είχε ως αποτέλεσμα τη χρήση του vimdiff
. Μπορείτε να εγκαταστήσετε ένα από τα παρακάτω εργαλεία για να το χρησιμοποιήσετε αντί αυτού: meld
, opendiff
, kdiff3
, tkdiff
, xxdiff
, tortoisemerge
, gvimdiff
, diffuse
, ecmerge
, p4merge
, araxis
, vimdiff
, emerge
.
Ακολουθεί το παράδειγμα διαδικασίας για τη χρήση του vimdiff
για την επίλυση συγκρούσεων συγχώνευσης. Με βάση αυτόν τον σύνδεσμο
Βήμα 1: Εκτελέστε τις ακόλουθες εντολές στο τερματικό σας
git config merge.tool vimdiff
git config merge.conflictstyle diff3
git config mergetool.prompt false
Αυτό θα ορίσει το vimdiff ως το προεπιλεγμένο εργαλείο συγχώνευσης.
Βήμα 2: Εκτελέστε την ακόλουθη εντολή στο τερματικό
git mergetool
Βήμα 3: Θα δείτε μια οθόνη vimdiff με την ακόλουθη μορφή
╔═══════╦══════╦════════╗
║ ║ ║ ║
║ LOCAL ║ BASE ║ REMOTE ║
║ ║ ║ ║
╠═══════╩══════╩════════╣
║ ║
║ MERGED ║
║ ║
╚═══════════════════════╝
Αυτές οι 4 προβολές είναι
LOCAL - αυτό είναι το αρχείο από τον τρέχοντα κλάδο
BASE - κοινός πρόγονος, πώς φαινόταν το αρχείο πριν από τις δύο αλλαγές
REMOTE - αρχείο που συγχωνεύετε στον κλάδο σας
MERGED - το αποτέλεσμα της συγχώνευσης, αυτό αποθηκεύεται στο repo
Μπορείτε να πλοηγηθείτε μεταξύ αυτών των προβολών χρησιμοποιώντας ctrl+w. Μπορείτε να φτάσετε απευθείας στην προβολή MERGED χρησιμοποιώντας το ctrl+w ακολουθούμενο από το j.
Περισσότερες πληροφορίες σχετικά με την πλοήγηση vimdiff εδώ και εδώ
Βήμα 4. Θα μπορούσατε να επεξεργαστείτε την προβολή MERGED με τον ακόλουθο τρόπο
Αν θέλετε να λάβετε αλλαγές από το REMOTE
:diffg RE
Αν θέλετε να λαμβάνετε αλλαγές από τη ΒΑΣΗ
:diffg BA
Αν θέλετε να λάβετε αλλαγές από το LOCAL
:diffg LO
Βήμα 5. Αποθήκευση, έξοδος, δέσμευση και καθαρισμός
:wqa
αποθήκευση και έξοδος από το vi
git commit -m "message"
git clean
Αφαιρέστε τα επιπλέον αρχεία (π.χ. *.orig) που δημιουργήθηκαν από το εργαλείο diff.
Προσδιορίστε ποια αρχεία βρίσκονται σε σύγκρουση (το Git θα πρέπει να σας το πει αυτό).
Ανοίξτε κάθε αρχείο και εξετάστε τα diffs- το Git τα οριοθετεί. Ας ελπίσουμε ότι θα είναι προφανές ποια έκδοση κάθε μπλοκ πρέπει να κρατήσετε. Ίσως χρειαστεί να το συζητήσετε με τους συναδέλφους προγραμματιστές που δέσμευσαν τον κώδικα.
Μόλις επιλύσετε τη σύγκρουση σε ένα αρχείο git add the_file
.
Μόλις επιλύσετε όλες τις συγκρούσεις, κάντε git rebase --continue
ή οποιαδήποτε άλλη εντολή
Git είπε να κάνετε όταν ολοκληρώσατε.
Αν κάνετε συχνά μικρές μεταβιβάσεις, τότε ξεκινήστε κοιτάζοντας τα σχόλια των μεταβιβάσεων με την εντολή git log --merge
. Στη συνέχεια, το git diff
θα σας δείξει τις συγκρούσεις.
Για συγκρούσεις που περιλαμβάνουν περισσότερες από μερικές γραμμές, είναι ευκολότερο να δείτε τι συμβαίνει σε ένα εξωτερικό εργαλείο GUI. Μου αρέσει το opendiff -- το Git υποστηρίζει επίσης τα vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge out of the box και μπορείτε να εγκαταστήσετε και άλλα: tool "your.tool"git config merge.tool "
θα ορίσει το εργαλείο που επιλέξατε και στη συνέχεια το git mergetool
μετά από μια αποτυχημένη συγχώνευση θα σας δείξει τις διαφορές στο πλαίσιο.
Κάθε φορά που επεξεργάζεστε ένα αρχείο για να επιλύσετε μια σύγκρουση, το git add filename
θα ενημερώνει το ευρετήριο και το diff σας δεν θα το δείχνει πλέον. Όταν όλες οι συγκρούσεις αντιμετωπιστούν και τα αρχεία τους έχουν τροποποιηθεί με το git add
, το git commit
θα ολοκληρώσει τη συγχώνευση.