완전한 대세 Git을 통해 버전관리를 해보자

혼자 개발하는 프로젝트가 아닌이상, 소스코드의 적절한 관리는 정말 중요합니다.


혼자서 개발하면, 다른 사람이 내 코드를 지울일도 없고, 다른 파일로 덮어쓸 일도 없고,


내가 모든 소스코드의 변경 히스토리를 알겠지만,


개발자가 두명만 넘어가도, 소스코드 관리의 문제가 생깁니다.




그만큼 버전관리도구는 팀프로젝트에 있어서 꼭 필요한 존재입니다.


CVS나 SVN과 같은 버전관리도구도 있지만, 요즘엔 Git이 대세이지요.


Github의 등장으로 기하급수적으로 git을 이용하는 사람들이 늘고 있습니다.



Git은 오픈소스의 코드관리도구입니다.


리눅스의 아버지로도 유명한 리누스 토발즈가 만들었죠.



굳이 이 포스팅에서 SVN과 Git의 차이점을 열거하면서 비교하지는 않겠습니다.


다만 Git을 처음 만나는 분들에게 자그마한 시작 튜토리얼이 되었으면 합니다.




윈도우용 Git 다운받기

맥용 Git 다운받기



위의 링크에서 자신의 플랫폼에 맞는 Git을 다운받아 설치하세요.


혹시 Cygwin을 설치했었다면, 이미 git이 포함되어 있으니 별도로 설치하실 필요가 없습니다.



저는 윈도우에 설치해보겠습니다.





설치를 완료했다면


여러분들은 어느 폴더에서나 마우스우측버튼을 클릭하여 Git의 메뉴를 볼 수 있습니다.



다른 메뉴는 일단 차차 설명하기로 하고 일단 Git Bash를 클릭해봅니다.





아 검은색 창이 나타났네요.


윈도우용 Git을 이용하면 GUI를 통해서 대부분의 Git 명령어를 이용할 수 있지만


일단 이 터미널을 이용해서 사용하는 방법을 익혀보겠습니다.


이후의 명령어는 OS에 상관없이 동일합니다.




git config


내가 누구인지 정보를 입력하겠습니다.


git config --global user.name "이름" 
git config --global user.email "이메일주소"



이제 소스코드를 commit 할때 이 때 입력한 정보가 함께 기록됩니다.


사용자 정보를 통해서 여러분들은 팀프로젝트를 할때,


이 소스코드는 누가 수정한 것이구나 라는 것을 알 수 있습니다.





git init




이제 본격적으로 git을 시작해보죠.


 cd 명령어를 통해 원하는 경로로 이동합니다.


그리고 폴더를 생성합니다. 윈도우 탐색기로 새폴더를 만드셔도 됩니다.


미리 생성되어 있는 폴더로 이동해도 좋습니다.



저는 d드라이브에 gittest라는 폴더를 만들어 이 폴더를 git 저장소로 사용하려고 합니다.



git init


새로운 git 저장소가 만들어집니다.


해당 폴더에 .git 라는 숨겨진 디렉토리를 만들게 됩니다.


git저장소를 더이상 사용하지 않으려면


rm -rf .git


이렇게 폴더를 지우면 됩니다.


물론 윈도우 탐색기에서 삭제해도 됩니다.





git status



현재 저장소에 대한 정보를 볼 수 있습니다.







git clone


이렇게 새로운 폴더를 init하여 저장소로 사용할수도 있고,


이미 존재하는 원격에 있는 저장소를 복사하여 가져와 만들수도 있습니다.


그럼 원격에 있는 저장소를 가져와 볼까요.



git clone git://github.com/jquery/jquery.git

또는


git clone 사용자명@호스트:/원격/저장소/경로



위의 원격지 주소는 jquery의 github 저장소 주소 입니다.


널리 알려진 자바스크립트프레임워크인 jquery를 복사해왔습니다.


디렉토리에 파일들이 잘 도착했네요.





git clone 메뉴를 이용하여 원격지의 레포지토리를 가져오게 되면


프로젝트 폴더안에 내용이 담기게 되는데요.


혹시 이걸 원치 않고 내가 지정한 폴더에 내용물 파일들만 받고자 하는경우에는



git clone 사용자명@호스트:/원격/저장소/경로 저장될경로


이런형태로 입력하시면 됩니다.


git clone 사용자명@호스트:/원격/저장소/경로 /home/user/


이렇게 말이죠.





git log


그럼 이 프로젝트에서 진행된 작업 내용을 한번 볼까요.





git log


커밋로그를 볼 수 있습니다. 엄청 많군요.


커밋한 사용자가 누군지 그리고 언제 커밋을 하였는지, 무슨 메시지를 적어두었는지 확인이 가능합니다.


q를 눌러 빠져나올 수 있습니다.


commit 글자 옆에 있는 랜덤한 문자열은 해당 커밋의 해시(hash) 입니다.





git diff



이전버전과 현재 버전의 파일에서 어떠한 부분이 변경되었는지 확인해보고 싶다면


git diff 해시코드


명령어를 통해 변경된 곳을 비교해서 볼 수 있습니다.





해당 커밋의 해시코드를 넣어 명령어를 입력하면


변경 내역이 나타납니다.


어떠한 파일이 변경되었는지도 나타나고


파일의 어떤 내용이 변경되었는지도 표시됩니다.


열의 맨 앞에 - 라고 되어 있는 것은 지워진 줄이고

+ 로 되어있는 것은 추가되었음을 의미합니다.







(자 이제 저는 테스트가 끝났으니 jquery 파일을 통째로 지워 버리겠습니다.)




git add


git에만 있는 독특한 특징이 있는데


다른 버전관리도구들은 파일의 변경이 있은 뒤 commit만 하면 해당 파일이 반영되는 것과 달리


git은 add명령어를 통해 스테이지(stage)에 등록하는 과정이 필요합니다.


add를 통해 파일의 변경을 등록하고 commit하면 해당 파일이 저장소에 반영이 됩니다.


gittest 폴더에 index.html 파일을 생성하였습니다.



git status 명령어를 쳐보면





추가 되지 않은 파일이 있다는 것을 알려주네요.




git add .


명령어를 통해 새로 추가된 파일을 스테이지에 등록합니다. 물론 변경된 파일도 마찬가지 입니다.


.은 현재 git이 찾을 수 있는 모든 파일을 추가한다는 의미입니다.


특정 파일만 스테이지에 등록하려는 경우는 . 대신에 해당 파일명을 입력하면 됩니다.


git add index.html

git add *.js



파일을 삭제한 경우에는 파일이 삭제되었다는것을 git이 알도록 해주어야 합니다.


git rm index.html


이렇게 특정파일이 삭제되었음을 스테이지에 등록해주거나


git add -A


명령어를 통해서 삭제한 파일들이 모두 스테이지에 등록되도록 할 수 있습니다.




git commit



git add 명령어로 파일의 변경을 스테이지에 등록했다면


이제 commit 명령어로 저장소에 반영하면 됩니다.





git commit -m "커밋에 대한 설명"


m 옵션을 추가하여 커밋메시지를 포함시켜 커밋이 가능합니다.




git add 과정없이 commit을 시도하는 경우 스테이지에 반영되지 않은 파일이 있다는 경고가 나타납니다.


commit시에 git add 과정을 포함할 수 있습니다.


commit명령어의 a 옵션을 통해서 이 과정을 통합할 수 있습니다.



git commit -am "커밋에 대한 설명"






자 이제 git init, git status, git log, git add, git commit, git clone의 명령어를 경험해보았는데


이것만으로 git에 대한 대부분의 기능을 마쳤습니다.


이정도만 알아도 git을 사용하는데는 큰 지장이 없습니다.



이제 남은 명령어는 branch와 merge정도?




branch에 대해 공부하기 앞서 이런 시나리오를 가정해보죠.


운영중인 웹서비스에 굉장한 아이디어가 떠올랐습니다.


하지만 이 실험적인 아이디어를 서비스에 적용하기 위해서는 현재 운영중인 소스코드에 굉장히 많은 파일들이 바뀌어야 합니다.


이 경우 현재의 운영중인 서비스의 소스코드 상태는 그대로 보관한채 새로운 기능을 적용해보고자 할때


branch 기능을 이용해볼 수 있습니다.





우리가 지금까지 별생각 없이 작업했던 곳은 master라는 브랜치입니다.


경로명 옆에 <master>가 보이시나요? 바로 이것이 현재 내가 작업하고 있는 브랜치를 나타냅니다.


보통 master라는 것은 가장 주요한(main), 안정적인 버전을 의미합니다.


대부분 master 브랜치에서 프로젝트가 관리되고 있지요.






git branch




git branch


위의 명령어를 통해 모든 브랜치를 볼 수 있습니다.



master 라는 이름의 브랜치가 보이는군요.


그럼 새로운 새로운 브랜치를 만들어보죠.







git branch newidea


newidea 라는 브랜치가 만들어졌습니다.


git branch 명령어로 확인해보면 새로운 브랜치가 만들어진 것을 확인할 수 있습니다.


하지만 브랜치가 만들어졌을뿐 이 브랜치로 자동적으로 연결된 것은아닙니다.


콘솔창에는 master라고 계속 남아있습니다.



git checkout


checkout을 통해 브랜치를 이동해봅시다.



git checkout newidea



이제 newidea의 브랜치로 이동을 하였습니다.





master에서 newidea로 바뀐것이 보이나요?



newidea 브랜치에서는 여러분들이 무엇을 삭제하고, 무엇을 추가하고, 무엇을 변경하던간에


master의 소스코드에는 전혀 영향을 끼치지 않습니다.



어디한번 newidea 브랜치에서 몇가지 작업을 하고 add한뒤 commit을 해보겠습니다.





test1.html, test2.html 파일을 추가하고 add한뒤 commit 하였습니다.



그다음에 다시 master 브랜치로 돌아오겠습니다.






git checkout master 명령어를 입력하니 브랜치가 master로 변경됨과 동시에


해당 폴더의 파일도 master의 브랜치로 돌아왔네요.


이렇게 브랜치는 서로간의 브랜치에 영향을 주지 않고 소스코드를 수정할 수 있습니다.


브랜치를 생성하면서 곧바로 checkout까지 한다면


git checkout -b 브랜치명


이렇게 명령어를 입력하면 됩니다.




checkout 명령어는 다른 유용한 일도 가능합니다.


git checkout 파일명


명령어를 입력하면 해당 파일의 가장 마지막 커밋버전을 가져옵니다.


뭔가 파일을 잘못수정했을때 다시 이렇게 checkout을 하면 저장소의 가장 마지막 커밋버전으로 되돌리기 때문에


잘만 사용하면 유용하게 사용할 수 있습니다.


하지만 실수로 잘못 checkout을 할 경우 여러분이 수정한 파일이 모두 되돌려질수도 있으니 조심하세요.




git merge



newidea의 브랜치를 master에 병합할때는 merge 명령어를 사용합니다.


master 브랜치 상태에서



git merge newidea


명령어를 입력하면 newidea와 master가 병합이 됩니다.






이제 해당 브랜치가 필요가 없겠죠?


지워보겠습니다.


git branch -d newidea


브랜치가 지워졌습니다.







git의 세계로 온 여러분을 환영합니다.


다음에는 github의 세계로 빠져볼까요?






참고링크

http://tranbot.net/ALA/get-started-with-git/

http://net.tutsplus.com/tutorials/other/easy-version-control-with-git/

http://rogerdudler.github.com/git-guide/index.ko.html



Comment List

| 1 | ··· | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | ··· | 244 |