git이란 리누스 토르발스가 개발한 로컬에서 관리되는 분산버전관리시스템(DVCS: Distributed Version Control System)이다.
그렇다면 git은 어디에 쓰이는 것일까?
우리가 조별과제를 한다고 가정한다.
사람들은 각자의 역할을 맡게되고 조장은 발표 및 최종 결과물을 만들어야 한다.
조장은 각자 보낸 자료들을 취합하고 결과물을 만든다.
그 과정 중에 지속적으로 수정이 이루어지고 수정본 1, 수정본 1-1, 수정본 2, 최종결과, 최종결과 수정1등 지속적으로 많은 파일들이 생겨나고 중간 중간 조원들에게 결과물도 각각 보내줘야 한다.
이런 프로젝트 관리를 도와주는 것이 git의 역할이라고 할 수 있다.
git은 모든 파일의 변화를 기록하며 소스코드의 수정에 따른 버전을 관리한다.
여기서 버전 관리라고 부르는 것이 파일들에 대한 복사,백업,저장이라고 할 수 있다.
버전 관리 시스템은 문서나 설계도, 소스 코드 등의 변경점을 관리해주는 소프트웨어이다.
버전관리시스템은 세가지 시스템이 존재한다.

서버 없이 로컬 컴퓨터 내에서 버전을 저장한다. 간단한 데이터베이스만으로도 구현이 가능하다.
단순하고 간단한 개인 프로젝트에 적합하며 협업에는 쓰이지 못하고 만약 컴퓨터가 고장날 시 복원이 힘들다는 단점을 가지고 있다.

프로젝트의 메인 버전을 하나의 중앙서버에 저장할 수 있고, 각 팀 구성원은 프로젝트의 특정 버전을 받아 올 수(checkout) 있다. 프로젝트에서 필요한 변경 사항을 업데이트한 후 각 구성원은 변경 사항을 중앙 저장소에 다시 저장(check in) 할 수 있으며, 나머지 팀원들이 새 업데이트를 이용할 수 있다.
대표적인 것으로는 CVS, Subversion 등이 있다.
장점
팀 구성원 간의 파일 공유가 가능하다.
프로젝트가 보다 안정적인 서버(클라우드)에 저장된다.
관리자가 저장소의 사용 및 구조를 제어할 수 있다.
단점
분산 버전관리 시스템

하나의 중앙 서버가 존재하는 것은 동일하지만, 여러 클라이언트들이 각자의 컴퓨터 저장소에 중앙 서버의 전체 사본을 가지고 작업을 하는 것을 의미한다.
대표적인 것으로 git이 존재한다.
장점
단점
소스코드가 저장되어 있는 여러개의 브랜치(Branch)들이 모여 있는 디스크상의 물리적 공간을 의미한다.
git은 저장소가 로컬저장소(Local Repository)와 원격 저장소(Remote Repository)로 나뉜다.
작업시 원격저장소에서 로컬 저장소로 소스코드를 복사해서 가져오고, 소스코드를 변경한 다음 커밋을 한다. 이때 커밋한 소스는 로컬저장소에 저장되며, 푸시 하기 전에는 원격 저장소에 반영되지 않는다.
작업한 내용을 로컬 저장소에 저장하는 과정이다. 각각의 커밋은 의미 있는 변경 단위이며, 변경에 대한 설명을 커밋 로그에 남긴다. 대게 하나의 커밋은 하나의 주제로 묶을 수 있는 변경단위가 된다.
프로젝트 팀에 따라 커밋을 하는 단위가 서로 다르고 커밋 로그의 작성 형식도 다르다. 만약 원격 저장소와 연결된 자동화 시스템을 사용한다면 시스템이 인식할 수 있도록 엄격한 형식에 맞춰 커밋 로그를 작성해야 할 수도 있다.
커밋을 단위로 구분된 소스코드 타임라인에서 분기 후 새로운 커밋을 쌓을 수 있는 가지를 만드는 것 혹은 그 가지를 브랜치라고 한다.
브랜치는 개발의 주축이 되는 마스터브랜치(Master Branch)가 존재하며 모든 브랜치는 마스터 브랜치에서 분기 후 최종적으로 다시 마스터 브랜치에 병합되어 개발이 진행된다.
특정 시점이나 브랜치의 소스코드로 이동하는 것을 의미한다. 체크아웃을 통해 과거 여러 시점의 소스코드로의 이동이 가능하며 체크아웃 대상은 브랜치, 커밋, 태그이다.
임시저장 영역으로 작업한 내용이 올라간다. 이것을 이용해 작업한 내용중 커밋에 반영할 파일만 선별 후 커밋 수행이 가능하다.
커밋의 임의적인 위치를 쉽게 추적할 수 있도록 붙여놓은 이정표이다. 태그가 붙여진다면 커밋의 ID 대신 태그명을 입력하여 체크아웃이 가능하다.
원격 저장소에 있는 내용중 로컬저장소에 반영되지 않은 내용을 가져와 로컬 저장소에 저장하는 과정을 의미한다.
로컬 저장소의 내용중 원격 저장소에 반영되지 않은 커밋을 원격 저장소로 보내는 과정을 의미한다.
하나의 브랜치를 다른 브랜치와 합치는 과정을 의미한다.
머지에는 fast-forward merge, 3way merge, 2way merge등 다양한 개념이 존재한다. 그 중 기본은 두개의 브랜치를 합쳐 하나의 브랜치로 만드는 3way merge이다.
병합되는 브랜치는 주종관계가 성립한다. 그렇기에 A를 B에 병합, B를 A에 병합 하는 작업은 서로 다른 작업이다.
병합도 커밋의 한 종류로 3way merge는 서로 다른 두 커밋으로부터 하나의 새로운 커밋을 생성하는 작업이다.

깃 저장소에 대한 원격 액세스를 제공하는 서비스가 존재한다. 서비스는 코드 호스팅 뿐만 아니라 소프트웨어 개발 수명주기를 관리하도록 설계된 추가 기능을 제공한다. 또한 다른 사람간 코드공유, 버그 추적, 위키 공간 및 전반적인 프로젝트 관리 기능이 제공된다.
웹 기반으로 동작하기 때문에 브라우저만 존재한다면 접근이 가능하기 때문에 코드리뷰 등의 작업도 한층 수월하게 가능하다.
이러한 서비스를 제공하는 대표적인 예가 GitHub와 GitLab 등을 들 수 있다.

GitHub
GitHub의 경우 공개적으로 사용 가능한 무료 서비스로 유료계정이 없는 경우 모든 코드를 공개해야 한다. 누구나 GitHub에 푸시한 코드를 보고 개선을 위한 제안을 제공할 수 있다.
GitHub은 주로 오픈소스 프로젝트에서 많이 사용된다.즉 개방적인 성격을 가진다.
GitLab
GitLab은 개인 혹은 조직이 깃 리포지토리의 내부 관리를 제공하는데 사용할 수 있는 서비스이다.GitLab은 중앙 서버에서 깃 저장소를 관리하는 방법으로 리포지토리 또는 프로젝트를 완벽하게 제어할 수 있으며 공개 또는 비공개 여부를 무료로 결정할 수 있다.
GitLab은 주로 기업체 등에서 인트라넷에 설치하여 많이 사용한다. 즉 폐쇄적인 성격을 가진다.
https://www.tuwlab.com/ece/22202
https://velog.io/@shin6403/Git-%EC%9D%B4%EB%9E%80