개발의 세계에 발을 들이게 되면 필연적으로 접하게 되는 사이트가 stack overflow와 github인 것 같다. 그리고 github라는 사이트에는 별점과 잔디 심기라는 노동행위가 존재하는 모양이다. 별점은 이해하겠는데, 잔디는 뭔데? 개발 관련 사이트 아니야?
내가 알고 있던 별점
내가 알고 있던 잔디
부끄럽게도 솔루션 엔지니어의 탈을 쓴 SE 업무를 1년 가량 해왔음에도 불구하고 이것에 대해서 뚜렷하게 알지 못한 채로 세월을 보냈다. 이 용어에 대한 명확한 정의를 보게 된 것은 정보처리기사 시험을 준비하던 찰나의 어느 교재에서였다.
"git은 리누스 토발즈(Linus Torvals)가 2005년 리눅스 커널 개발에 사용할 관리 도구로 개발한 이후 주니오 하마노(Junio Hamano)에 의해 유지보수 되고 있는 소프트웨어 분산 버전 관리 시스템이다."
git의 정의가 이렇기에 '소프트웨어 버전 관리'와 '분산 버전 관리 시스템'의 개념도 덩달아 궁금해져 찾아봤다.
"소프트웨어 버전관리(VCS, Version Control System)는 형상관리 지침을 활용하여 다양한 버전의 소프트웨어나 콘텐츠의 개발, 변경, 개선과 관련된 수정사항을 관리하고 추적하는 도구로 동일한 소스코드에 대한 여러 버전을 관리하는 것을 말한다. 버전 관리 시스템의 종류로는 중앙집중식 버전관리 시스템과 분산 버전 관리 시스템이 있는데... (이하 생략)"
"분산 버전 관리 시스템은 하나의 중앙 서버가 존재하지만, 여러 클라이언트들이 각자의 컴퓨터 저장소(=로컬 저장소)에 중앙 서버의 전체 사본을 가지고 작업하는 시스템이다."
정의를 한번 훑어보기 시작하면 모르는 정의가 줄줄이 고구마처럼 쏟아져 나오는 일이 IT 업계에 들어온 비전공자가 느낄 수 있는 유일한 슬픔인 것 같다. 형상관리는 또 뭐야?
"소프트웨어 형상관리(SCM, Software Configuration Management)란 소프트웨어 개발 및 유지보수 과정에서 발생하는 소스코드, 문서 등 각종 결과물(형상)에 대한 변경사항을 체계적으로 관리하고 제어하기 위한 활동으로 SVN이나 Git같은 버전 관리 시스템을 이용하는 것이다."
그렇다고 하니 이제는 조금 감이 잡힐 것 같다. SVN은 언젠가 살펴볼 수 있겠거니 하며 넘어가는데, 그렇다면 왜 git이 최근에 이렇게까지 각광받는 것일까?
git은 파일의 변화를 스냅샷이라는 형태로 저장하는데, 이 스냅샷은 이전 스냅샷의 포인터를 가지고 있으므로 수정사항이 생긴 여러 개의 소스 코드의 경우 복사본을 각각의 갯수만큼 저장하여 소스 코드를 공유할 때 생기는 버전 충돌 문제를 해결할 수 있다. 비슷한 맥락으로 여러 사람이 동일한 소스 코드를 사용하여 효율적으로 작업하고, 서로 다른 버전으로 개발할 수 있다는 "협업"에 그 강점이 있다.
그렇기에 git은 협업 경험과 git에 대한 숙련도, 그리고 사용자의 소스코드 포트폴리오를 보기에 적합한 시스템이다.
쓰다가 힘이 빠져서 아래로는 위의 내용을 요약한 것과 주로 사용되는 명령어와 관련 용어를 서술하고 마친다.
깃(git): 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템 또는 이러한 명령어
깃허브(github): 분산 버전 관리 툴인 깃(Git)을 사용하는 프로젝트를 지원하는 웹호스팅 서비스
형상관리: 소프트웨어의 개발 과정에서 소프트웨어의 변경사항을 관리하기 위해 개발된 일련의 활동
버전관리: 동일한 소스코드에 대한 여러 버전을 관리하는 것
git 관련 기본 용어
Repository
: 저장소, 저장소는 히스토리, 태그, 소스의 가지치기 혹은 branch에 따라 버전을 저장, 저장소를 통해 작업자가 변경한 모든 히스토리 확인 가능
Working Tree
: 저장소를 어느 한 시점을 바라보는 작업자의 현재 시점
Staging Area
: 저장소에 커밋하기 전에 커밋을 준비하는 위치
Commit
: 현재 변경된 작업 상태를 점검을 마치면 확정하고 저장소에 저장하는 작업
Head
: 현재 작업중인 Branch
Branch
: 가지 또는 분기점, 작업을 할때에 현재 상태를 복사하여 Branch에서 작업
Merge
: 다른 Branch의 내용을 현재 Branch로 가져와 합치는 작업
Git 주요 명령어
add
: 작업 내역을 지역 저장소에 저장하기 위해 스테이징 영역에 추가
commit
: 작업 내역을 지역 저장소에 저장
branch
: 새로운 브랜치 생성
checkou
t: 지정한 브랜치로 이동
merge
: 지정한 브랜치의 변경 내역을 현재 HEAD 포인터가 가리키는 브랜치에 반영함으로써 두 브랜치를 병합
init
: 지역 저장소 생성
remote add
:원격 저장소에 연결
push
: 로컬 저장소의 변경 내역을 원격 저장소에 반영
fetch
: 원격 저장소의 변경 이력만을 지역 저장소로 가져와 반영
clone
: 원격 저장소의 전체 내용을 지역 저장소로 복제
fork
: 지정한 원격 저장소의 내용을 자신의 원격 저장소로 복제
💡 잔디: 하루에 한번 이상 커밋을 하면 아래처럼
빈칸이 초록색으로 채워지는 걸 잔디라고 하는 것 같다.
(시작한 지 얼마 안 되어서 초라한 나의 잔디)