소스 저장소 서비스는 오픈소스프로젝트인 Gitea를 이용해 서비스 됩니다. 분산버전관리 시스템인 Git 저장소 관리 기능과 사용자 관리 등을 제공합니다.
Git 사용법과 gitea 상세 가이드는 각 홈페이지에서 확인하시면 됩니다.
본 가이드에서는 로그인, 그리고 시스템 기본 설정에 대해 설명 합니다. 추가로 Git 사용시 빈번하게 발생하는 오류 처리 방안에 대해 설명 합니다.
서비스를 사용하기 위해서는 ZCP Console 사이드 메뉴에서 DevOps > 소스 저장소 를 클릭 합니다.
계정 생성하기
사용자 계정은 ZCP에 등록되어 있는 사용자 계정과 자동으로 연계 되지 않습니다. 신규 가입의 경우 Gitea에 접속하면 아래와 같은 신규 가입 화면이 나타나고, 필요한 정보를 입력해 신규로 가입합니다.
(반드시 가입하기 하위에 사용자명과 이메일은 변경하지 않고, 비밀번호만 입력해 계정을 생성합니다.)
이후 ZCP Console을 통해서 소스 저장소에 접속하면 자동으로 로그인 됩니다.
Eclipse에서 Git 활용
Eclipse에서는 Git 연결을 위해서 EGit을 사용합니다. 이 가이드는 다음 가이드 문서로 대체 합니다.
Eclipse에서 소스 충돌 해결
SVN 에 익숙한 개발자가 Git 을 처음 접하면 conflict이 발생했을 때 SVN처럼 해결하려다가 소스를 모두 날려버리는 경험이 굉장히 많았을 것입니다.
그럴 때마다 "Git 정말 못 써먹겠네"라고 투덜대면서 후회할 때가 있죠.
그러나 Git 의 개념이나 기능들을 조금만 이해하고 사용하면 오히려 SVN보다 훨씬 강력하게 사용할 수 있으며 코드 협업 시 제대로 활용할 수 있습니다.
여기에는 Eclipse 를 사용하는 개발자가 Git conflict이 발생했을 때 상황에 따라서 해결하는 방법을 안내합니다.
Git에 대한 기본 개념을 이해하고 있다는 가정 하에 설명하며 기본 개념의 이해가 되어 있지 않다면 먼저 기본 개념을 익히시기 바랍니다.
Conflict 발생
일반적으로 주로 Conflict 가 나는 상황은 Git 의 Remote Repository(이하 'Remote') 에 있는 소스를 Local Repository(이하 'Local') 에 반영하지 않은 상태에서 Remote에 반영된 소스와 동일한 소스를 Local에서 수정했을 경우에 발생합니다.
예를 들어 다음과 같은 A.java 라는 파일이 있었는데
public class A { public static void main(String[] args) { } }
Remote 에 다음과 같이 변경되었습니다.
public class A { public static void main(String[] args) { int a = 0; } }
하지만 Local에는 해당 소스를 반영하지 않은 상태이고 동일한 A.java 라는 파일을 다음과 같이 변경했습니다.
public class A { public static void main(String[] args) { int b = 1; } }
이렇게 되면 반드시 Remote에 있는 소스를 Local에 반영하면 Conflict이 발생하게 됩니다.
위와 같은 상황을 가정하고 Remote에 있는 소스를 Local에 반영을 시도하겠습니다.
- Remote에 변경된 소스를 확인하기 위해 Fetch를 합니다. Project Explorer(또는 Package Explorer, 이하 Project Explorer) 를 열고 Project를 우클릭 후 Team > Fetch from Upstream 을 선택합니다.
- 그럼 다음과 같은 메시지가 나타납니다. Remote에 A.java 라는 파일이 변경되어 있네요.
- Remote에 있는 소스를 Local에 반영하기 위하여 Pull을 합니다. 대상 Project를 우클릭 후 Team > Pull 을 선택합니다.
- 그럼 다음과 같이 conflict이 발생합니다. Remote에 A.java 파일을 변경했는데 Local에도 동일한 파일을 변경했으므로 conflict이 나는 건 당연하겠지요.
이제 이를 해결하는 방법에 대해 알아 보겠습니다.
Conflict 해결
위와 같이 conflict이 발생할 경우에는 아래 2가지 방법으로 해결할 수 있습니다.
Local Commit 활용
Local에서 개발이 완료되어 최신의 소스와 merge를 해야 합니다. 이 때는 간단하게 conflict을 해결할 수 있습니다.
- Git Staging View 를 열고 Unstaged Changes 에서 Commit 대상의 파일을 드래그&드롭하여 Staged Changes로 이동시킵니다.
Commit Messages 를 입력하고 Commit 버튼을 클릭합니다. - Pull 을 다시 하기 위하여 대상 Project를 우클릭 후 Team > Pull 을 선택합니다.
다음과 같이 A.java 파일이 변경되고 SVN에서 했던 것과 마찬가지로 수동으로 merge 작업을 합니다.
public class A { public static void main(String[] args) { <<<<<<< HEAD int a = 0; ======= int b = 1; >>>>>>> branch 'master' of $GIT_URL } }
HEAD 와 Local commit 했던 소스를 합칩니다. 이렇게 말이죠.public class A { public static void main(String[] args) { int a = 0; int b = 1; } }
merge한 소스를 다시 commit합니다. commit message 가 자동으로 입력됩니다.
- Project Exporer 에서 대상 프로젝트를 보면 commit count 가 2가 된 것을 확인할 수 있습니다.
- 마지막으로 Local에 있는 소스를 Remote 로 Push를 합니다. Project Exporer 에서 대상 Project를 우클릭 후 Team > Push to Upstream 을 선택합니다.
- 정상적으로 2개의 commit 이 push가 되었네요!
Stash 활용
보통 Local에서 개발이 끝나지 않아 Commit을 하고 싶지 않은데 최신의 소스를 반영해야 될 상황이 있을 수 있습니다.
그런데 최신의 소스와 동일한 소스를 변경하여 conflict이 발생하면 난감해지죠. 이 때 Git의 stash 기능을 활용하여 해결할 수 있습니다.
stash 를 네이버 사전에서는 이렇게 설명하고 있네요.
즉 stash 는 숨겨서 저장하는 임시 저장소와 같은 느낌이라고 보면 됩니다. 이 stash 기능을 활용하여 conflict 를 해결하는 방법에 대해서 알아보겠습니다.
- Project Exporer 에서 대상 Project를 우클릭 후 Team > Stashes > Stash Changes... 을 선택합니다.
- 그러면 stash commit message 를 입력할 수 있는 팝업이 뜨고 여기에 자신이 이해할 수 있는 값으로 입력하고 OK를 클릭합니다. 입력하지 않아도 상관 없습니다.
Git Repositories 를 열면 아래 스크린샷과 같이 Stashed Commits 아래에 방금 commit 한 stash 가 하나 추가된 걸 확인할 수 있습니다.
그러면 A.java 파일은 다음과 같이 원본으로 돌아갑니다.원본 - A.javapublic class A { public static void main(String[] args) { } }
- 이제 다시 Pull 을 합니다. 아래 스크린샷과 같이 conflict 없이 정상적으로 pull 이 되는 걸 확인할 수 있습니다.
- 이제 잠시 넣어뒀던 stash 를 이용하여 merge 를 합니다. Git Repositories 에서 방금 commit했던 stash 에 우클릭하고 Apply Stashed Changes 를 선택합니다.
다음과 같이 A.java 파일이 변경되고 SVN에서 했던 것과 마찬가지로 수동으로 merge 작업을 합니다.
public class A { public static void main(String[] args) { <<<<<<< HEAD int a = 0; ======= int b = 1; >>>>>>> stash } }
HEAD 와 Local 에서 개발해서 stash 로 commit 했던 소스를 합칩니다. 이렇게 말이죠.public class A { public static void main(String[] args) { int a = 0; int b = 1; } }
- 그리고 나서 나머지 개발을 진행하고 개발이 모두 완료하면 commit 을 합니다. Git Staging View 를 열고 Unstaged Changes 에서 Commit 대상의 파일을 드래그&드롭하여 Staged Changes로 이동시킵니다.
Commit Messages 를 입력하고 Commit 버튼을 클릭합니다. - 마지막으로 Local에 있는 소스를 Remote 로 Push를 합니다. Project Exporer 에서 대상 Project를 우클릭 후 Team > Push to Upstream 을 선택합니다.
- 정상적으로 Push가 되었습니다.
요약
한마디로 Git 에서 conflict 이 발생하면 무조건 Local Repository 또는 Stash 로 commit 을 하면 된다는 것 명심하면 됩니다.
그 뒤로는 SVN 과 같이 merge 작업을 하고 Git 에 맞는 절차대로 진행하면 됩니다.