1. 도구개요 2. 기능요약 3. 도구실행환경 4. 도구설치방법 6. 도구활용예제 7. FAQ 8. 도구평가 9. 용어집
1. 도구개요 소개 소프트웨어개발을위한크로스 - 플랫폼분산버전관리도구. 대부분은파이썬을사용하여개발되었고, diff 부분은 C 를사용하여개발. 기본적으로명령줄인터페이스프로그램 주요기능 버전관리기능 카테고리 세부카테고리버전관리 커버리지 도구난이도중 라이선스형태 / 비용 Generic Public License v2 / 무료사전설치도구 - 운영체제 Windows, Linux, Mac OS, UNIX 최신버전 2.8.1 (2013. 12) 특징 크로스플랫폼, 서버가불필요, 분산버전관리시스템 원격저장소와작업디렉토리의구분이없음 적용회사 / 프로젝트 - 관련도구 제작사 공식홈페이지 Subversion, CVS, Git selenic http://mercurial.selenic.com 2
2. 기능요약 소프트웨어개발을위한크로스 - 플랫폼분산버전관리도구 주요기능 분산저장소관리 지원여부 지원 폴더및저장소관리지원 ( 폴더관리와동일 ) 저장소이력공유 기존저장소복사본만들기 충돌하는저장소병합 지원 지원 지원 3
3. 도구실행환경 JDK(Java development kit) 상에서설치및구현이가능 다양한 OS 를지원 Windows : Windows XP / Windows 7 (32, 64-bit 모두지원 ) Linux : 32, 64-bit 지원 Mac OS X : 32, 64-bit 지원 UNIX : 32, 64-bit 지원 Command Line 에서동작 저장소관리프로그램 : 저장소설치불필요 Windows / Linux / Mac OS / UNIX 4
4. 도구설치방법 세부목차 4.1 다운받기 4.2 설치하기 4.3 설치확인하기 5
4. 도구설치방법 4.1 다운받기 (1/2) 홈페이지에서 Download 메뉴클릭 http://mercurial.selenic.com/ 본매뉴얼에서는 Windows 용 2.8.1 버전설치 6
4. 도구설치방법 4.1 다운받기 (2/2) 설치파일선택 본매뉴얼에서는 Windows 용 64bit Inno Setup Installer 다운로드 7
4. 도구설치방법 4.2 설치하기 (1/2) 설치파일실행 8
4. 도구설치방법 4.2 설치하기 (2/2) 설치파일실행 9
4. 도구설치방법 4.2 설치확인 설치확인 Command 창에서 hg 실행하여정상실행확인 10
세부목차 5.1 의주요기능 5.2 예제소개 5.3 기존저장소의복사본만들기 5.4 저장소의이력알아보기 5.5 저장소의변경 5.6 저장소의변경공유 5.7 다른사람과의변경공유 5.8 변경을병합하기 5.9 충돌하는변경병합하기 5.10 주요추가기능 (2.8.1) 11
5.1 의주요기능 의주요기능 기존저장소의복사본만들기 저장소변경하기 저장소공유및복사본만들기 12
5.2 예제소개 의기능을소개하기위해홈페이지에있는한글입문서를예제로사용 본예제에서는기존저장소의복사본을만들고저장소를변경하고, 공유하며병합하는방법을다루도록함. 13
5.3 기존저장소의복사본만들기 (1/3) 저장소의복사본을위치시킬폴더 ( 디렉토리 ) 를생성하고복사본을만듦. 본예제에서는 C:\testwork 에저장소의복사본을만들도록함. selenic.com 에올려져있는 hello, world 저장소를복제하도록함. 커맨드라인에 hg clone http://www.selenic.com/repo/hello my-hello 를입력. 14
5.3 기존저장소의복사본만들기 (2/3) 성공적으로저장소가복제되었다면아래와같은메시지를출력. 폴더 ( 디렉토리 ) 의목록을보면 my-hello 라는폴더 ( 디렉토리 ) 가생성되었음을확인가능. 15
5.3 기존저장소의복사본만들기 (3/3) 폴더 ( 디렉토리 ) 에들어가서내용을확인. my-hello 안에들어있는파일들은저장소에있는파일들과동일한것으로확인가능. 16
5.4 저장소의이력알아보기 (1/8) 저장소의이력을보기위해 log 명령을사용 Log 명령은저장소에일어난모든작업들을요약하여, 최근의일부터시간의역순으로표시 17
5.4 저장소의이력알아보기 (2/8) 각단락은하나의변경집합을나타냄. 변경집합은 1 개이상의파일변경을, 1 개의논리적인단위로모아놓은것. 앞의예제에서는저장소의이력이 2 개의변경집합으로드러남. Changeset 은그변경집합의고유 ID. 콜론앞의최초숫자는수정번호. 수정번호는변경집합을가리키기위한단순한방법. 수정번호는저장소안에서만유효한로컬한개념. 콜론뒤의긴 16 진수문자열은 ChangeSetID. 이것은변경집합을가리키며, 변경집합을포함한모든저장소안에서같은값. 만약다른누군가와어떤변경집합에대해의논하려한다면, 수정번호가아닌 ChangeSetID 를사용. tag 는어떤변경집합의임의의이름인꼬리표를나타냄. 어떤변경집합에도 1 개이상의꼬리표를붙이는것이가능. 실제로는변경집합이붙이는일이거의없어서, tag 줄은거의나오지않음. tip 이라는이름이붙은특별한꼬리표는보통 Tip 을가리킴. 이것은저장소안에있는가장새로운변경집합. 다른변경집합을작성하면, 그것이 Tip 이됨. user 는변경집합을작성한사람으로, 자유로운형식의문자열. 보통이메일주소를사용하는데사람의이름이포함되는경우도존재. date 은언제변경집합이작성되었는가를가리킴. 일시정보는변경집합의작성자의지역의시간대로표시. summary 는변경집합의설명의맨처음줄을표시. 이것은변경집합의목적을자신과다른사람들이이해할수있게돕기위해, 변경집합의작성자가작성시입력하는것. 18
5.4 저장소의이력알아보기 (3/8) Log 명령의 v 설정옵션을사용하면더욱자세한이력정보를나타냄. 19
5.4 저장소의이력알아보기 (4/8) --debug 옵션을쓰면모든것이출력 20
5.4 저장소의이력알아보기 (5/8) 상세한출력은기본출력보다더많은필드의정보를포함. changeset 은생략되지않은 ChangeSetID 를표시. Files 는변경집합으로변경된파일들을나열. description 은변경집합의설명을한줄이아닌여러줄로전부나타냄. --debug 출력은상세한출력에더해다음의필드를표시. file+ 는변경집합에서추가된파일을나열. file-는변경집합에서삭제된파일을나열. manifest는변경집합의매니페스트id를표시. 2개의 parent 필드는변경집합의두부모의변경집합ID를표시. 1:0000000000000000000000000000000000000000는무효인부모를참조. 21
5.4 저장소의이력알아보기 (6/8) -r 설정을쓴 log 명령은특정변경집합을표시 첫번째변경집합을보기위해서는 r1 을입력 22
5.4 저장소의이력알아보기 (7/8) -p 설정을쓴 log 명령은, 변경집합에관련된패치를표시 23
5.4 저장소의이력알아보기 (8/8) 최신변경집합의정보를표시하는데 tip 명령을사용할수있음. tip 명령은 log r tip 에의단축이라고생각하면됨. 24
5.5 저장소의변경 (1/10) 여기서의간단한목표는, hello, world 프로그램의출력에한줄더추가하는것. 가장먼저, 이간단한목표를이루기위한프로젝트용으로 my-hello 를복제한 my-hello-newoutput 라고불리는새로운저장소를생성. 25
5.5 저장소의변경 (2/10) 새로운저장소에변경을함. 작업디렉토리에들어가, 메모장같은텍스트에디터를이용하여소스코드를변경. 26
5.5 저장소의변경 (3/10) hello.c 의원래내용 /* * hello.c * * Placed in the public domain by Bryan O'Sullivan * * This program is not covered by patents in the United States or other * countries. */ #include <stdio.h> int main(int argc, char **argv) { printf("hello, world!\n"); return 0; } 27
5.5 저장소의변경 (4/10) main 을편집하여출력하는내용을 1 줄에서 2 줄로변경. ( ) int main(int argc, char **argv) { printf("hello, world!\n"); printf( sure am glad I m using!\n ); return 0; } 위의내용을모두수행하였을경우, 에디터를종료. 이편집으로, 변경집합을만들준비가완료. 28
5.5 저장소의변경 (5/10) 만약작업을중단하여, 어떤변경이변경집합에포함되는지를잊어버렸다면 status 명령을사용. 접두사인 M 이, hello.c 가변경 (modified) 되어다음에변경집합에포함된다는것을표시. 29
5.5 저장소의변경 (6/10) 변경을파기하여원래상태로돌려놓고싶은경우는, revert 명령을써서파일을변경하지않은상태로돌려놓는것이가능. 30
5.5 저장소의변경 (7/10) 변경집합을작성하는행위를반영한다고부름. commit 명령을써서반영을실행. 이것은에디터를열어, 암호와같은줄을몇개표시. 31
5.5 저장소의변경 (8/10) 변경집합을반영하는데에는, 이유를써넣지않으면안됨. 이것은통상변경집합코멘트라고부름. 다음과같이입력. 저장한다음에디터를종료. commit 명령은종료하여아무것도표시되지않음. 만약텍스트를저장하지않고에디터를종료하면, commit 명령은조작을중단하여반영하기전에취소할수있음. 32
5.5 저장소의변경 (9/10) 이상태에서 status 명령을실행. 아무것도없음. 방금가한변경은변경집합에반영되어있으므로, 반영이필요한변경된파일이존재하지않음. 33
5.5 저장소의변경 (10/10) 다음작업을위해, 갱신이력을조사하는것이가능. 반영한변경집합이보임. 새로운변경집합은이저장소에만존재. 34
5.6 저장소의변경공유 (1/5) 원저장소를복제. 35
5.6 저장소의변경공유 (2/5) 각저장소에는 Tip 이무엇인가를아는데에 tip 명령을사용. (Tip 은가장새로운변경집합 ) 이 Tip 의완전한설명을출력하지않게하기위해, -q( 조용하게 ) 옵션을사용 Tip 은다르다는것을알수있음. 36
5.6 저장소의변경공유 (3/5) my-hello-share 로돌아와새로운변경집합을그곳까지넓혀봄. 그러기위해, pull 명령을사용. 이것은다른저장소에있는, 이저장소에는없는변경집합을전부이저장소에끌어오기를위한명령어. 37
5.6 저장소의변경공유 (4/5) 앞에서출력의마지막줄은중요. 은 Pull 을수행한다음작업디렉토리를갱신하지않음. 이것은예를들어저장소가새로운변경집합을포함하고있다고해도, 작업디렉토리의 hello.c 파일은아직이전의 Pull 의내용이라는뜻. 의조언에따라, 이파일 ( 과 Pull 의사이에변경된다른파일 ) 을변경하는것이가능. 38
5.6 저장소의변경공유 (5/5) 업데이트완료 39
5.7 다른사람과의변경공유 (1/3) 저장소간이나사람들사이에변경을공유하는데에는여러가지방법이존재. 그중가장흔한방법으로이메일사용. 변경을반영한다음, 그것을파일로내보내기해서, 그것을첨부파일로서누군가에게이메일로전송가능. 변경을내보내기에는, export 명령사용. 에어떤것을내보내기할까를가리키기위해, 꼬리표나수정번호, 또는 ChangeSetID 를지정. 40
5.7 다른사람과의변경공유 (2/3) 기본적으로, Export 는단순히패치를표시하는것이어서, 보통은출력을파일로리다이렉트함. 이파일은 UnifiedDiff 형식의패치파일로서, 에그것을 import 하는방법을알려주기위한특별한정보를포함. 41
5.7 다른사람과의변경공유 (3/3) 앞에서와같이실행한결과인 patch.diff 파일을주고받으면됨. 메일을받는사람은첨부된파일을저장하고저장소에그변경집합을가져오기위해 import 명령을사용. 42
5.8 변경을병합하기 (1/5) 병합할것을작성. my-hello 저장소를한번더복제. 43
5.8 변경을병합하기 (2/5) my-hello-desc 디렉토리안에있는 hello.c 파일을수정 두번째줄에있는주석 * hello.c 를 * hello.c hello, world 로수정 저장한다음편집기를종료하여변경을반영 44
5.8 변경을병합하기 (3/5) commit 명령에 m 옵션을사용해서편집기를띄우지않게하여시간을절약 45
5.8 변경을병합하기 (4/5) my-hello-new-output 저장소의 hello.c 에변경이한건, my-hello-desc 저장의 hello.c 에다른변경이한건존재. 46
5.8 변경을병합하기 (5/5) update 로병합. 47
5.9 충돌하는변경병합하기 (1/6) 은더욱복잡한병합도가능. 인위적으로충돌하는상황을연출. my-hello 를복제하는일부터시작. 48
5.9 충돌하는변경병합하기 (2/6) my-hello-not-cvs 디렉토리안의 hello.c 파일을오픈. main을아래와같이변경 int main(int argc, char **argv) { printf( hello, world\n ); printf( sure am glad I m not using CVS!\n ); return 0; } 이시점에서, my-hello-new-output 저장소의 hello.c 에변경이한건있고, my-hellodesc 저장소의 hello.c 에다른변경이한건존재. 49
5.9 충돌하는변경병합하기 (3/6) my-hello-desc 디렉토리내에서 my-hello-new-output 로부터변경을 import 해도문제없음. 50
5.9 충돌하는변경병합하기 (4/6) Update. hg merge 를실행할필요없음. 그러나, 각변경집합에따라같은소스파일의같은줄이다른식으로변경되어있기에 은자동적으로병합하는것이가능하지않음. 51
5.9 충돌하는변경병합하기 (5/6) hg merge 명령어를실행. 52
5.9 충돌하는변경병합하기 (6/6) 은파일당 3-way 병합을사용. 이것은병합처리에 3 개의입력파일이있는것을의미. 로컬파일 ( 현재의저장소에서옴 ) 다른파일 ( 병합될저장소에서옴 ) 기본파일 ( 가지가갈라지기전의최신파일 ) 만일병합프로그램을설치하지않고있다면, 텍스트에디터가떠서, 병합할필요가있는파일을오픈. 이것을손수편집하는것은잘못할가능성이높음. 편집기를종료한다음 hg rollback 명령을써서 Pull 의결과를취소한다음, 병합프로그램을설치하여, 한번더시도해보는것이가장좋음. 주의 : 은어떤프로그램을실행할필요가있는지를알아보기위해 HGMERGE 환경변수와설정파일을조사. 만약아무것도설정되어있지않다면, hgmerge 스크립트를실행. 53
5.10 주요추가기능 (2.8.1) 은기본적으로 command line 방식의버전관리도구로 UI 상에서의큰변화는없으며, command line 명령어의기능수정또는성능개선이업데이트내용의대부분을차지 기존의 2.4.1 이후의 2.5, 2.6, 2.7, 2.8 에서의주요명령어에대한변경내용은다음과같으며자세한내용은 http://mercurial.selenic.com/wiki/whatsnew 참조 commit: show active bookmark in commit editor helper text commit: enable --secret option export: export working directory parent by default export: show 'Date' header in a format that also is readable for humans log: add a log style that is default+phase log: show style list when unknown style specified log: make file log slow path usable on huge repos merge: apply non-interactive working dir updates in parallel pull: for pull --update with failed update, print hint if any summary: augment output with info from extensions update: add tracking of interrupted updates update: add error message for dirty non-linear update with no rev 54
6. 도구활용예제 세부목차 6.1 예제설명 6.2 프로젝트시작 6.3 프로젝트공유준비 6.4 프로젝트개별작업시작 55
6. 도구활용예제 6.1 예제설명 (1/2) 예제시스템 : 철수와영희의협동프로젝트 예제설명 - 철수와영희는이번팀프로젝트를같이작업하게됨. - 다른업무가잦은영희의사정상만날시간이부족해서각자의집에서프로그램을작성하기로함. - 회의시간이부족한두사람은형상관리도구를사용하기로결정. - 철수는자신이알던형상관리도구인 을사용하기로함. - 철수는자신의컴퓨터에서버를설치하고영희와함께프로젝트를작업하기로결정. 56
6. 도구활용예제 6.2 프로젝트시작 철수와영희는콘솔에 hello, world! 를출력하는기능을구현한뒤, 그기능을확장 철수와영희는다음과같은소스를기반으로작업 selenic.com에올라와있는소스를기반으로작업하기로함. #include <stdio.h> int main(int argc, char **argv) { printf("hello, world!\n"); return 0; } 철수와영희는현재동일한소스를보유 철수와영희는각자따로소스코드를작업하고, 작업한결과물을서로공유하기를원함 57
6. 도구활용예제 6.3 프로젝트공유준비 철수와영희는각각시스템에 을설치. 58
6. 도구활용예제 6.4 프로젝트개별작업시작 (1/2) 철수는 selenic 의프로젝트저장소를자신의프로젝트저장소로복사. 커맨드라인에 hg clone http://www.selenic.com/repo/hello chulsoo-hello 59
6. 도구활용예제 6.4 프로젝트개별작업시작 (2/2) 철수는 hello, world! 출력프로그램을확장. hello, world! & hello younghee. 라고출력하게소스코드를변경. commit 명령을수행해변경집합을작성. 자동실행되는메모장에코멘트를추가. 60
6. 도구활용예제 6.4 프로젝트공유 (1/5) 철수는방금변경한소스를공유하고싶어함. 변경된소스가있는저장소를복제. chulsoo-hello 폴더를 chulsoo-hello-share 로똑같이복제. 61
6. 도구활용예제 6.4 프로젝트공유 (2/5) 변경된소스를공유하기위해철수는 chulsoo-hello-share 를 export 시킴. hg export tip 의실행결과를파일로리다이렉션해서 patch.diff 에저장. 62
6. 도구활용예제 6.4 프로젝트공유 (3/5) 철수는 patch.diff 파일을메신저로영희에게전송. 영희는자신의작업폴더인 younghee-hello 에 patch.diff 파일을복사. 63
6. 도구활용예제 6.4 프로젝트공유 (4/5) 영희는 import 명령을통해 patch.diff 를적용. 64
6. 도구활용예제 6.4 프로젝트공유 (5/5) 영희는 hello.c 파일을열어변경이적용되었는지확인. 철수는소스코드변경이영희에게적용되었음을알수있음. 65
7. FAQ 질문 1) 커맨드라인으로작업하는게너무어렵습니다. 작업을보조해주는툴들은없나요? 답변 1 : 이클립스플러그인으로제공되는툴이있습니다. http://trac-hg.assembla.com/mercurialeclipse 를참조하시기바랍니다. 기본적인사용법은이클립스 cvs 와유사합니다. 질문 2) 머큐리얼에대해서더알아보고싶습니다. 어디를참고해야하나요? 답변 2 : 머큐리얼홈페이지가있습니다. http://www.selenic.com/mercurial/wiki/ 를참조하시기바랍니다. 질문 3) 사용중에 Hg 를사용하는데, Hg 에의미가있나요? 답변 3 : 도구의이름은 입니다. 머큐리얼의명령으로써, 수은의원소기호인 Hg 를사용하여표현합니다. 66
8. 도구평가 활용성 서버필요없이분산된코드의버전관리가가능 윈도우에서사용가능함에도, UI 없이콘솔창진행으로약간의불편함이있음 범용성 사용도구의제약사항이적고저장소변경등여러상황에서사용가능 호환성 각 OS 마다개별파일을제공함으로 OS 제약사항이적음 성능 Text 기반처리로빠른성능을보임 기타 버전관리도구중특이하게도분산버전관리및저장소변경등을지원 도구평가의견 을이용해서분산버전관리가능 은진보된브랜칭 (branching) 과머징 (merging) 기능을가짐 67
9. 용어정리 본매뉴얼에서사용하고있는용어의정리 병합여러다른버전들의소스를충돌없이하나로합치는것. CVS Commit 동시버전관리시스템 (Concurrent Versioning System) 으로도알려져있으 며, 버전관리시스템을구현. 보통소프트웨어프로젝트를진행할때, 파 일로이뤄진모든작업과모든변화를추적하고, 여러개발자 ( 지역적으로 떨어진 ) 가협력하여작업할수있게함 check-out 한 source 를수정, file 추가, 삭제등을한뒤저장소에저장하여 update 하는것. Commit 을하면전체 revision 이 1 증가함 68