브랜치와 브랜치의 병합 과정에서, 동일한 내용을 각자 다르게 변경한 이력이 있을 때 변경 이력들끼리 발생하는 충돌을 의미한다.
위 두경우 Git은 브랜치의 병합 과정(머지)에서 두개의 수정사항 중 어떤 것이 올바른 수정사항인지 판단하지 못함 따라서 충돌이 발생했다는 메세지와 함께 해당 파일에 충돌 발생한 부분에 표시를 해주며, 병합을 중단하게됨
개발자는 표시된 파일을 확인해서 컨플릭트를 해결한 후 병합을 이어서 진행하는 방식으로 진행해야한다
컨플릭트는 발생하면 안되는 것이 아니다 Git을 사용한 작업 과정에서 흔히 겪는 일상적인 것
다만, 컨플릭트 발생 시 올바른 과정을 통해 해결할 수 있어야 하며, 해결 불가능할 정도의 대규모 컨플릭트가 발생하지 않도록 주의해야한다
conflict는 브랜치와 브랜치 사이에서 발생하는 것이다
feature/a 브랜치에서 작업한 내역을 master와 merge 하고 feature/b 브랜치에서 작업한 내역을 마찬가지로 master와 merge 했을때 충돌이 일어난 상황이다
Remote에서 발생한 conflict를 local에서 재현해야 local에서 해결한 후 Remote에 반영 가능 (Remote 와 local의 상황을 똑같이 맞춰 주어야함)
충돌이 발생한 시점에서 내가 생성한 브랜치(feature/b)에는 push를 하여 remote master에 변경사항이 적용 되었지만 local master 에는 변경사항이 반영되어 있지 않음 (feature/a 에는 반영되어있음)
git checkout master
마스터 브랜치로 이동 후git pull origin master
를 실행해 리모트에 있는 마스터의 작업 내역을 내 로컬로 가져온다
로컬 마스터와 리모트 마스터과 최신화됨
로컬에서 conflict를 발생해야함 이때 마스터 브랜치 경우에는 직접적으로 수정하는 것을 지양함 git checkout feature/b
로 이동해
마스터에 있는 작업 내역을 합친다 git merge master
현재 위치하고 있는 브랜치에 마스터 브랜치의 작업내역을 가져오겠다는 의미
이때 리모트에서 발생했던 것과 동일하게 conflict가 발생하게 됨
VSCode 의 git tap에서 mearge changes 탭안에 있는 파일들을 확인하면 손쉽게 충돌 부분의 확인이 가능함
conflict 발생한 파일들을 찾아서 해결한다 (코드 수정)
컨플릭트가 됐다고 표시해준 부분들을 다 삭제한뒤 (==, <<, >>) 내가 원하는 최종형태의 코드로 만들고 저장을 하면 된다 (어떤 변경 사항을 선택할 지 버튼으로도 조작 가능)
수정한 것을 기록으로 남겨둔다 git add .
git commit
로컬에서 conflict 해결한 이력을 리모트에 다시 알려준다
feature/b 브랜치에서 새롭게 생긴 작업 내역을 git push origin feature/b
로 작업내용을 리모트에 올려준다
정상적으로 완료되었다면 PR을 확인했을때 conflict 메세지는 없어지고
merge pull request
버튼이 활성화 된다 (개인프로젝트)