Как да разрешаваме конфликти при сливане в Git

Как да разрешавам конфликти при сливане в 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), създадени от инструмента за различаване.

Коментари (20)
  1. Определете кои файлове са в конфликт (Git трябва да ви каже това).

  2. Отворете всеки файл и разгледайте различията; Git ги разграничава. Надяваме се, че ще е очевидно коя версия на всеки блок да запазите. Може да се наложи да го обсъдите с колегите разработчици, които са предали кода.

  3. След като сте разрешили конфликта в даден файл, git add the_file.

  4. След като сте разрешили всички конфликти, направете git rebase --continue или друга команда. Git е казал да направите, когато сте приключили.

Коментари (7)

Ако често правите малки поправки, започнете да преглеждате коментарите на поправките с 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 ще завърши сливането.

Коментари (1)