Git은 Branch를 자유자래로 사용함으로써 그 진가를 실감할 수 있다. 복잡한 애플리케이션이나 프로젝트일 수도록 더욱 힘을 발휘한다. Branch에 대하여 알아보자.
1) 분산 버전 관리 시스템
- 클라이언트가 파일의 마지막 Snapshot을 Checkout 하지 않는다. 그냥 저장소를 전부 복제한다
- 서버에 문제 생겨도 다시 작업시작 가능하다
- DVCS 한경에서는 리모트 저장소가 존재하고 여러개 문제없다. 동시 다양한 그룹과 다양한 방법으로 협업이 가능하다.
2) Git 철학
- 2005년 BitKeeper 사용하지 않으며 리누스 토발즈가 개발
- 빠른 속도
- 단순한 구조
- 비선형적인 개발 (수천 개의 동시 다발적인 브랜치)
- 완벽한 분산
- 리눅스 커널같은 대형 프로젝트에도 유용할 것 (속도나 데이터 크기면에서)
3) Git 데이터 저장 방식
- Git 은 데이터를 일련의 Snapshot으로 기록한다
- Staging Area에서 Local Git 저장소에 파일 저장(=Blob). 해당 파일의 Checksum을(SHA-1) 저장한다.
- Commit을 하면 Local Git 저장소에
+ 하위 디렉토리의 "트리 개체" 생성
+ 트리 개체 밑으로 "커밋 개체" 생성 : 메타데이터(저자,메시지)와 트리 개체 포인터, 이전 트리 개체 포인터 정보 저장
- 즉, Git 저장소에 Commit > Tree > Blob 이 생성된다
4) 브랜치(Branch)
- Git 기본 master 브랜치를 만든다. master 브랜치는 자동으로 마지막 Commit 개체를 가르킨다
+ 즉, 브랜치는 Git 저장소의 Commit 개체를 가르키는 것이다.
- 브랜치는 SHA-1 40자의 체크섬 파일에 불과하다. 즉 41바이트(줄바꿈포함) 크기
- Git은 특수한 HEAD 라는 포인터가 존재 = 지금 작업 중인 브랜치를 가르킴
+ 즉, Head > Master(브랜치) > Commit 포인터를 가르킨다
- 브랜치를 나누고 각각의 브랜치가 commit 이후 merge 방법 = 3 way merge
+ Merge시에 Merge에 대한 정보가 들어있는 커밋을 하나 만든다
5) 충돌(Conflict)
- 3 way merge 시에 같은 파일의 한 부분을 각각의 브랜치가 수정하였을 때 발생
- git status 명령으로 conflict 상황 체크
- 충돌부분을 직접 수정후 git add -> git commit 함
- Merge 브랜치 필터링 명령
+ git branch --merged : merge한 브랜치 목록 확인 (* 가 없는 브랜치는 이미 다른 브랜치와 merge 한 것임)
+ git branch --no-merged : 현재 ckeckout한 브랜치에 merge 하지 않은 브랜치를 보여줌
6) 브랜치 접근 in Local
- master 브랜치 : 배포/안정화 브랜치
- develop 브랜치 : 개발 브랜치, develop 밑으로 topic 브랜치 (각 브랜치를 하나의 실험실로 생각한다)
- topic 브랜치 : 어떤 한 가지 주제나 작업의 짧은 호흡의 브랜치이다 예) hotfix 브랜치
+ master merge후에 삭제
+ 내용별 검토, 테스트가 용이하다
7) 리모트 브랜치
- 리모트 브랜치란 리모트 저장소에 있는 브랜치이다.
- 명칭 = (remote)/(branch) 형식 예) 리모트 저장소가 origin 이고 master 브랜치이면 origin/master 로 표현함
- git clone으로 local에 내려 받으면 origin/master가 생기고 마음대로 조종할 수 없다.
- git fetch origin을 할때 자동으로 리모트 저장소의 최신 master 브랜치로 local의 origin/master가 갱신된다
+ 누군가 리모트에 push를 하여 origin의 master commit을 갱신함
+ 나는 옛날 origin/master를 가지고 있고 그동안 local에서 commit도 했음, pull로 최신으로 update 할 경우
+ git fetch origin/hotfix01 로 브랜치 지정하여 로컬로 받으면 저장소에 브랜치가 생성되지 않고 포인터만 생성됨
= git merge origin/hotfix01 로 새로받은 브랜치 내용을 merge 한다
= 또는 merge 하지 않고 새로운 브랜치로 만들려면 git checkout -b hotfix01 origin/hotfix01 수행
- git push [remote] [branch] : 리모트에 쓰기 권한이 있어야 한다. 예) git push origin hotfix01
+ git push [remote] [local branch]:[remote branch] 로 로컬/리모트 브랜치 명이 틀릴 때 사용한다
8) 브랜치 추적(Tracking)
- Git은 리모트 저장소에서 Clone시에 master 브랜치를 origin/master 브랜치로 추적 브랜치를 만든다
- checkout 할 때도 자동으로 추적 브랜치가 만들어 져서 git pull/push 할 때 별도의 옵션을 주지 않고 해당 리모트 브랜치로 수행
- git checkout -b [branch] [remotename/branch] : 추적 브랜치 만듦
9) 리모트 브랜치 삭제
- git push [remotename] [local branch] :[remote branch] 협업때 사용했던 서브 브랜치를 이제 삭제 하고 싶을 경우
- 예) git push origin :hotfix01 [local branch]를 비워두면 "로컬에서 빈 내용을 리모트의 [remote branch]인 hotfix01에 채워 넣어라" 라는 뜻이 된다