Кратак одговор
Git мерге конфликт настаје када две гране измене исти део фајла. Решава се тако што отворите фајлове са ознакама конфликта, ручно изаберете или спојите измене, сачувате, покренете `git add` и завршите са `git commit` или `git merge --continue`. Ако се запетљате, `git merge --abort` враћа све на стање пре мерге-а.
Како се проблем препознаје
- Порука `CONFLICT (content): Merge conflict in ...` у терминалу
- Фајлови садрже ознаке `<<<<<<<`, `=======`, `>>>>>>>`
- `git status` приказује фајлове под "Унмергед патхс"
- Мерге је започет али није завршен, `git log` не показује нови commit
- Едитор или IDE приказује црвене маркере на линијама са конфликтом
Најчешћи узроци
Измене истог дела фајла у две гране
Две гране су мењале исте линије кода или исти блок текста, па Git не може аутоматски да одлучи која верзија је исправна.
Брисање или премештање фајла у једној грани
Ако је фајл обрисан у једној грани, а измењен у другој, Git пријављује modify/delete конфликт.
Истовремени рад на истој грани
Два девелопера су мењала исти фајл без повлачења најновијих измена, па мерге касније открива преклапање.
Прилагођена мерге подешавања
`.gitattributes` или прилагођени мерге драјвери могу утицати на то како Git третира измене и када пријављује конфликт.
Решење корак по корак
- 1
Проверите стање репозиторијума
Покрените
git status. Фајлови са конфликтом биће наведени под "Унмергед патхс". Запишите их или отворите terminal у корену пројекта. Не прекидајте мерге док не одлучите шта желите. - 2
Отворите фајл са конфликтом
Отворите сваки фајл из листе у едитору. Потражите ознаке
<<<<<<< HEAD,=======и>>>>>>> ime-grane. Код подразумеваног стила, део између<<<<<<<и=======је ваша тренутна грана, а део између=======и>>>>>>>долази из гране која се спаја. Ако користитеdiff3стил, постоји и део са заједничким претком између|||||||и=======. - 3
Ручно спојите измене
Обришите све ознаке конфликта и оставите само жељени код. Можете задржати једну страну, другу, или комбиновати обе. Водите рачуна о заградама, зарезима и увлачењу. Ако нисте сигурни, отворите историју фајла (
git log -- fajl) да видите шта је ко мењао. - 4
Користите едитор или IDE за преглед
VS Цоде нуди опције "Accept Цуррент Цханге", "Accept Инцоминг Цханге" и "Accept Ботх Цхангес"; сличне опције имају и други едитори. То је брже, али увек прегледајте резултат. Не прихватајте слепо обе стране ако се логика кода преклапа.
- 5
Сачувајте и означите као решено
Када завршите фајл, сачувајте га и покрените
git add ime-fajla. Поновите за све фајлове из листе.git statusсада треба да прикаже "All цонфлицтс fixed бут you аре still мергинг". - 6
Завршите мерге
Покрените
git commit(без-mако желите да уредите поруку) илиgit merge --continue. Time се креира мерге commit. Проверитеgit log --oneline -3да видите да је мерге забележен. - 7
Тестирајте пре пусх-а
Покрените буилд и тестове (
npm test,mvn testили шта год пројекат користи). Конфликт може сакрити грешку која се види тек при извршавању. Тек када тестови прођу, урадитеgit push. - 8
Ако желите да одустанете
Команда
git merge --abortвраћа радни директоријум на стање пре почетка мерге-а. Користите је ако процените да је боље да прво повучете измене или се консултујете са колегом. Не користитеgit reset --hardако имате несачуване измене.
Када конфликт постане превелик
Ако фајл има десетине конфликтних блокова или не разумете код, немојте насумично бирати стране. Ако желите да сачувате стање пре мерге-а, направите резервну грану пре почетка мерге-а (git branch moja-rezerva); она не чува несачуване измене у радном директоријуму. Ако почињете мерге изнова, на циљној грани можете користити git merge --no-commit да прегледате измене пре commit-a. За велике конфликте корисно је укључити git config merge.conflictstyle diff3 који приказује и заједничког претка, што олакшава разумевање. Ако конфликт укључује бинарне фајлове, Git не може да их споји; тада морате ручно изабрати једну верзију (git checkout --ours fajl или --theirs), затим покренути git add fajl.
Како да спречите да се понови
- Често повлачите измене са главне гране (`git pull --rebase`) пре него што започнете већи посао.
- Држите измене мале и фокусиране на један задатак; чешће commit-ujte.
- Договорите се у тиму ко мења које фајлове и делове кода.
- Укључите `git config merge.conflictstyle diff3` да бисте лакше разумели конфликте.
Када је боље позвати стручњака
Ако конфликт укључује десетине фајлова, бинарне фајлове или не разумете код довољно да безбедно спојите измене, позовите IT подршку или искуснијег колегу да заједно решите конфликт и сачувате историју.
Развој софтвера и производа · Апликације по мери, SaaS и MVP за 4 до 8 недељаЧеста питања
Шта значе ознаке `<<<<<<<`, `=======` и `>>>>>>>`?
`<<<<<<< HEAD` означава почетак ваше тренутне гране, `=======` раздваја две верзије, а `>>>>>>> ime-grane` означава крај дела из гране која се спаја. Све ознаке конфликта морају бити обрисане пре него што означите фајл као решен.
Могу ли да поништим мерге ако сам већ покренуо `git add`?
Да, `git merge --abort` ради све док нисте завршили мерге commit. Ако сте већ направили мерге commit и нисте га пусх-овали, можете га поништити са `git reset --hard HEAD~1`, али прво направите резервну грану или копију репозиторијума. Ако је commit већ пусх-ован, користите `git revert -m 1 <hash>`.
Како да решим конфликт у бинарном фајлу?
Git не може аутоматски да споји бинарне фајлове. Одлучите која верзија је исправна и покрените `git checkout --ours fajl` (ваша грана) или `git checkout --theirs fajl` (друга грана), затим `git add fajl`.