Git 시작하기
Git에 대한 간단한 소개
한주동안 오픈소스 컨트리뷰톤을 참여했다. 사전에 정해진 오픈소스 프로젝트중에 본인이 참여하고싶은 프로젝트를
선정해서 일주일동안 개발하는 행사이다. 나는 항상 오픈소스에 기여하는 사람들이 대단하다고 생각했고 나도 언젠가 기여해보고 싶었기 때문에 참여하게되었다.
첫날 시작에 앞서 주최자분의 git에 대한 키노트가 있었는데, 이는 행사의 진행에 반드시 사용되기 때문이다. 오픈소스의 개발에 있어서는 특히 더 필수적이다.
행사의 참석인원은 개발자들이 주를 이뤘지만 디자이너분들도 있었다. 또한 평소에 git을 사용하지 않는 분들도 있었기 때문에 오픈소스의 개발에 참여하기전에 익숙해질 필요가 있었다. 나 또한 프로젝트경험이 많지 않아서 평소에 개인 프로젝트를 저장하는 용도로만 사용하다가 이번에 제대로 협업에 사용한것같다.
버전관리
어떤 작업을 진행할 때 그 작업은 한번에 끝나지 않을 뿐만아니라 완성된 작업도 수정되기 일수이다. 그때마다 우리는 그 작업이 어떤상태인지
파일이름에 기록하곤한다. 예를들어 학교에서 조별과제를 하는데 작업을 끝내고 파일을 "조별과제_final"로 저장했다. 그런데 뭔가 변경사항이
생겨서 내용을 추가하고 다시 "조별과제_final(수정)"으로 저장한다. 그리고 과제가 끝났는데 교수님의 피드백으로 과제를 수정했다면 파일이름은 “조별과제_final(수정, 교수님피드백)” 이런식으로 될것이다.
하지만 사람의 손으로 하는 이런 수동적인 방법은 의도하지 않은 상황이 생기기 마련이다. 실수로 같은 이름으로 파일을 덮어 씌우거나 다른 폴더에 저장하는등의 실수를 한다면 그 상황을 해결하기 위해 또 다른 시간과 노력이 든다.
이런 상황은 디자인이나 문서작성은 물론 프로그래밍을 할 때도 빈번히 발생한다. 특히 프로그래밍을 할 때는 모듈의 수가 많아지고 의존성문제가 관여하면서 더 많은 수의 파일이 버전에 종속적이게 된다. 이 문제가 더욱 심화되는 것은 다수가 한가지 작업을 나눠서 할 때이다.
언제, 누가, 왜 이 작업을 했는지 혼란스럽다. 따라서
- 무언가 잘못되거나 오류가 발생했을 때 과거의 어떤 버전으로 돌아가기 위해서
- 한가지 프로젝트를 여러사람이 진행 할 경우 최신의 상황을 동기화하기 위해서
- 어떤 수정이나 추가가 왜 일어났는지 추적하기 위해서
어떤방법으로든 버전관리는 프로젝트에 필수적이다.
이러한 이유로 구축한 버전을 이용해서 프로젝트를 관리하는 시스템을 VCS(version control system)라고 하고 좀더 포괄적으로는 형상관리(configuration management)라고 한다.
Local version control system
파일을 다른 폴더에 복사해서 로컬에서 버전관리를 하는것.
Centralized version control system
서버에 저장소가 있고 동기화 된 서버의 저장소에서 다수의 클라이언트가 원하는 파일들을 받아오는 방식.
Distributed version control system
CVCS와 마찬가지로 서버에 저장소가 있지만 클라이언트에도 저장소가 있다. 클라이언트는 서버의 마지막 상태가 아니라 저장소를 통째로 복사해서 가지고 있는다. 다수의 원격 저장소를 가질 수 있다.
Git 이란…?
git은 리눅스로 유명한 리누스토발즈가 최초로 개발한 Distributed version control system (DVCS, 분산버전관리시스템)이다.
중앙집중식 버전관리시스템과 다르게 클라이언트 모두에게 저장소가 있다. 따라서 대부분의 명령어가 로컬에서 실행되어 속도가 빠르고 데이터를 유실할 염려가 없다. 또한 git은 변경사항을 스냅샷으로 기록하기 때문에 메모리 사용량이 적다. github라는 프로젝트 웹호스팅 서비스가 생기면서 도구이상의 문화로 자리잡았다.
- Working Directory
작업이 이루어지고있는 공간. git에서 해당하는 directory를 추적한다. - Straging Area
곧 commit할 파일의 정보를 저장한다. - Git Repository
git을 원하는 폴더에 초기화하면 이 폴더가 생기고 프로젝트의 정보가 저장되어있다.
git을 사용하는 단계는 다음과 같다.
- working directory에서 작업
- 원하는 파일만 staging area로 올림(스냅샷을 만든다)
- git repository로 commit
Git의 기본 용어
- Add, Staging
working directory의 파일을 commit을 위한 상태로 만들기 위해 staging area로 옮긴다. - Commit
git 저장소에 파일을 저장한다. - Branch
commit 개체 사이를 이동할 수 있는 일종의 포인터 - Pull, Push
원격 저장소로부터 파일의 상태를 가져오거나(pull) 보냄(push) - Checkout
다른 branch로 이동. working directory의 파일이 변경된다.
Branch
git에서 가장 강력한 기능중 하나인 branch는 작업의 분기를 나눌 수 있게 해준다.
git을 init 하면 기본적으로 master라는 branch(특별한 branch는 아니지만 관용적으로 master라는 이름을 바꾸지않고 놔둠)가 생성된다. 또한 현재 작업중인 로컬 branch를 나타내는 HEAD라는 포인터는 master를 가르킨다.
이 때 branch를 생성하면 현재 작업하고 있는 마지막 commit을 기준으로 branch가 만들어진다.
이 상태로 새로운 commit을 하면 현재의 branch인 master는 새로운 commit을 향하지만 나눠놓은 branch는 계속해서 branch를 만든 시점의 commit을 향하고 있다.
Merge
merge는 branch와 다른 branch를 합치는 것이다. merge가 사용되는 상황은 주로 다음과 같다.
1.master 에서 가져온 feature branch에서 작업중.
2.심각한 버그로 당장 해결해야만 하는 이슈가 발생해서 hotfix branch를 만든다.
3.이슈를 해결한 hotfix branch와 master branch를 merge하고 필요없어진 hotfix branch는 지운다.
4.작업하던 feature branch를 마저 작업하고 master branch로 merge. 이때 git에서는 C4와 C5둘만 합치는 것이아니라
둘의 공통조상인 C3까지 세개의 commit객체로 merge를 하고 새로 만들어진 commit으로 HEAD를 옮긴다.(3-way merge)
만약 C4와 C5에서 공통된 부분을 수정했다면 충돌(Conflict)이 발생한다. 이때는 코드에 충돌이 일어난 부분이 표시되고 개발자는
해당부분을 수정해야 merge를 진행할 수 있다.
주요 명령어
init
git init
현재 디렉토리를 git repository로 만든다.
config
git config --global --list
현재 설정 정보를 조회
git config --global user.name '이름'
git config --global user.email '이메일'
이름과 이메일을 등록
add
git add 파일이름
git add .
git add -u
git add -A
git add -p
아직 추적하고 있지 않은 파일을 추적하게 하거나 working directory의 이미 추적하고 있는 파일을 스냅샷을 위해 staging area에 넣는다.
. 옵션은 working directory안에서 이미 추적하고 있거나 새로 생성된 파일을 모두 스테이징한다. -u는 이미 추적하고 있거나 지워진 파일을 모두 스테이징한다.
-A 옵션으로 두가지를 한번에 할 수 있다. -p옵션은 chunck별로 스테이징할지 말지를 결정할 수 있다.
commit
git commit
git commit -m '하고싶은말'
git commit --amend
staging area의 상태를 git repository에 저장. 보통 comment와 함께 사용한다.
amend 옵션은 현재 branch의 마지막 commit을 새로운 commit으로 바꾼다. 주로 방금 commit한 것의 comment를 수정할 때 사용한다.
branch
git branch 이름
새로운 branch를 생성
git branch -d 이름
기존의 branch를 삭제
git branch -m 기존이름 새이름
branch의 이름 변경
checkout
git checkout 브랜치이름
원하는 branch의 commit으로 working directory의 상태를 변경
git checkout -b 브랜치이름
새로 branch를 만들면서 checkout
merge
git merge 브랜치이름
HEAD가 가르키는 현재 branch에 다른 branch를 합침
clone
git clone 저장소주소
새로 폴더를 만들고 remote 저장소를 복제해옴
push
git push 저장소
remote 저장소에 데이터를 업로드한다. 저장소를 명시하지 않으면 origin에 push한다.
fetch
git fetch 저장소
저장소의 데이터를 가져온다.
pull
git pull 저장소
remote 저장소에서 데이터를 가져와서 merge한다. 저장소를 명시하지 않으면 origin에서 pull한다.
log
git log
git log -숫자
commit history를 조회. -숫자 옵션으로 갯수를 지정할 수 있다.
참고 사이트
https://git-scm.com/book/ko/v2
https://homes.cs.washington.edu/~mernst/advice/version-control.html
http://noritersand.tistory.com/86