Git Conflict

누리·2022년 10월 7일
0

Team Project

목록 보기
4/8

Git Conflict 란 ?

브랜치와 브랜치의 병합 과정에서, 동일한 내용을 각자 다르게 변경한 이력이 있을 때 변경 이력들끼리 발생하는 충돌을 의미한다.

  • 두 사람이 같은 파일의 같은 줄을 각자 다르게 수정했을경우
  • A 개발자가 B 개발자가 수정 중이던 파일을 삭제한 경우

    위 두경우 Git은 브랜치의 병합 과정(머지)에서 두개의 수정사항 중 어떤 것이 올바른 수정사항인지 판단하지 못함 따라서 충돌이 발생했다는 메세지와 함께 해당 파일에 충돌 발생한 부분에 표시를 해주며, 병합을 중단하게됨

    개발자는 표시된 파일을 확인해서 컨플릭트를 해결한 후 병합을 이어서 진행하는 방식으로 진행해야한다

컨플릭트는 발생하면 안되는 것이 아니다 Git을 사용한 작업 과정에서 흔히 겪는 일상적인 것
다만, 컨플릭트 발생 시 올바른 과정을 통해 해결할 수 있어야 하며, 해결 불가능할 정도의 대규모 컨플릭트가 발생하지 않도록 주의해야한다

conflict 해결 방법

conflict는 브랜치와 브랜치 사이에서 발생하는 것이다

feature/a 브랜치에서 작업한 내역을 master와 merge 하고 feature/b 브랜치에서 작업한 내역을 마찬가지로 master와 merge 했을때 충돌이 일어난 상황이다

  1. Remote에서 발생한 conflict를 local에서 재현해야 local에서 해결한 후 Remote에 반영 가능 (Remote 와 local의 상황을 똑같이 맞춰 주어야함)

  2. 충돌이 발생한 시점에서 내가 생성한 브랜치(feature/b)에는 push를 하여 remote master에 변경사항이 적용 되었지만 local master 에는 변경사항이 반영되어 있지 않음 (feature/a 에는 반영되어있음)

    git checkout master 마스터 브랜치로 이동 후 git pull origin master 를 실행해 리모트에 있는 마스터의 작업 내역을 내 로컬로 가져온다
    로컬 마스터와 리모트 마스터과 최신화됨

  3. 로컬에서 conflict를 발생해야함 이때 마스터 브랜치 경우에는 직접적으로 수정하는 것을 지양함 git checkout feature/b로 이동해
    마스터에 있는 작업 내역을 합친다 git merge master

    현재 위치하고 있는 브랜치에 마스터 브랜치의 작업내역을 가져오겠다는 의미
    이때 리모트에서 발생했던 것과 동일하게 conflict가 발생하게 됨
    VSCode 의 git tap에서 mearge changes 탭안에 있는 파일들을 확인하면 손쉽게 충돌 부분의 확인이 가능함

  4. conflict 발생한 파일들을 찾아서 해결한다 (코드 수정)
    컨플릭트가 됐다고 표시해준 부분들을 다 삭제한뒤 (==, <<, >>) 내가 원하는 최종형태의 코드로 만들고 저장을 하면 된다 (어떤 변경 사항을 선택할 지 버튼으로도 조작 가능)
    수정한 것을 기록으로 남겨둔다 git add . git commit

  5. 로컬에서 conflict 해결한 이력을 리모트에 다시 알려준다
    feature/b 브랜치에서 새롭게 생긴 작업 내역을 git push origin feature/b 로 작업내용을 리모트에 올려준다

  6. 정상적으로 완료되었다면 PR을 확인했을때 conflict 메세지는 없어지고
    merge pull request 버튼이 활성화 된다 (개인프로젝트)

profile
프론트엔드 개발자

0개의 댓글