GIT Sourcetree 사용 중 충돌 해결법
git을 사용하다 보면 pull을 받다가 아래와 같은 메시지를 뜨는 것을 본적이 있을 것이다.
내가 수정한 소스와 상대방이 push하여 원격 저장소에 올라간 소스와 충돌 났기 때문이다.
git의 정석적으로는 본인이 개발하는 기능이나 수정 작업 중일 때는 branch를 따서 작업하는 것이 좋다. 그렇다면 충돌을 최소화 할 수 있기 때문이다. 또한 작업 단위를 짧게 가져가고, push&pull을 자주 하는 것도 충돌 최소화에 도움이 된다.
이 경우에는 어떻게 진행을 해야할까.
일단 먼저 branch를 mergeTest 이름으로 생성한다. 생성한 해당branch(mergeTest)로 체크아웃 받고, mergeTest branch에 현재 충돌 나는 소스를 commit&push를 한다.
develop branch를 체크아웃하여 보았을때 그래프 상태이다.
현재 커밋하지 않은 변경사항이라 써있는 로컬 develop branch와 충돌 소스를 커밋한 mergeTest branch, 그리고 현재 원격 저장소에 올라가 있는 최종 소스(origin/develop)을 볼 수 있다.
다시 mergeTest branch를 체크아웃 받아 돌아오고, develop branch 소스와 mergeTest branch를 병합한다.
위와 같이 현재 브랜치에 병합 할 커밋을 선택하여 병합한다.
그러면 아래와 같이 충돌 병합 Alert 창이 뜰 것이다.
그래프를 보면, 아래와 같은 상태로 병합이 된 것을 확인할 수 있다.
하지만 파일 상태를 보면,
이와 같이 병합한 소스 중 충돌 난 소스를 확인할 수 있다.
내가 수정한 소스는 <<<HEAD ~ ====
원격 저장소에 올라가있는 소스는 ==== ~ >>>>>> orgin/develop 으로 나눠진다.
저 소스를 동기화하고 온전한 상태의 소스로 가지려면, <<<HEAD >>>origin/develop 으로 나눠진 소스를 수정하여 가져야한다.
하지만 Sourcetree에서는 이러한 행동을 편한 기능으로 제공한다.
액션 > 충돌 해결을 클릭해보면 ‘내것’을 이용해 해결, ‘저장소’ 것을 사용하여 해결이 있다.
즉, <<<HEAD ~=== 까지의 소스는 ‘내것’을 이용해 해결====~>>>origin/develop 까지의 소스는 ‘저장소’ 것을 사용하여 해결을
클릭하면 쉽게 소스를 동기화 시킬 수 있다.
본인은 ‘저장소’ 것을 사용하여 해결하여 해당 소스를 동기화 하였다.
해당 소스를 동기화 하였으니 충돌 부분을 수정했다는 것을 알리기 위해, 원격 저장소에 commit&push를 한다.
이제 다시 develop branch를 체크아웃 받아 그래프를 보면 원격 origin/develop branch를 mergeTest 에 병합한 것을 볼 수 있다.
이제 mergeTest branch를 내 develop local branch에 병합한다.
그럼 아래와 같이 그래프가 바뀌는 것을 확인할 수 있다.
마지막으로 내가 충돌 난 부분을 수정하고, 내 소스를 원격 develop branch에 push하면 충돌 해결 및 소스 동기화가 된다.
mergeTest branch는 충돌 해결을 위한 branch이므로 원격 저장소에 저장할 필요는 없지만, 추후 해당 branch를 지우기 위해서는 원격 저장소에 저장 후 삭제해야 오류가 나지 않는다. 이 작업을 하지 않더라도 git -D 명령어로 강제 삭제도 가능하다.
본인은 develop branch와 mergeTest branch에 둘 다 push를 해줄 것이다.
그 후 그래프를 보면 develop branch와 origin/mergetTest branch 가 같은 단계에 머물러 있는 것을 확인 할 수 있다.
local branch와 원격 저장소 mergeTest branch는 마우스 오른쪽 클릭으로 쉽게 삭제가 가능하다.
git은 사용자마다 사용하는 방법이 다양하고, 다를 수 있다. 위와 같은 일련의 작업들을 원격 저장소 소스를 먼저 받고, 그 위에 내 소스를 추가하여 commit&push 하는 방법도 있다.
또한 위와 같이 mergeTest branch를 새로 따고 push 한 뒤, 원격 저장소 develop 내용을 local develop branch에 바로 pull 받고, local develop branch와 mergeTest branch를 바로 병합한 후 소스 충돌을 해결하여 commit&push 방법도 있다.
꼭 Sourcetree를 사용하지 않아도, tortoiseGit을 사용해도 좋고, eclipse git 등 여러 형상관리 툴을 사용해도 된다. 또는 이런 일련의 작업들을 git 터미널에서 git 명령어를 직접 사용하여 관리하여도 되지만, 툴을 사용하는 것이 그래프나 파일 상태에 대해서 알기 쉽게 되어있기 때문에 사용하는 것을 추천한다.
git으로 형상관리 하는 방법은 많지만, 팀원과 작업자들끼리 소스 동기화만 잘하여 관리한다면 충돌을 최소화하여 소스를 관리 할 수 있을 것이다.