[GIT] 충돌

2022. 8. 10. 13:15GIT

보통 충돌은 3-way 병합이 실패한 경우이다.

 

충돌이 생기는 상황

대부분의 충돌 원인은 같은 위치의 코드를 동시에 수정했기 때문이다.

파일을 수정할 때 여러 개발자가 서로 다른 위치를 수정했다면 깃에서 서로 다른 위치의 소스를 자동으로 병합하기 때문에 문제가 없다.

같은 위치를 동시에 수정하면 두 수정 중 어떤 것이 맞는지 깃에서 알 수 없기 때문에 충돌이 일어난다.

깃은 충돌 오류를 알려주고 개발자가 직접 수정하여 해결해야 한다.

 

충돌 만들기

footer 브랜치와 master 브랜치에서 동일한 파일의 동일한 코드 위치를 수정하였다.

그리고 병합 명령어를 실행하였더니 충돌이 발생했다.

충돌 발생

두 브랜치의 index.html 파일에서 같은 위치의 내용을 다르게 수정해서 충돌이 발생했다.

 

소스트리에서 충돌이 발생하면 커밋하지 않은 변경사항으로 표시가 된다.

브랜치 경로
충돌 사항 표시

master 브랜치에 |MERGING 표시가 생겼다.

이는 충돌이 발생했다는 것을 의미한다.

충돌 내용 메시지로 출력

깃 상태를 보면 어떤 충돌 상태인지 알 수 있다.

Unmerged 메시지에서 index.html 파일이 동시에 수정되었다고 알리고 있다.

master 브랜치 내용을 자주 자신의 브랜치로 병합하는 것이 충돌을 많이 줄일 수 있는 방안이다.

 

※ 방금 실행한 병합을 취소할 때 --abort 옵션을 사용하면 된다.

$ git merge --abort

 

수동으로 충돌 해결

직접 소스 코드를 보고 충돌된 부분을 확인한 후 코드를 수정해야 한다.

index.html 파일을 들어가보면 깃이 충돌 부분을 두 부분으로 표시해주었다.

충돌 부분

하나는 기준이 되는 브랜치 내용이고 다른 하나는 병합하고자 하는 브랜치 내용이다.

======= 를 경계로

<<<<<<< HEAD : 기준이 되는 브랜치 내용

>>>>>>> 브랜치 이름 : 병합하고자 하는 브랜치 내용

충돌한 내용을 수정할 때 깃에서 표시한 충돌 기호도 함께 삭제해주어야 한다.

 

※ 저수준 명령어인 git ls-files -u 를 사용하여 충돌한 파일들의 집합을 확인할 수 있다.

$ git ls-files -u

 

충돌을 해결한 후 병합 커밋을 직접 만들어야 한다.

직접 충돌을 해결하면 파일은 modified 상태가 된다.

이를 다시 스테이지 영역에 등록하고 커밋을 한다.

충돌한 파일 다시 커밋하기

병합 커밋을 생성하면 깃의 충돌 마크는 자동으로 없어진다.

 

소스트리에서도 병합 커밋이 생성된 것을 확인할 수 있다.

브랜치 경로 변화

 

소스트리에서 충돌 해결

충돌이 발생하면 스테이지에 올라간 파일과 스테이지에 올가가지 않은 파일 두 영역에 파일이 표시된다.

파일을 클릭하면 충돌 메시지를 확인할 수 있다.

충돌한 파일에서 마우스 우클릭 - 충돌해결 - 해결된 것으로 표시 를 눌러

소스트리에서 해결되었다고 표시를 하고

코드를 직접 수정하고 다시 커밋을 진행하면 된다.

 

728x90

'GIT' 카테고리의 다른 글

[GIT] 브랜치 병합 여부 확인  (0) 2022.08.10
[GIT] 브랜치 삭제  (0) 2022.08.10
[GIT] 3 - way 병합  (0) 2022.08.10
[GIT] Fast-Forward 병합  (0) 2022.08.10
[GIT] 병합  (0) 2022.08.10