이 문서는 Pull Request를 수행할때 발생하는 Conflict을 Eclipse에서 Pull request merge conflict 해소 방법을 공유한다.
개요
일반적으로 Git 기반을 개발을 수행할 때, 다양한 방식으로 Branch를 생성하는 전략을 구성한다. 이때 각 Branch 간의 Merge를 수행하는데, 종종 충돌이 발생한다. 다음은 이 문서에서 사용하는 용어를 간단하게 정리하였다.
Pull Request (풀 리퀘스트)
- 브랜치간 병합 (merge) 하는 방법 중 하나이다.
- Pull Request (이하 PR) 생성 후 머지하지 전 까지 커밋(푸시) 가능
Merge Conflict (병합 충돌)
- 병합 목적지 브랜치가 소스 브랜치 생성 후 수정되어 자동 병합이 안되는 상태
- 병합 소스와 병합 목적지의 동일한 위치가 변경된 경우
- 수동으로 충돌 해소 필요 → 자동으로 머지됨
병합 충돌 확인
Step 1) Merge Conflict 인지
Bitbucket의 PR 목록에 충돌이 표시되며, PR의 overview 화면에 충돌여부가 표시된다.
PR 목록 화면:
PR overview 화면:
Step 2) 충돌 해소 가이드 확인
Overview > "More Information" 링크를 클릭하여 Bitbucket 에서 제공하는 충돌 해소 가이드를 확인한다.
- 소스 브랜치 체크아웃
- 목적지 브랜치 pull
- 수동으로 머지 해소
- 충돌이 해소된 파일 커밋
- 커밋 내용 push
Eclipse를 이용한 충돌 해소 절차
Step 1) 소스 브랜치 체크아웃
Project 우클릭 > Team > Switch To > 머지 소스 브랜치 선택 (목록에 없다면, Other... 선택 후 Remote Tracking 에서 찾아 선택) > Checkout (처음 checkout 하는 경우 > Check out as New Local Branch)
Step 2) 병합 목적지 내용 가져오기
Project 우클릭 > Team > Pull... 선택 > Reference 입력란에 master 입력
Step 3) 충돌 파일 확인
Step 4) 충돌 해소
충돌이 발생한 파일을 수동으로 병합한다.
바이너리 파일 병합 충돌
바이너리 파일의 경우 에디터로 병합하지 않고, 파일을 덮어쓰기한다.
Git은 컴파일 오류를 유발고 눈에 띄게 할 목적으로 conflict이 발생한 부분을 <<<<<<< ====== >>>>>>> 로 표시한다.
복잡한 conflict이 발생한 경우 Eclipse에서 제공하는 merge 기능이 유용하다.
- Project (또는 conflict이 발생한 파일 선택) >> Team >> Merge Tool
Merge 도구를 통해 수동 merge가 필요한 파일과 위치를 찾을 수 있다.
Merge 도구 메뉴:
아이콘 배치의 순서대로,
- 좌/우 view 치환
- 두 변경의 공통 원본 표시
- Three way compare: 공통 원본과 함께 두 변경 비교
- Conflict가 발생하지 않는 오른 쪽의내용을 모두 왼쪽에 반영
- 왼쪽 변경을 오른 쪽에 반영
- 오른 쪽의 변경을 왼쪽에 반영
- 다음 차이점 위치
- 이전 차이점 위치
- 다음 변경
- 이전 변경
수정을 완료하고 파일을 저장한다.
Step 5) 병합 결과 커밋 & 푸시
Merge 한 파일을 Staged Changes 창으로 이동시키고 "Commit and Push" 또는 Commit 한다.
Step 6) 충돌 해소
PR 머지 확인을 위해 다음으로 이동한다.
- Bitbucket > Pull-request > PR 제목
다음 그림처럼 녹색의 MERGED 표시는 소스 브랜치가 목적지 브랜치에 머지됨을 표시한다.