Git이란?
Git은 개발자에게 필수적인 버전관리시스템이다.
Svn(Apache Subversion)이 중앙집중식 버전관리 시스템이라면 Git은 분산 버전관리 시스템이다.
버전관리시스템이란?
버전 관리 시스템은 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이다.
저장소(Repository)라고 하는 데이터베이스에 파일의 변경내용을 지속적으로 기록하고 복구할 수 있도록 도와주는 시스템을 말한다.
중앙집중식 버전관리 vs 분산 버전관리
중앙집중식 유형은 버전관리를 중앙 서버에서 진행을 한다. 그래서 온전한 버전의 전체 이력 관리는 서버에서만 확인을 할 수 가 있다. 로컬에서는 버전 관리 정보는 없이, 특정 버전의 소스 파일들만 존재한다.
Svn 기본 업무 프로세스
1. svn 원격 프로젝트 레포지토리에서, 로컬 프로젝트 폴더로 CheckOut을 수행한다.
[원격 레포지토리의 최신(lastest) 버전의 소스 파일들이 로컬로 내려받아진다.]
2. 기능 개발 후, SVN이 자동으로 인지한 수정/추가/삭제된 파일에 한해서, Comment와 함께 Commit을 수행한다.
- svn은 버전관리를 중앙서버 하나에서 수행하기 때문에, 바로 원격 레포지토리에 반영된다.
- Commit하는 순간, 중앙 원격 버전관리시스템의 최종본이 되므로, 신중해야할 필요성이 있다.
- 만약 Commit 했는데 충돌이 일어나서 실패했을 경우
(1) 충돌난 파일을 Revert (변경사항 취소하고, 이전 Commit 버전으로 Rollback) 한다.
(2) Svn Update 해서 최신 파일 버전을 가져온다.
(3) 자신이 변경한 사항과 중앙서버에서 받은 최신 버전과의 충돌 원인을 파악하여 수정한다.
(4) 다시 해당 파일에 변경사항을 다시 추가 반영한 후, Commit을 수행한다.
3. 내가 작업하는 동안에 다른 사람이 작업해서 Commit을 통해 중앙서버에 수정/추가/삭제된 파일들을 로컬 프로젝트에 반영해야 된다면, Svn Update를 수행해서 최신 버전을 로컬에도 반영한다.
분산 버전 관리의 동작 방식
분산 버전관리는 버전관리를 중앙서버뿐만 아니라 로컬에서도 진행한다. 로컬에서 버전관리를 하다가, 중앙 서버의 버전 관리로 합치는 형식으로 되어 있다.
- svn은 로컬에서 특정 버전의 파일만 가지고 있으므로, commit은 바로 중앙서버에 원격 레포지토리의 최신 버전으로 반영한다는 의미이다.
- git은 로컬에서 버전 관리 시스템을 가지고 있으므로, 로컬에서 여러번 commit 할 수 있다.
(git clone 또는 git pull 또는 git fetch 해왔을 당시에 원격 레포지토리의 최신 버전 정보가 로컬 레포지토리에 모두 저장된다.)
- git은 나중에 로컬에서 진행한 commit들(수정/추가/삭제된 소스에 대한 버전 관리 정보)을 원격 레포지토리의 버전 관리 시스템에 반영 (git push 또는 branch 전략을 사용할 경우 mr을 통한 git merge) 할 수 있다.
쉽게 설명하면 분산 버전관리 시스템은 중앙집중식 버전관리시스템의 온전한 내용을 통째로 로컬저장소들에도 가지고 있고 동일하게 서버에도 가지고 있는 형태 입니다.
분산 버전관리 시스템은 기본적으로 버전관리를 로컬해서 한다고 생각하면 된다. 로컬 버전관리 시스템도 중앙집중식 버전관리시스템의 내용을 통째로 가지고 있다.
Git 기본 업무 프로세스
1. git clone [--branch develop] <git 원격 레포지토리 url> 또는 git pull 명령어를 통해, 로컬 git 레포지토리를 생성하고 원격 레포지토리의 최종본을 다운로드 받는다.
- 단순하게 원격 레포지토리의 최종본을 다운로드 받는 것은 단순하게 로컬에 특정 버전의 파일만 다운로드 받는 것이고, git clone은 로컬에서도 버전관리가 가능하도록 로컬 git 레포지토리가 생성하는 것이 큰 차이이다.
- 로컬 git 레포지토리가 생성된다는 것은 지금까지 원격 레포지토리에서 관리되던 버전 내용과 최종본을 통째로 내려받는다는 의미이다.
- 로컬 git 레포지토리가 생성되었는지를 확인하려면 대상 소스 폴더에 숨김처리로된 .git 파일이 존재하는지 확인하자
2. 로컬에서 작업 후, 세부기능이 추가될 때마다 git commit [-m 커밋 내용]을 여러번 수행함으로 로컬 최종본에 반영한다.
- commit 명령어가 svn에서는 서버로 올리는 것이지만 git에서는 로컬의 최종본으로 저장하는 명령어가 되는 것이다.
(git에서 서버에 올리는 명령어는 git push 를 추가로 실행해 줘야 합니다.)
2-1. git push 전에 git fetch 또는 pull 수행
git branch 전략 사용 시, git checkout <원격 src branch명> & git pull & git checkout <로컬 branch명> &
git merge <원격 src branch명 - 작업 중인 로컬브랜치가 어떤 원격브랜치에서 분기했는가?>
(로컬 저장소에 commit 하는 동안 원격 저장소에 추가 반영된 버전 정보를 로컬 저장소의 추가 반영된 버전 정보에 병합한다. 로컬 저장소는 원격 저장소의 최신 버전 내용과 로컬 저장소에서 추가 반영한 내용이 함께 반영된 상태가 된다. )
(로컬 최종본을 원격에 반영하기 전에, 버전 관리 정보 충돌(git conflict)을 로컬에서 미리 해결하기)
3. 로컬에서, 추가 기능을 구현 완료했고 팀원들이나 다른 공동작업자들과 공유를 해야 할 때, git push를 해서 원격저장소에 업로드를 하는 방식으로 진행을 한다.
git branch 전략 사용 시, git push 후 <원격 src branch>에 대한 Merge 요청
- 오랫동안 git push를 안했을 경우, 그 동안 팀원들이 먼저 git push해서 반영된 원격 레포지토리 최종본에 충돌되는 파일이 있을 수 있다.
- 그러므로 먼저, git fetch 또는 git pull을 통해, 현재 원격 레포지토리 버전관리 최종본과 로컬 레포지토리 버전관리 최종본 사이의 버전관리상 충돌이 있는지 체크하고, git push를 진행한다.
분산 버전관리 시스템의 장점
- 원격저장소가 어떠한 이유로 인해 날라가거나 파괴가 되어도 로컬저장소를 다시 복사만 하면 복원이 가능
- 인터넷이 되지 않는 상황에서도 버전관리를 할 수 있음 (버전관리가 로컬에서 이루어질 수 있기 때문)
- 일단 내 컴퓨터에서만 작업을 하는 것이므로 심리적인 안정감이 있음 (svn은 commit할 때 신중해야 하는 것과 반대됨)
- 하다가 잘 안되면, 다 날리고 git pull로 가져와서 다시 시작하면 됨
git 클라이언트란?
분산버전관리시스템인 git을 사용하려면 먼저 git 프로그램을 설치해야 한다 - https://git-scm.com/
git 클라이언트란 svn의 tortoise SVN이라는 프로그램이 있듯이, git에 대해 GUI형태로 쉽고 편리하게 명령어를 실행시키게 해주는 도구라고 보시면 된다.
1. SourceTree
2. TortoiseGit
git 서버란?
로컬컴퓨터에서만 사용할 경우에는 git만 설치하여 사용하면 되지만 원격저장소를 통해서 여러사람과 사용하기 위해서는 git서버가 있어야 한다. 즉 git 원격 레포지토리를 관리할 수 있는 서비스를 의미한다. 설치형 서버를 만들 수도 있겠지만, 보통은 아래의 3개 서비스들을 주로 이용한다.
서비스명 | ||
GITHUB | 무료로 사용 가능하나 소스가 공개 | https://www.github.com |
GITLAB | 무료로 무제한 사용가능 | https://about.gitlab.com |
Bitbucket | 저렴한 가격에 사용가능 | https://bitbucket.org |
Bonobo | Git Server 설치형 | |
git서버(Win) | https://bonobogitserver.com | |
gogs | 설치형 git서버 (Linux/Win/Mac) | https://gogs.io |
gitea | 설치형 git서버 (Linux/Win/Mac) | https://gitea.io/en-US |
출처
- https://uxgjs.tistory.com/78?category=832417 [UX 공작소]
'[DEV] Programming Tools > Version Management ∕ Git' 카테고리의 다른 글
[Git] Feature 브랜치 작업 과정 (0) | 2021.07.16 |
---|---|
[Git] 깃플로우 개념 (0) | 2021.07.14 |
[Git] 프로젝트 초기 작업 (0) | 2021.07.14 |
[Git] 핵심 명령어 정리 (0) | 2021.07.14 |
최근댓글