Conflict 발생 시나리오
몇 가지의 원인으로 conflict이 발생한다. 본 문서는 두 명의 개발자가 같은 버전의 저장소를 수정한 후 push 할 때 발생하는 경우를 고려한다.
수정 전 코드 상태
아래는 수정 작업 전의 코드 상태를 나타낸다.
HelloWorld.java
public void setBoolean(boolean value) { /* * 추후 플래그 변경시 이벤트 발생 기능 추가 필요 */ this.flagValue = value; }
코드 수정
Developer와 Terry Hwang이 유사한 시간대에 코드를 수정한다.
개발자 이름: Alvin
- 개발자 Terry Hwang 보다 먼저 코멘트 를 작성하여 저장소에 push 함
- Code review 를 통과하여 저장소에 merge 됨
public void setBoolean(boolean value) { /* * 플래그 변수값 변경 */ this.flagValue = value; }
개발자 이름: Terry
- Alvin 의 수정 내용을 인지하지 못하고 같은 코드 위치에 코멘트 작성
public void setBoolean(boolean value) { /* * 추후 플래그 변경시 이벤트 발생 기능 추가 필요 */ this.flagValue = value; }
Conflict 발생
Terry는 Eclipse에서 변경사항 push를 시도하면서 code conflict 인지
Conflict 해소 절차
Step 1) 원격 저장소의 변경사항 가져오기
프로젝트 선택하여 마우스 우클릭 >> Team >> Pull 선택
Conflicting이 발생한 commit 목록이 표시된다.
Step 2) Conflict 위치 찾기 및 수정
Eclipse의 Project Explorer에 conflict이 발생한 파일을 확인하다.
Git은 컴파일 오류를 유발고 눈에 띄게 할 목적으로 conflict이 발생한 부분을 <<<<<<< ====== >>>>>>> 로 표시한다.
복잡한 conflict이 발생한 경우 Eclipse에서 제공하는 merge 기능이 유용하다.
Project (또는 conflict이 발생한 파일 선택) >> Team >> Merge Tool
Merge 도구를 통해 수동 merge가 필요한 파일과 위치를 찾을 수 있다.
Merge 도구 메뉴:
아이콘 배치의 순서대로,
- 좌/우 view 치환
- 두 변경의 공통 원본 표시
- Three way compare: 공통 원본과 함께 두 변경 비교
- Conflict가 발생하지 않는 오른 쪽의내용을 모두 왼쪽에 반영
- 왼쪽 변경을 오른 쪽에 반영
- 오른 쪽의 변경을 왼쪽에 반영
- 다음 차이점 위치
- 이전 차이점 위치
- 다음 변경
- 이전 변경
수정을 완료하고 파일을 저장한다.
Step 3) Merge 결과 Commit & Push
Merge 한 파일을 Staged Changes 창으로 이동시키고 "Commit and Push" 또는 Commit 한다.