본문 바로가기
코딩해보니/Git

[Git_32] 충돌(Conflict) - 충돌이란? & 충돌 상황 만들기

by 위시랜 2023. 1. 14.

충돌(Conflict) 상황 만들기
충돌(Conflict) 상황 만들기

개요(충돌 이란?)

지금까지 Git의 기본적인 사항은 대부분 확인을 해봤습니다.

하지만, 이 외에도 아직도 많은 기능들이 있습니다.

많은 기능들이라기보다 실제 우리가 협업을 하다 보면

발생할 수 있는 상황들이 다양합니다.

 

아직도 많은 기능들이 있다는 것은

어찌 보면 우리가 겪을 수 있는

다양한 상황을 해결하기 위해 필요한 것들이라 할 수 있습니다.

 

우리가 겪을 수 있는 다양한 상황들 중에

대표적인 것이 충돌(Conflict)이 발생하는 경우라 할 수 있겠습니다.

 

대부분의 충돌은 같은 소스의 같은 위치를 수정한 것이 그 원인인 경우가 많습니다.

 

앞서 병합(merge)를 실행했을 때도

병합을 문제없이 실행된 결과를 보기 위해서

이러한 경우가 발생하지 않도록 했기에

정상적으로 병합이 잘 이뤄졌습니다.

 

하지만, 같은 위치를 수정했다면,

병합 과정에서 Git이 어떤 것을 선택해야 할 것인지 판단할 수 없습니다.

이때 Git은 충돌이 났다고 우리에게 알려줘서

직접 문제를 해결해서 병합하도록 하고 있습니다.

 

충돌이 발생하는 상황과 충돌이 발생했을 때

어떻게 처리하는지를 실습을 통해 학습해 보고자 합니다

 

앞서 우리는 hotfix, testbranch1 이라는 브랜치 2개를 만들었었고,

testbranch1은 병합 후 삭제까지 실습을 했기에,

현재 남아 있는 브랜치는 master와 hotfix 가 남아있는 상황이고,

커밋을 열 번째까지 진행한 바 있습니다.

 

실습을 위해 모두 commit 5 지점으로 돌리도록 하겠습니다.

학습했던 내용을 복습도 할 겸 되돌려 보기 바랍니다.

 

되돌린 현재 상태가 다음과 같습니다.

되돌릴 때 master와 hotfix 모두 각각 되돌려야 합니다.

충돌(Conflict) 실습을 위한 브랜치 구성과 커밋 이력 예시
충돌(Conflict) 실습을 위한 브랜치 구성과 커밋 이력 예시

 

그러면, 상기와 같이 master와 hotfix가

모두 commit 5를 마지막 HEAD 포인터를 가지는 것을 알 수 있습니다.

 

터미널(Git Bash)에서도 되돌린 후 확인한 결과가 다음과 같습니다.

실습을 위해 터미널(Git Bash)에서 확인한 Git 상황
실습을 위해 터미널(Git Bash)에서 확인한 Git 상황

 

master와 hotfix 브랜치의 커밋 이력이 모두 같음을 알 수 있습니다.

그래서, 지금 상황은 master에서 hotfix 브랜치를 생성한 직후의 결과와 같아집니다.


충돌 상황 만들기

[상황 1] hotfix 브랜치에서 fileb.html 파일 수정하기

<수정 전>

hotfix 브랜치에서 fileb.html 파일 수정 전 내용
hotfix 브랜치에서 fileb.html 파일 수정 전 내용

<수정 후>

hotfix 브랜치에서 fileb.html 파일 수정 후 내용
hotfix 브랜치에서 fileb.html 파일 수정 후 내용

 

fileb.html 파일을 열어 2번째 라인을 수정했습니다.

수정 후 커밋하고 master 브랜치로 체크아웃 하겠습니다.

실행 화면은 다음과 같습니다.

hotfix 브랜치에서 fileb.html 파일 수정 후 커밋하고&#44; master 브랜치로 체크아웃하기
hotfix 브랜치에서 fileb.html 파일 수정 후 커밋하고, master 브랜치로 체크아웃하기


[상황 2] master 브랜치에서 fileb.html 파일 수정하기

충돌 발생 상황을 만들기 위해

master에서 fileb.html 파일을 열어

같은 위치에 다른 내용으로 수정하겠습니다.

<수정 전>

master 브랜치에서 fileb.html 파일 수정 전 내용
master 브랜치에서 fileb.html 파일 수정 전 내용

<수정 후>

master 브랜치에서 fileb.html 파일 수정 후 내용
master 브랜치에서 fileb.html 파일 수정 후 내용

마찬가지로 수정 후 커밋하겠습니다.

커밋한 내용은 다음과 같습니다.

master 브랜치에서 fileb.html 파일 수정 후 커밋하기
master 브랜치에서 fileb.html 파일 수정 후 커밋하기

 

소스트리에서 확인해 보면 다음과 같은 결과인 것을 알 수 있습니다.

소스트리(Sourcetree)에서 커밋 이력 확인하기
소스트리(Sourcetree)에서 커밋 이력 확인하기

소스트리에서 master와 hotfix의 커밋 이력이 분기했음을 알 수 있습니다.


[상황 3] 병합 실행

이제 병합을 실행해 보겠습니다.

 

서로 다르게 분기된 브랜치이기 때문에

3-way 방식으로 병합이 실행될 것을 예상할 수 있습니다.

 

master 브랜치에서 hotfix 브랜치의 내용을 병합해 보겠습니다.

그 화면이 다음과 같습니다.

master 브랜치에서 hotfix 브랜치의 내용 병합(merge) 하기
master 브랜치에서 hotfix 브랜치의 내용 병합(merge) 하기

상기 결과를 보면,

CONFLICT (content) : Merge conflict in fileb.html

이라는 내용을 확인할 수 있습니다.


그리고, 다음 명령줄의 경로 표시 부분에

(master | MERGING)

이라는 충돌 상황을 표시해 줍니다.

이렇듯 충돌이 발생하면 Git은 충돌 오류를 표시해 줍니다.

 

소스트리에서도 확인한 결과,

“커밋하지 않은 변경사항” 하나가 추가되었고,

그래프를 보면 hotfix와 합쳐진 지점인 것을 볼 수 있습니다.

 

이는 병합과정에 충돌이 발생해서

커밋하지 않은 변경사항” 이 생겼다는 것으로 이해해야 합니다.

소스트리(Sourcetree)에서 커밋 이력 확인 하기
소스트리(Sourcetree)에서 커밋 이력 확인 하기

 

이와 같이 충돌이 발생하면 커밋이 자동으로 생성되지 않습니다.

충돌이 발생하면 Git은 병합 작업을 중단하게 되고,

이렇게 충돌이 발생하면 개발자가 직접 수동으로 해결해야 합니다.

 

충돌 상황을 보기 위해 $ git status 명령어로 Git 상태를 확인합니다.

터미널(Git Bash)에서 Git 상태 확인 하기
터미널(Git Bash)에서 Git 상태 확인 하기

 

Unmerged 메시지를 볼 수 있으며,

병합을 취소할 수 있는 방법이 눈에 띕니다.


방금 실행한 병합을 취소하기 위해서는

$ git merge --abort 라고 실행하면 되겠습니다.

# 직전에 실행한 병합(merge) 취소하기
$ git merge --abort

 

여기까지 Git에서 충돌(Conflict)이 무엇이고,

충돌이 발생할 수 있는 상황을 실습을 통해 확인해 봤습니다.

 

다음은 이러한 충돌을 어떻게 해결할 수 있는지

충돌을 해결하는 방법에 대해 알아보겠습니다.

 

감사합니다.

댓글