Как да разрешавам конфликти при сливане в Git?
Опитайте: git mergetool
Отваря се графичен потребителски интерфейс, който ви превежда през всеки конфликт и ви дава възможност да изберете начина на сливане. Понякога изисква малко ръчно редактиране след това, но обикновено е достатъчно само по себе си. Със сигурност е много по-добре, отколкото да правите всичко на ръка.
Според коментара на @JoshGlover:
Командата не отваря задължително графичен потребителски интерфейс, освен ако не инсталирате такъв. Изпълнението на 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 - резултат от сливането, това е, което се записва в репото
Можете да навигирате между тези изгледи, като използвате ctrl+w. Можете да достигнете директно до изгледа MERGED, като използвате ctrl+w, последван от j.
Повече информация за навигацията vimdiff тук и тук
Стъпка 4. Можете да редактирате изгледа MERGED по следния начин
Ако искате да получите промените от REMOTE
:diffg RE
Ако искате да получите промени от BASE
:diffg BA
Ако искате да получите промени от LOCAL
:diffg LO
Стъпка 5. Запазване, излизане, ангажиране и почистване
:wqa
запазване и излизане от vi
git commit -m "message"
git clean
Премахване на допълнителни файлове (например *.orig), създадени от инструмента за различаване.
Определете кои файлове са в конфликт (Git трябва да ви каже това).
Отворете всеки файл и разгледайте различията; Git ги разграничава. Надяваме се, че ще е очевидно коя версия на всеки блок да запазите. Може да се наложи да го обсъдите с колегите разработчици, които са предали кода.
След като сте разрешили конфликта в даден файл, git add the_file
.
След като сте разрешили всички конфликти, направете git rebase --continue
или друга команда.
Git е казал да направите, когато сте приключили.
Ако често правите малки поправки, започнете да преглеждате коментарите на поправките с git log --merge
. След това git diff
ще ви покаже конфликтите.
За конфликти, които включват повече от няколко реда, е по-лесно да видите какво се случва с външен инструмент с графичен потребителски интерфейс. Харесвам opendiff -- Git също така поддържа vimdiff, gvimdiff, kdiff3, tkdiff, meld, xxdiff, emerge out of the box, а можете да инсталирате и други: git config merge.tool "your.tool"
ще зададе избрания от вас инструмент и след това git mergetool
след неуспешно сливане ще ви покаже разликите в контекст.
Всеки път, когато редактирате файл, за да разрешите конфликт, git add filename
ще актуализира индекса и вашето различие вече няма да го показва. Когато всички конфликти са обработени и техните файлове са добавени, git commit
ще завърши сливането.