본문 바로가기

개발/Git

[Git] Branch Merge 충돌 실습

Step 1. 실습 파일 생성 후 커밋하기

먼저 병합 과정에서 일부러 충돌을 일으킬 실습 파일을 생성한 다음 커밋한다.

echo "Hello, World" > greeting.txt
git add greeting.txt
git commit -m "feat: 인사말 추가"

 

Step 2. 새로운 브랜치를 생성한 다음 실습 파일을 수정한다.

git switch -c feature/greeting
echo "안녕하세요 여러분" > greeting.txt
git commit -am "feat: 인사말 한국어로 변경"

-am 옵션은 커밋 명령어에 -a 옵션을 추가한 것으로 add를 의미하며 add와 commit을 같이 진행한다.

 

Step 3. main 브랜치에서 기존의 실습 파일 내용을 feature/greeting 브랜치에서의 내용과 다르게 수정하기

git switch main
echo "Hello, everyone" > greeting.txt
git commit -am "fix: 인사말 수정"

공통 조상인 커밋으로부터 두 브랜치가 각각 독자적인 커밋을 쌓아나갔기 때문에 Y자형 분기가 일어난 것을 볼 수 있다.

 

Step 4. 병합하여 충돌 발생시키기

git merge feature/greeting

 

병합 과정에서 충돌이 발생한 실습 파일을 확인해 보면

 

<<<<<<< HEAD (Current Change)에 해당하는 부분은
내가 지금 작업 중인 브랜치(main)의 파일 내용이고

>>>>>>> feature/greeting (Incoming Change)에 해당하는 부분은
병합(merge) 대상인 브랜치(feature/greeting)의 파일 내용에 해당한다.

요약하자면 "Current: 나 / Incoming: 상대"를 의미한다.

 

그리고 선택지는 4 가지로

  1. Accept Current Change: 현재 내 브랜치의 파일 내용으로 남긴다.
  2. Accept Incoming Change: 상대 브랜치의 파일 내용으로 남긴다.
  3. Accept Both Changes: 두 브랜치의 변경 사항을 모두 반영하여 남긴다.
  4. Compare Changes: 내 코드와 들어오는 상대방의 코드를 분할 화면으로 띄워 변경된 차이점을 직접 비교한다.

가 있고 

특히, Resolve in Merge Editor를 이용하면 분할 화면을 통해 내 코드와 상대 코드를 실시간으로 비교하며 아예 제3의 내용으로 남길 수도 있다.

 

어떤 선택을 하든 <<<<<<<, =======, >>>>>>> 이 기호 세 줄은 반드시 전부 지워야 한다. VSCode 버튼을 쓰면 자동으로 지워지지만, 손으로 편집했다면 남아 있기 쉽다. 이 기호가 남은 채로 커밋하면 코드가 그대로 망가진 채 저장소에 올라가므로 사고가 발생한다.

 

이제 기호 세 줄을 지우고 최종 편집본을 남겨보자.

Accept Both Changes를 선택한 경우

아직 충돌 마크(!)가 남아 있는 것을 확인할 수 있다.

 

이 상태에서 git status를 확인해 보면

git add 를 통해 충돌 마크가 표시되는 것을 해결할 수 있다는 것을 알 수 있다.

 

그렇다면 git add를 사용하여 아직 충돌상태에 있는 파일을 스테이징 영역에 올려보자.

git add greeting.txt

충돌 마크가 해결된 것을 볼 수 있고

 

git status를 확인해 보면

스테이징 영역에 올라가 커밋 준비 상태가 된 것을 볼 수 있다.

 

이제 커밋하여 병합을 마무리하자.

-m 옵션없이 git commit을 입력하면

git commit

vi 편집기가 열리면서 상단에

가 출력되는 것을 볼 수 있다.

 

이때 이를 변경하지 않고 :wq 로 저장하고 종료하면

브랜치 메시지가 편집에서 출력된 내용대로 저장된 것을 볼 수 있다.

 

이제 마지막으로 Git Graph 확장 프로그램을 확인해 보면

Y자로 갈라졌던 것이 하나로 합쳐진 것을 볼 수 있다.

 

특히 여기서 병합했는데도 feature/greeting 이름표가 옮겨가지 않고 원래 커밋에 그대로 남아 있는 것을 볼 수 있다.

이는 병합(Merge)은 main 브랜치를 움직이는 작업이지 상대 브랜치를 움직이는 작업이 아니기 때문이다.

 

이제 feature/greeting 브랜치의 내용은 main 브랜치에 포함됐으므로 feature/greeting 브랜치를 정리해 보자.

git branch -d feature/greeting

병합됐으므로 브랜치 삭제가 거부되지 않고 정상적으로 이루어지는 것을 볼 수 있고

 

Git Graph에 대해 확인해 보면

Y자 갈래는 그대로 남은 상태로 feature/greeting 이름표가 떼어진 것을 볼 수 있다.

'개발 > Git' 카테고리의 다른 글

[Git] GitHub 협업 실습 [Pull Request]  (0) 2026.08.23
[Git] GitHub(원격 저장소) 연결하기  (0) 2026.08.19
[Git] Branch  (0) 2026.08.17
[Git] Git 기본 사이클 돌려보기  (0) 2026.08.13
[Git] MacOS 환경에서 Git 입문하기  (0) 2026.08.13