1. 개요
오늘의 포스팅은 GitHub에서 충돌했을 때 이를 어떻게 해결하는지에 대한 것입니다. 최근 작은 기능들을 만들고 GitHub에 커밋하는 일이 잦아졌고, 이 과정에서 GitHub을 다루는 능력이 중요하다는 것을 다시 한번 느끼게 되었습니다. 앞으로 기능이 커짐에 따라서 커밋하는 일이 더욱 많아질 것이고, 더불어 병합(merge)도 빈번해질 것입니다. 이 과정에서 충돌(conflict) 문제가 자연스럽게 생길 것입니다. 이러한 상황을 대비하여 내용을 정확하게 공부하고, 공유하고 싶어서 포스팅하게 되었습니다.
2. 충돌이 발생하는 이유
충돌이 발생하는 이유는 동일한 파일의 동일한 부분을 수정할 때 발생합니다. 아래의 예시를 통해 구체적으로 알아보겠습니다.
아래 코드가 원본 상태라고 가정해 봅시다.

이제 개발자A와 개발자B가 동시에 이 코드를 수정한다고 가정하겠습니다.
개발자 A, B는 3번째 줄에 있는 변수 c를 '@@@'와 '###'으로 각자 변경하여 커밋(commit) 합니다.

자! 이제 GitHub에서 충돌이 발생했습니다. GitHub 입장에서는 동일한 줄에 두 가지 버전이 존재하기 때문에 어떤 것을 받아들여야 할지 알 수 없어 충돌을 발생시킵니다.
위의 예시 말고도 다음과 같은 상황에서도 충돌이 발생할 수 있습니다.
- 논리적 충돌: 서로 다른 줄을 수정했지만, 해당 내용이 모순되거나 결과에 유의미한 영향일 때 발생
- 브렌치의 병합 진행 시 충돌: 서로 다른 브렌치에서 동일한 파일에 다른 변경 사항들이 감지되었을 때 발생
- 동일한 이름의 파일 추가: 서로 다른 브렌치에서 다른 내용이지만, 동일한 이름을 지닌 파일을 병합하려 할 때 발생
3. 충돌을 해결하는 방법
앞에서 다뤘던 상황과 비슷한 상황을 만들어 충돌을 시켰습니다.
- 충돌 상황
- main에서는 'c = !!!'로 작성
- 개발자A가 브렌치를 만들어, 'c = @@@'로 변경 후 커밋
- 개발자B가 브렌치를 만들어, ' c = ###'로 변경 후 커밋
- 개발자A의 브렌치를 병합할 때에는 정상적으로 진행
- 개발자B의 브렌치를 병합 도중 충돌이 발생하여 아래와 같은 상황이 발생

두 가지 해결 방법을 알려드리겠습니다.
3.1 첫 번째 방법 : web editor
위 이미지에서 'web editor'를 클릭하시면 아래와 같은 화면이 나옵니다.

충돌한 부분에서 원하는 부분만 남기고 전부 삭제하면 우상단에 활성화된 'Mark as resolved'를 클릭하여 충돌을 해결합니다. 이후 GUI를 활용해 커밋하고, 병합을 진행하시면 됩니다.
3.2 두 번째 방법 : 터미널 명령어
우선, 작업 공간으로 이동하여 터미널을 엽니다. main 브렌치로 이동 후 아래 코드를 입력합니다. 현재 GitHub의 최신 내용을 로컬 환경으로 가져와야 하기 때문입니다.
git pull origin main
# main에 통합되는 브렌치 명을 작성해 주시면 됩니다.
최신화를 마쳤다면, 충돌이 발생한 브렌치로 이동합니다.
git checkout developerB
# developerB 부분에 충돌이 발생한 브렌치 명을 입력하시면 됩니다.
이동하였다면, main 브렌치와 developerB 브렌치와 병합 시켜줍니다.
git merge main
main이 아닌 developerB에서 병합을 진행하는 이유는 main은 안전하게 두고, developerB에서 먼저 병합을 진행하여 문제를 해결하기 위함입니다.
병합을 진행하였다면 아래와 같은 화면이 나오게 됩니다.

' <<<<<<< HEAD, =======, >>>>>>>'와 같은 마커를 통해 충돌한 부분을 확인한 후 상단에 있는 '현재 변경 사항 수락, 수신 변경 사항 수락, 두 변경 사항 모두 수락' 가운데 원하는 것을 선택하여 충돌을 해결합니다.
- 현재 변경 사항 : 충돌이 발생해 병합하지 못한 코드로 진행
- 수신 변경 사항 수락 : 정상적으로 병합을 완료한 코드로 진행
- 두 변경 사항 모두 수락 : 두 버전 모두 반영한 코드로 진행
이후 기존에 하던 대로 GitHub에 커밋을 진행하신 후 'Pull requests' 창에 들어가시면 정상적으로 병합을 진행할 수 있습니다.
4. 충돌을 최소화하는 방법
지금까지 충돌을 해결하는 방법에 대하여 알아보았습니다. 하지만 작업의 효율성을 생각한다면, 충돌은 최소화하는 것이 좋습니다. 따라서 충돌을 최소화하는 방법에 대해 알아보겠습니다.

GitHub에 있는 'Issue'를 활용하면 병합 시 충돌을 줄일 수 있습니다. GitHub의 상단 네비게이션 바에 'Issues'가 있습니다. 해당 화면으로 이동하여 'New issue'를 클릭합니다. 'Issue'에는 다음과 같은 내용을 작성하는 것이 좋습니다.
- 작업할 내용 : 어떤 기능을 개발하거나, 버그를 수정할 것인지 적습니다.
- 작업할 파일 : 해당 이슈에서 작업할 파일을 적습니다.
쉽게 생각하면, 파일을 '찜'하는 것으로 보시면 됩니다. 이슈에 위와 같은 내용을 적는다면, 여러 명의 개발자가 동시에 작업하는 경우가 줄어들고, 충돌을 최소화할 수 있을 것으로 생각합니다.
5. 마치며
처음에 충돌이 발생하였을 때는 어쩔 줄 몰라 했던 기억이 있습니다. 당시에는 작업했던 파일을 백업 시켜둔 뒤 최근 커밋으로 파일을 되돌린 후 백업해 두었던 파일에서 복붙하여 해결했었습니다. 이 글을 본 여러분은 저처럼 힘들게 하지 않으시고, 현명하게 충돌을 해결하셨으면 좋겠습니다. 또한, 충돌은 충분히 해결할 수 있으니, 무서워하지 않았으면 좋겠습니다.
'GitHub' 카테고리의 다른 글
[GitHub] 깃모지(Gitmoji)란? - 사용 방법, 이유, 확장팩 (0) | 2024.07.27 |
---|---|
[GitHub] 닉네임, 이메일 확인하는 법 - 사이트와 터미널에서 (0) | 2024.07.10 |