'git' 은 소스코드의 변경점을 관리해주는 분산형 '버전 관리 시스템(VCS)' 입니다.
대부분의 협업 개발 및 버전 관리에서 사용되고 있는 아주 강력한 도구인 만큼
주요 기능과 특징에 대해 알아보도록 하겠습니다.
버전관리
쉽게 말해 코드가 누구에 의해서, 언제, 어떻게, 어디가 바뀌었는지를 감시하고 기록하며,
추적하는 것이 바로 '버전관리' 입니다.
개발자들은 그 이름에서 부터 그렇듯 끊임없이 디벨롭 develop 을 하는 사람들 입니다.
그런데 코드를 추가하거나 수정할 때마다 매번 새로운 파일을 저장해서 가지고 있어야 한다면 얼마나 힘들고 비효율적일까요
또 어떤 작업을 했는지 자세한 수정사항에 대해서도 따로 정리해야 할 수도 있습니다.
심지어 그렇게 쌓인 수많은 파일들을 관리하기란 불가능에 가까울 것입니다.
그리고 프로젝트를 진행하다보면 실수로 혹은 예기치 못한 문제가 발생해,
과거 이력을 살펴보고 특정 시점으로 돌아가고 싶어질 수도 있을 텐데요.
관리에 특화된 알고리즘을 가지고 만들어진 'git' 은 이 모든 걸 아주 쉽고 효율적으로 수행합니다.
분산형
그리고 이러한 버전관리를 각 개발자들은 자신의 '로컬 저장소'(local repository) 에 가지고 작업을 하고
원할 때마다 '원격 저장소'(remote repository) 와 동기화 시킬 수 있습니다.
그래서 git 을 '분산형' 버전관리 시스템이라고 부르는 것입니다.
로컬저장소에서 작업을 하면 어떤 이점이 있을까요.
먼저 네트워크에 연결되어있지 않거나 네트워크의 문제로 중앙서버가 다운되는 일이 발생했다 하더라도
작업을 문제없이 수행할 수 있다는 것입니다.
마찬가지로 중앙 서버에 의존하지 않기 때문에 작업시에 병목현상 없이 즉각적인 작업도 가능합니다.
그리고 여러 개발자들이 협업을 할 때 메인이 되는 파일을 망쳐버릴 걱정없이
자신의 로컬 환경에서 다양하고 실험적인 작업들을 수행해볼 수도 있습니다.
그리고 잘 작성하였다면 원격 저장소에 동기화를 시키는 것이죠.
정리하자면 중앙 의존성을 제거하고 효율성과 안정성을 높여준다는 이점이 있습니다.
커밋, 풀 과 푸시
git 을 사용하여 협업을 하게 된다면 꼭 알아두어야 하는 개념들이 있습니다.
바로 '커밋' commit 과 '풀' pull , '푸시' push 입니다.
먼저 '커밋'은 매 변경점을 찍는 행위를 말합니다.
변경 사항에 대해서 특정 시점에서 스냄샷을 찍는 것과 비슷한 개념입니다.
그러니까 여기까지 어디를 어떻게 변경하였다고 'git' 에게 알려주는 것입니다
그리고 앞서 설명한대로 로컬 저장소에서 진행한 작업을 원격 저장소로 밀어넣어 병합시키는 것을 '푸시'라고 하고
반대로 원격 저장소의 코드를 당겨와 로컬 저장소에 병합시키는 것을 '풀'이라고 합니다.
클론
서로의 변경점을 잘 버무려 합쳐주는 기능인 병합과는 달리 '클론'은 말그대로 원격 저장소의 코드를
로컬 저장소에 그대로 베껴오는 것을 말합니다.
브렌치와 병합
git 이 가지고 있는 장점을 잘 활용하려면 무엇보다 '브렌치' branch 와 '병합' merge 의 개념을 잘 이해해야 합니다.
저장소 와는 조금 다른 개념입니다.
'원격 저장소-로컬 저장소'는 프로젝트의 물리적 위치와 접근 방식에 대한 개념이며 '저장소' 차원에서의 분할입니다.
'브랜치-브랜치'는 프로젝트의 버전 관리와 개발 경로 관리에 대한 개념이며 '버전' 차원에서의 분할인 것입니다.
브렌치는 단어의 뜻에서도 알 수 있듯, 쉽게 말하면 나뭇가지처럼 나누어져서 뻣어나가는 것을 말합니다.
git 에서는 메인 브렌치가 있고 그 옆으로 수많은 브렌치를 생성해 여러 버전의 작업들을 동시에 시도해볼 수 있는 것입니다.
그리고 git은 각 브렌치들을 다시 메인 브렌치에 혹은 다른 브렌치에 병합시킬 수 있는 기능도 제공하고 있습니다.