svn 능력자를위한 git 개념가이드
svn 을능숙하게다루던능력자들처음 git 을만나면대게이런표정이죠.
하지만곧이렇게됩니다. http://ggamangi.tistory.com 블로그의 < 민찬 > 어린이입니다.
git 은 svn 과비슷해보이지만사실상당히다릅니다. 그래서막상덤벼보면아리송한게한두가지가아닙니다.
주위에서흔히볼수있는 git 가이드들은무척친절합니다. 하지만, svn 숙련자들에게는오히려혼란스럽습니다.
지금부터 svn 을기준으로 git 을살펴보겠습니다.
svn 은보통저장소가서버에있습니다. git 은저장소가내컴퓨터에있습니다. 응? here! 저장소 내컴퓨터 here! 내컴퓨터 저장소
그럼 git 은다른사람들과작업을할수없나요? 원격저장소를만들면됩니다. remote repository
원격저장소 ➁ 다른사람과공유할때원격저장소에푸쉬합니다. push 내컴퓨터 commit 로컬저장소 ➀ 내컴퓨터의저장소에열심히작업내용을커밋하고
svn 작업공간 저장소 git 작업공간 로컬저장소 원격저장소 이렇게저장소가분산되는구조를분산버전관리시스템 (DVCS) 라고합니다.
로컬저장소가따로있으면어떤장점이있을까요?
엄청나게빠릅니다. 인터넷을경유할필요가없기때문에훨씬빠릅니다. Commit git svn 4x Log git svn 325x git 공식홈페이지의벤치마크결과를참고하였습니다.
커밋에부담이없습니다. 내로컬저장소에서마음대로실험하고테스트하세요. 원격저장소 로컬저장소 작업공간
원격저장소와연결이끊겨도계속버전관리가가능합니다 svn 은서버에문제가생기면모든버전관리가중단됩니다. 원격저장소 복구! 로컬저장소 작업공간
원격저장소가폭파되어도로컬저장소로복원이가능합니다. 원격저장소와연결된모든로컬저장소는사본을보유합니다. 원격저장소 로컬저장소 파괴 복구! 저장소복사 작업공간
그런데 git 에는로컬저장소에커밋전, 하나의단계가더있습니다. 바로스테이지영역입니다. 인덱스 (index) 라고도부릅니다. 작업공간 스테이지영역 (Staging Area) 로컬저장소
svn 작업공간 저장소 git 작업공간 스테이지영역 로컬저장소 원격저장소 커밋할파일들을스테이지영역에추가합니다.
스테이지영역이어떤역할을하는지알아볼까요? ➀ 이런빌드목표를가지고작업을하고있습니다. 빌드목표! 로그인기능추가 A 버그수정 B 버그수정
스테이지영역이어떤역할을하는지알아볼까요? ➁ 다음과같이파일들이수정되었습니다. login.php menu.php head.php body.php tail.php style.css script.js 로그인기능추가 A 버그수정 B 버그수정
스테이지영역이어떤역할을하는지알아볼까요? ➂ 그런데로그인기능추가가다음빌드로미루어졌습니다. svn 이라면보통어떻게할까요? login.php menu.php head.php body.php tail.php style.css script.js 로그인기능추가 A 버그수정 B 버그수정 ❶ 수정된 login.php 를어딘가로백업 ❷ svn revert 를이용해원래상태로복원 ❸ 수정내역전체를커밋 ❹ 백업해두었던 login.php 를다시복구 변경된파일들은무조건커밋대상이되기때문에생기는문제입니다.
스테이지영역이어떤역할을하는지알아볼까요? ➃ 그럼 git 은어떻게하나요? login.php menu.php head.php body.php tail.php style.css script.js 로그인기능추가 A 버그수정 B 버그수정 ❶ 커밋할파일들만 staging area 에추가 ❷ 로컬저장소로커밋
귀찮을수있습니다. 특별히파일들을구분할필요가없을때에는 -a 옵션으로스테이치추가와커밋을동시에할수있습니다. git commit -a
커밋을마쳤으면, 이제다른사람들에게작업물을공유합니다. 원격저장소에올리는명령어는 push 입니다. git push
svn 내컴퓨터 svn commit 저장소 git 내컴퓨터 스테이지영역 로컬저장소 원격저장소 git add git commit git push
내작업을올리는데오류가발생했어요. 다른사람들이작업한내용을먼저받아야한대요. 원격저장소로부터내려받기 : fetch 내려받은데이터를병합 : merge 하지만이둘을함께처리하는명령은 pull git pull
svn 내컴퓨터 svn update 저장소 git 내컴퓨터 로컬저장소 git fetch 원격저장소 git merge 내컴퓨터 git pull 원격저장소
지금까지알아본 svn 과의차이점은? ➀ 로컬저장소가존재한다. ➁ 커밋이전에스테이지영역에추가하는과정이있다. ➂ 가장중요한차이점이자 git 만의특징이남았습니다!
스냅샷 snapshot git 은각각의버전을스냅샷으로저장합니다.
svn 은파일의변화 ( 차이점 ) 를저장합니다. 시간의흐름 버전 1 버전 2 버전 3 버전 4 버전 5 A 파일 1 2 B 파일 1 2 C 파일 1 2 3
git 은그순간의스냅샷으로저장합니다. 시간의흐름 버전 1 버전 2 버전 3 버전 4 버전 5 A A1 A1 A2 A2 B B B B1 B2 C C1 C2 C2 C3
svn 에서버전 5 의파일들을가져오겠습니다. 기초가되는파일과함께모든변경내역을서버로부터내려받습니다. 시간의흐름 버전 1 버전 2 버전 3 버전 4 버전 5 A 파일 1 2 B 파일 1 2 C 파일 1 2 3
git 에서버전 5 의파일들을가져오겠습니다. 가장가까운스냅샷들만으로특정버전을빠르게만들어낼수있습니다. 게다가네트워크를거치지않습니다. 시간의흐름 버전 1 버전 2 버전 3 버전 4 버전 5 A A1 A1 A2 A2 B B B B1 B2 C C1 C2 C2 C3
지금까지스냅샷에대해서알아보았습니다. 그런데왜이렇게열심히설명한걸까요? 바로 git 의최대장점인브랜치 branch 를소개하기위해서입니다. 요게바로스냅샷덕분에구현될수있었답니다.
svn 의브랜치 root trunk sources svn 은간단히말해디렉토리구조입니다. bin images 서버는단지변경사항만저장하며최소한의자료구조를유지하지만, 작업자가작업을위해브랜치를내려받으면그변경내역들을순차적용하여실제파일들을만들어냅니다. branch1 branch2 branch3 브랜치를만들면, 전체파일을네트워크를통해통째로내려받기때문에느리고부담스럽습니다.
git 의브랜치 svn 의 trunk 가 git 에서는 master master c0 c1 c2 c4 c3 branch c5 git 은서버에그런논리적디렉토리구조를만들지않습니다. 다만, 연속된스냅샷이순차적으로이어지다가가지를치면서브랜치가만들어집니다.
git 의브랜치 작업자는작업중에 branch 와 master 를자유롭게이동할수있습니다. checkout master c0 c1 c2 c4 c3 c5 checkout branch checkout 이 svn 에서는내려받는명령이지만, git 에서는브랜치를선택하는기능입니다.
svn 과 git 의브랜치가어떻게다른지정리해볼게요. svn git 만들기 즉시생성 즉시생성 내려받기 전체디렉토리구조를내려받음 필요없음 브랜치전환 직접디렉토리를이동 작업파일들이실시간변경됨 병합 위치와리비전을명시, 복잡함 빠르고간편함
git 의병합 merge branch HEAD c0 c1 c2 c4 c6 c3 c5 3-way merge : 각브랜치와공통조상하나를이용하여병합 svn 의 merge 가위치와병합할리비전을확인하여입력하는등의절차가필요했다면, git 의 merge 는브랜치이름만으로모든것들을자동으로해결합니다.
git 은수많은브랜치가동시에돌아가는것을장려합니다. svn 이었다면상상도못할일이었겠죠? ➀ 출시를위한프로덕션용브랜치를만듭니다. ➁ 기능추가혹은버그수정을위해그때그때브랜치를만듭니다. ➂ 아이디어를실험해보기위해브랜치를만듭니다. 여러커밋을거친 branch 를 merge 하는작업을 merge commit 이라고표현하기도합니다.
git 의브랜치관련명령어는다음과같습니다 : 브랜치만들기 git branch <name> git checkout <name> git branch -b <name> 두명령을한꺼번에수행하는명령 브랜치지우기 브랜치병합 git branch -d <name> git checkout master git merge branch 브랜치목록 git branch git branch --no-merged git branch --merged branch 가자주생성, 소멸되므로현재존재하는브랜치중어떤것들이 merge 가되었는지, 안되었는지를구분할수있어야합니다.
merge 중에충돌은언제나일어날수있습니다. trunk login.php menu.php head.php body.php tail.php style.css script.js branch login.php menu.php head.php body.php tail.php style.css script.js
충돌에대한처리는 svn 과동일합니다. <<<<<<< HEAD:login.php <div id='footer'>contact : email.support@github.com</div> ======= <div id='footer'> please contact us at support@github.com </div> >>>>>>> branch:login.php master 의 login.php 영역 branch 의 login.php 영역 ➀ master와 branch 영역중하나를선택 ➁ 혹은양쪽을참고하여새로작성 ➂ <<<, >>>, === 구분자를삭제 ➃ 변경내역을 add 후, commit git mergetool 명령을사용하면충돌을쉽게해결하기위한 merge 도구를사용가능합니다.
리베이스 rebase rebase 는 merge 와동일하게하나의브랜치를다른브랜치로병합하는기능을합니다. 단, 차이점은? 왜쓰는거에요? 두브랜치의결과를병합하는 merge 와달리, rebase 는한브랜치에서이루어진작업히스토리를다른브랜치에차례대로적용시킵니다. 둘의결과물은완전히동일하지만, rebase 는병합히스토리를더욱깔끔하게남겨줍니다. 공동작업에서깔끔한히스토리를계속유지해주고싶다면 rebase 를적극적으로사용하는것이좋습니다.
리베이스rebase merge와 rebase를비교합니다. master b2 master c1 c3 c4 b2 c1 c3 c4 c9 c10 c11 c2 c5 c6 merge c2 c5 c6 b1 c7 c8 b1 c7 c8 b3 rebase b3 b1 b2 b3 master c1 c3 c4 c2 c9 c10 c5 c6 c7 c8
태그 tag branch 처럼 tag 역시자체명령어를지원하고있습니다. 태그만들기 git tag <name> git tag -a <name> -a 를붙이면, 작업자, 설명등을추가로저장합니다. 태그지우기 태그목록 git tag -d <name> git tag
지금까지 git 만의특징들을알아보았습니다. 정리하면, ➀ 로컬저장소와원격저장소의분리분산처리, 안전한데이터, 빠른처리속도 ➁ 스테이지영역의존재커밋대상의분리 ➂ 스냅샷을이용한버전관리빠르고편리한브랜치 & 병합기능 이어서알아두어야할 git 의나머지기능들을살펴보겠습니다...
git 으로처음작업을시작합니다. git init // 내컴퓨터에새로빈로컬저장소를만들고, git remote add <repository> // 이로컬저장소를원격저장소에연결한후, git pull // 원격저장소로부터데이터를내려받습니다. 이방식을이용하면로컬저장소와원격저장소를수동으로연결할수있습니다. 하지만조금번거롭죠?
처음시작하는이런방법도있습니다. 로컬저장소는원격저장소와쌍둥이입니다. git clone <repository> // 한번의명령으로원격저장소로부터데이터를내려받습니다. ex) git clone /local/repository/path ex) git clone user@hostname:/remote/repository/path svn checkout 과비슷하죠?
이번에는실수했을때되돌리는방법입니다. 의외로많이사용하는기능이죠? svn 은절차가간단한반면, git 은더많은단계로인해좀더복잡합니다. git checkout -- git reset HEAD git fetch origin git reset --hard origin/master // 수정했지만아직스테이지에추가하지않은파일을되돌릴때, // 수정했고스테이지에추가한파일을다시스테이지에서제거할때, // 수정했고로컬저장소에 commit 한파일을되돌릴때,
모르면아쉬운 git 의특징들 전해드리는참고사이트에서더욱자세하게살펴보실수있습니다. ➀ 작업중브랜치를변경해야하는데커밋하기애매할때, 간단히저장해둘수있습니다. stashing 이라고해요! ➁ 커밋의순서를변경하거나커밋메시지심지어는커밋한파일도변경할수있습니다. ➂ 로그를자기입맛대로포맷팅해서볼수있습니다. ➃ 이전커밋에추가할수있습니다.
만약이렇다면 git 이필요없어요. ➀ 브랜치나태그기능은사용하지않아요. ➁ 관리하는파일들의규모가작아서오래전버전에접근하는데불편하지않아요. ➂ 지금까지 svn 서버가문제가되어곤란을겪은적이없어요. ➃ svn이느리다는생각은한번도해본적이없어요.
하지만, 조금이라도 svn 이의심된다면, 조금이라도 git 가기대된다면... 여러분의프로젝트에을시도해보시기를권해드립니다.
참조사이트일람 Git git - 간편안내서 Pro Git 서적번역 Git: Rebase 는언제어떻게해야할까?