평소에 개발을 하면서 Git을 자주 사용하게 된다. 작업 중인 레파지토리에 기능 개발을 위해 브랜치를 만들고, 커밋하고, 푸쉬하고, 머지하는 등 Git의 기능을 관성적으로 활용하고 있지만 Git의 원리나 흐름에 대해 깊이 있게 알지 못했다. 그래서 기본 틀에서 벗어나는 상황이 발생하면 많이 헤맸던 것 같다. Git에 대해 좀 더 공부해야겠다는 필요성을 느꼈고 이 책과 여러 자료를 통해 공부한 내용을 정리해보려고 한다.
Git이란 분산형 버전 관리 시스템(Distributed Version Control System)의 한 종류이다. 먼저, 버전 관리 시스템이 왜 필요한지 알아보자.
우리가 사용하는 스마트폰 앱, 게임 등은 자주 업데이트된다. 개발팀 입장에서 자주 일어나는 업데이트를 체계적으로 관리하려면 소스 코드가 언제, 어떤 변화가 있었는지 기록하고 추적해야 할 필요가 있다.
또한, 하나의 프로젝트에 여러 개발자가 함께 개발하면서 동시에 많은 기능을 추가하고 코드를 변경한다. 그러다 보면 같은 소스 코드를 둘 이상이 동시에 수정하여 충돌이 발생할 수 있다. 이러한 복잡한 상황을 체계적으로 관리하기 위해 버전 관리 시스템이 필요하다.
버전 관리 시스템은 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템을 말한다. 버전 관리 시스템을 이용하면 각 개발자가 원하는 시점에 버전을 지정하고 공유할 수 있으며, 특정 버전으로 자유롭게 이동할 수 있다.
앞서 언급했듯이, Git은 분산형 버전관리 시스템의 한 종류라고 했다. 그렇다면 왜 분산형일까? 이를 이해하기 위해서 버전 관리의 종류를 알아보자.
버전 관리(형상 관리) 방식에는 크게 중앙 집중식과 분산 관리식으로 나뉘며 이를 대표하는 도구로는 중앙 집중 관리식의 SVN, 분산 관리식의 Git이 있다.
SVN은 자신의 로컬PC에서 커밋을 하면 바로 중앙 저장소에 반영이 되는 방식이며, Git은 로컬PC에서 커밋을 하면 지역 저장소에 반영이 되고 지역 저장소에서 Push를 하면 원격 저장소에 반영이 된다.
SVN은 모두가 중앙 서버에 있는 같은 자료를 받아오고, 내가 커밋을 한 순간 모두에게 공유된다. 이러한 방식은 직관적인 장점이 있지만, 두 사람이 하나의 파일을 동시에 수정하고 커밋했을 때 충돌이 일어날 확률이 높아진다. 또한 중앙 저장소에 문제가 생기면 모든 작업이 마비되는 단점이 있다.
반면에 Git은 직관적이지 않고 적응하는데 시간이 필요하지만, 소스코드를 주고 받을 필요 없이 (브랜치, 머지 등을 활용하여) 같은 파일을 여러 명이서 동시에 작업하는 병렬 개발이 가능하다. 또한 원격 저장소의 내용이 모든 협업자들의 지역 저장소에 저장이 되어 있는 분산 버전 관리이기 때문에 중앙 저장소에 에러가 생겨도 지역 저장소를 통해 복구하기가 용이하다.
깃은 가장 많이 사용되는 분산형 버전 관리 시스템으로 깃이 제공하는 기능으로는 다음과 같은 것들이 있다.
깃허브란 깃 프로젝트를 지원하는 호스팅 서비스를 말한다. 깃 저장소 서버를 대신 유지 및 관리해주는 서비스이며 무료로 이용할 수 있다. 깃 기반의 수많은 오픈 소스 프로젝트들이 깃허브에 공개되어 많은 사람들이 보며 활용 가능하다.
깃허브가 제공하는 기능에는 다음과 같은 것들이 있다.
깃과 깃허브를 사용하면 다음과 같은 흐름으로 지역 저장소(Local Repository)와 원격 저장소(Remote Repository)에 반영된다.
Reference
https://www.yes24.com/Product/Goods/103525595
https://inpa.tistory.com/entry/GIT-%E2%9A%A1%EF%B8%8F-%EA%B0%9C%EB%85%90-%EC%9B%90%EB%A6%AC-%EC%89%BD%EA%B2%8C%EC%9D%B4%ED%95%B4
https://velog.io/@khakhid/%EC%B4%88%EB%B3%B4%EC%9E%90%EB%A5%BC-%EC%9C%84%ED%95%9C-%EA%B9%83%EA%B9%83%ED%97%88%EB%B8%8C
https://dzzienki.tistory.com/46