본문 바로가기
공부/Git

[Git] Git과 SVN의 차이, 그리고 Branch와 merge

by haejang 2020. 7. 9.
728x90
728x90

일단 Git과 Subversion(SVN)의 차이를 한번 알아보자

둘 다 버전관리 도구이지만, Subversion은 중앙 버전 관리 도구이고, Git은 분산 버전 관리 도구이다

 

 

그래서 Git은 SVN과 달리 지역저장소라는게 하나 더 존재한다

원격 저장소(remote repository)는 여러 사람들이 공동으로 이용하는 저장소이고

지역 저장소(local repository)는 개인적으로 사용하는 저장소가 된다

실제 개발은 지역 저장소에서 이루어진다

 

또한 commit을 통해 지역저장소에 저장될 때, SVN은 변경된 부분만을 저장하지만 Git은 스냅샷 자체를 저장하게 된다

이 때 Git은 스테이징영역에 있는 데이터의 스냅샷에 대한 포인터, 커밋 메세지같은 메타데이터 등등의 커밋 Object를 저장한다

이런 커밋은 변경의 단위가 되고, 시간 순으로 저장되며 이전 커밋을 가리키는 포인터를 유지한다

 

브랜치(Branch)는 바로 이 커밋들을 가리키는 포인터이다

 

먼저 최초로 커밋을 수행하면 master 브랜치가 생성되고, 이 마스터 브랜치는 커밋이 수행될 때마다 가장 최근의 커밋을 가리킨다

 

커밋 수행마다 마스터 브랜치가 따라다닌다

 

일반적으로 마스터 브랜치에서는 뭔가 작업을 따로 하진 않고 토픽 브랜치(Topic Branch)를 만들어서 작업한 후 마스터 브랜치와 병합(merge)한다

이제 어떤 오류를 수정하기 위해 fix1이라는 새 브랜치(토픽 브랜치)를 만든다고 하자

그럼 이 브랜치는 자동으로 현재 커밋(가장 최근의 커밋)을 가리킨다

git branch fix1

 

 

 

한편 Git에는 HEAD라는 특별한 포인터가 있다

이 HEAD는 "현재 작업중인 브랜치"를 가리키는 포인터이다

따라서 fix1이란 브랜치에서 작업을 하려면 HEAD를 master에서 fix1로 옮겨줘야 한다

이 때 쓰는 명령어가 checkout이다

git checkout fix1

 

 

 

여기서 오류를 다 수정한 후 커밋을 수행하면 fix1과 HEAD는 방금 커밋한 객체를 가리킨다

git commit -a -m "설명"

 

 

 

 

이제 수정한 브랜치를 마스터 브랜치에 반영할 차례가 왔다

이 작업을 병합(merge)라 하는데, 우선 마스터 브랜치로 전환한다

git checkout master

 

 

 

merge 명령어로 fix1과 master를 병합한다

git merge fix1

 

 

 

마지막으로 fix1 브랜치를 삭제해준다

git branch -d fix1

 

 

 

병합이 끝났다. 이 방법은 "fast-forward"병합이라고, 단순하게 master 브랜치를 앞선 커밋을 가리키게 하는 병합이다

병합될 브랜치에도 변경 내용이 있는 경우엔 두 브랜치의 변경 내역이 합쳐지며 새로운 커밋을 생성한다고 한다

 

 

참고서적 : 오픈 소스 소프트웨어로 실습하는 소프트웨어 공학 - 정인상

728x90
728x90

댓글