brunch

You can make anything
by writing

C.S.Lewis

by 윤민섭 Nov 03. 2020

형상 관리 Git

개발자들은 어떻게 코드를 관리할까?

Version Control System?


"OO님, 새로운 스펙 개발해주세요." 

"OO님, 코드 수정 부탁드려요."


개발을 할 때 위와 같은 요구를 받는 경우가 많다. 이러한 상황은 한 명에게만 생기는 것이 아니라 같은 서비스를 하는 모든 개발자에게 생긴다. 협업을 할 때 보다 안전한 개발 전략과 완성된 서비스의 버전 관리가 필요하기에 개발자들은 버전 관리 시스템을 사용한다.


Git vs SVN


예전에는 버전 관리 시스템으로 SVN을 많이 사용했다. Subversion의 약자인데 이 방법은 Git이랑은 조금 차이가 있다. SVN은 "중앙집중형"이라면 Git은 "분산형"이라고 생각하면 된다.


https://image.slidesharecdn.com/svngit-130319211210-phpapp02/95/svn-git-10-638.jpg?cb=1374635099


어떤 차이가 있을까? 

SVN은 저장소가 하나라면 Git은 로컬 저장소 / 원격 저장소로 저장소를 분산해서 관리하고 있다. 


이로써 얻는 장점은 어떤 게 있을까? 

첫 째, 로컬 저장소가 있음으로써 네트워크에 접근할 필요가 없기 때문에 빠르다. 


둘째, SVN은 Commit 하는 순간 저장소를 공유하는 모든 개발자들이 보게 된다. 하지만 Git은 내 로컬 저장소에서 마음껏 개발하고 정리하여 필요할 때 원격 저장소로 올리면 된다.


셋째, Git의 경우 원격 저장소 서버가 잠시 끊기더라도 버전 컨트롤이 되지만 SVN은 서버가 끊기는 순간 버전 컨트롤도 같이 끊긴다. 


또 어떤 차이가 있을까? 

만약 원격 저장소가 사라진다면? SVN은 복구가 불가능하지만 Git은 로컬 저장소에 사본을 들고 있다면 복구가 가능하다.



Git 사용 방법


SourceTree 앱을 기반으로 Git을 사용하는 방법을 알아보겠다.


Clone

말 그대로 복제 기능이다. 원격 저장소에 접근하여 로컬 저장소로 복제를 의미한다.

터미널에선 git clone '저장소 URL'으로 가능하다.



1. Commit



커밋이란 작업 상태를 저장하기 위해 메시지를 남기는 작업을 의미한다. 변경된 작업이 있을 때 변경된 파일들은 unstage 영역에 존재하며 커밋 메시지를 남기기 위해선 커밋하기 위한 파일을 stage영역으로 추가하고 commit 한다.


터미널에선 git add 'file name'으로 unstage에서 stage영역으로 이동시킨다. 이후 git commit -m "메시지"로 커밋을 남길 수 있다.



2. Push


Push 란 로컬 저장소에 있는 내용을 원격 저장소로 보내는 액션을 의미한다.


터미널에선 git push '원격 저장소' '지역 브랜치':'원격 브랜치'로 가능하다. 

- ex) git push origin master: master



3. Pull


Pull이란 원격 저장소에 있는 내용을 로컬 저장소로 가져오는 액션을 의미한다.


터미널에선 git pull로 가능하다.



4. Fetch


Fetch란 원격 저장소와 로컬 저장소의 차이를 새로고침 한다.


터미널에선 git fetch로 가능하다.



5. Branch


Branch란 Git을 사용하는 이유 중 강력한 이유이다. Branch가 있기 때문에 작업자가 여럿이어도 각자의 작업에 맞게 브랜치를 생성하여 협업이 가능하다. 작업 별로 버전 관리를 할 수 있기 때문에 브랜치 간 이동을 하며 작업을 할 수도 있다. 브랜치 간 이동을 checkout이라 한다.


터미널에선 git branch '새로운 브랜치명'으로 Branch를 생성할 수 있다.

Branch 간 이동을 하기 위해선 git checkout '브랜치'로 가능하다.



6. Merge


Branch 간 작업을 했다면 프로젝트의 기본이 되는 Base 브랜치에 합쳐야 한다. 이 과정을 Merge라고 한다. Merge시 동료가 작업한 내용과 충돌이 난다면 함께 충돌을 해결하여 Merge 한다.


터미널에서 브랜치를 머지하기 위해선 git merge '브랜치'로 가능하다.


6-1. Rebase


브랜치를 합치는 방법은 한 가지 더 있는데 바로 Rebase이다. 해당 기능은 Base 브랜치를 변경하여 병합하는 방법이다. Base를 변경하며 Merge 하기 때문에 원래 커밋 이력이 변경될 수 있다. 정확한 이력을 남길 필요가 있는 경우에 지양한다.



7. Stash


만약, 현재 작업 중인 것이 있다면 checkout, Pull 등의 액션이 불가하다. 따라서, 현재 작업 내용을 잠시 보관하기 위해 사용되는 기능이 바로 Stash이다.


터미널에선 git stash로 가능하다.



Git Branch Strategy


Git을 사용함에 있어 명확하고 깔끔하게 버전 관리를 하는 여러 방법이 있다. 

대표적으로 Git-flow, Github-flow, Gitlab-flow 등이 있는데 그중 Git-flow가 많이 사용된다.


https://woowabros.github.io/img/2017-10-30/git-flow_overall_graph.png


브랜치가 크게 5가지로 나눠져 있다. 


Master

  - 실제로 배포가 된 버전만을 기록하여 관리한다.

  - 해당 버전이 어떤 버전인지를 나타내는 Tag를 달아두는 브랜치이다.

Develop

  - 개발 중인 상태를 기록하여 관리한다.

  - 현업에 있어서 주된 브랜치라고 할 수 있다.

Release

  - 배포를 위해 Develop 브랜치를 Base로 하여 생성된 브랜치이다.

  - 배포를 위한 준비가 끝나면 Master 브랜치로 Merge 하고 해당 브랜치는 삭제한다.

  - 또 Develop 브랜치와 상태를 맞춰야 하기 때문에 Develop 브랜치에도 Merge 한다.

Hotfix

  - 실제로 배포가 나갔을 때 급하게 수정할 일이 생기면 Master 브랜치를 Base로 하여 생성된다.

  - 수정이 완료되면 Master 브랜치에 Merge 한다.

  - 또 Develop 브랜치 역시 상태를 맞춰야 하기 때문에 Develop 브랜치에도 Merge 한다.

Feature

  - 새로운 기능 혹은 고쳐야 할 기능에 대해 생성하는 브랜치이다.

  - 실제로 가장 많이 생성되고 삭제되는 브랜치이다.

  - 기능 개발이 완료되면 develop 브랜치에 Merge 한다.






Git을 다루는 방법에 대해 간략하게 정리해 보았는데요, Git을 제대로 쓰기 위해선 개념을 아는 것보다 직접 해보면서 경험해보고 느끼는 것이 더 중요합니다. 개인 프로젝트를 하더라도 Git을 사용하여 여러 기능을 사용해 보는 것도 좋다고 생각합니다.


고맙습니다.


브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari