개발지식/git

Git 이란? - Git에 대한 이해

피노키오이 2021. 8. 6. 14:14
반응형

이번에는 실제로 대부분의 개발자들이 협업을 위해서 사용하는 Git에 대해서 알아보도록 하겠습니다.

 


Git이란?

Git을 이해하기 위해서는 우선 Version Control System이라는 것을 알아야합니다.

  • Git이란 버전 관리 시스템의 한종류입니다.
  • GIt은 형상 관리 도구중 하나입니다.
  • Git은 소프트웨어를 개발하는 기업의 핵심 자산인 소스코드를 효과적으로 관리할 수 있게 해주는 무료, 공개 소프트웨어입니다.
  • SVN보다 여러 장점이 있어 SVN을 쓰던 개발 조직들은 하나둘씩 Git으로 변화를 하고 있습니다.

 

SVN과 Git의 차이점

  • Git이 SVN과 다른 점은 분산형 관리 시스템 이라는 것입니다.
  • SVN은 중앙 서버에 소스코드와 히스토리를 저장하는 방식을 사용합니다.
  • Git은 소스코드를 여러 개발 PC와 저장소에 분산해서 저장합니다. 그렇기 때문에 중앙 서버에 장애가 발생해도 로컬 저장소에 커밋을 할 수 있으며, 로컬 저장소들을 이용하여 중앙 저장소의 복원도 가능합니다.
  • 사본을 로컬에서 관리하기 때문에 Git이 SVN에 비해 훨씬 빠른 장점이 있습니다.

 


버전 관리 시스템

각각의 Version들을 관리해주는 것을 Version Control System이라고 합니다.

 

이러한 VCS (Version Control System)은 크게 두가지로 나뉩니다.

 

1. 클라이언트-서버 모델

  • 하나의 중앙 서버가 존재하며, 여러 클라이언트들은 중앙 서버에서 각자 맡은 파트만 가져와서 작업하고, 다시 중앙으로 통합하는 것을 말합니다.
  • 대표적 시스템으로 CVS, Subversion 등이 있습니다.

 

2. 분산 모델

  • 하나의 중앙 서버가 존재하지만, 여러 클라이언트들은 각자의 컴퓨터 저장소에 중앙 서버의 전체 사본을 가지고 작업을 하는 것을 의미한다.
  • 대표적 시스템으로 Git이 있다.

 


Git의 장점 

  • 소스코드를 주고 받을 필요 없이, 같은 파일을 여러 명이 동시에 작업하는 병렬 개발이 가능하다.
  • 브랜치를 통해 개발한 뒤, 본 프로그램에 합치는 방식(Merge)으로 개발을 진행할 수 있다.
  • 분산 버전 관리이기 떄문에 인터넷이 연결되지 않은 곳에서도 개발을 진행할 수 있으며, 중앙 저장소가 날라가버려도 다시 원상복구할 수 있다.
  • 팀 프로젝트가 아닌, 개인 프로젝트일지라도 GIT을 통해 버전 관리를 하면 체계적인 개발이 가능해진다.
  • 프로그램이나 패치를 배포하는 과정도 간단해진다. (Pull을 통한 업데이트, Patch파일 배포)

 


Git의 특징

1. Distributed development

  • 전체 개발 이력을 각 개발자의 로컬로 복사본을 제공하고 변경된 이력을 다시 하나의 저장소로 복사한다.
  • 이러한 변경은 추가 개발지점을 가져와, 로컬개발 지점과 동일하게 병합(merge)할 수 있다. 
  • 저장소는 Git Protocol 및 HTTP로 쉽고 효율적(특별한 웹서버 구성없이) 으로 접근할 수 있다.

2. Strong support for non-linear development

  • 신속하고 편리한 branch 및 merge 지원, 비선형(여러갈래) 개발 이력을 시각화하고 탐색 할 수 있는 강력한 도구를 제공한다.

3. Efficient handling of large projects

  • Git은 매우 빠르고, 대형프로젝트나 이력이 많은 작업에 매우 합리적이다.
  • Git은 대부분의 다른 버전관리 시스템보다 빠르게 요청한다. (일부 작업에서는 더 빠르게 진행된다.)

4. Cryptographic authentication of history

  • Git의 이력은 성공한 개발이력의 Commit에 의해 개정명으로 저장된다. 
  • 일단 배포가 되면, 그것을 모르고 예전버전으로 변경하는 것은 불가능하다. 
  • 또한 암호화를 할 수 있다.

5. Toolkit design

  • UNIX의 전통에 따라, Git은 C로 작성된 많은 소규모 도구모음이다.
  • 많은 스크립트들이 기능 보강을 제공한다.
  • Git은 새로운 기발한 작업을 위한 손쉬운 사용과 쉬운 스크립팅을 위한 도구를 제공한다.

 


Git 과 GitHub 

 

Git : 형상 관리 도구(버전 관리 시스템)

Github : 형상 관리 도구(버전 관리) 웹호스팅 서비스

 


Git (형상관리 도구)

  • 프로젝트를 진행하면서 소스 코드를 카톡이나 USB등으로 주고받는건 엄청난 시간낭비와 보안성 위험이 있다.
  • 그렇기 때문에 프로젝트를 진행 함에 있어 형상 관리 도구를 사용 한다.
  • 형상 관리 도구를 사용하면 변경을 쉽게 되돌릴 수 있다. (Commit 되기전 Version으로 롤백이 가능)
  • 특정 시점의 변경 사항을 취소하거나, 두 버전의 소스코드를 비교하는 등의 일이 가능하다.

 


Git 웹 호스팅 시스템

  • 협업하고 있는 코드를 저장할 서버가 필요하다.
  • 버전 관리 시스템을 지원하는 웹호스팅 서비스의 기능을 통해, push, pull, request같은 이벤트에 반응하여 자동으로 작업(배포 등)을 실행하게 할 수 있다.
  • Ex) GitHub, GitLab, BitBucket

 


Git GUI

  • 너무 많은 git 명령어를 사용하기 어려울 경우 GUI를 통해 쉽게 해결 할 수있다.
  • Ex) GitHub Desktop, Source Tree, GitKraken

 


Git 관련 용어

  • Repository : 저장소를 의미하며, 저장소는 히스토리, 태그, 소스의 가지치기 혹은 branch에 따라 버전을 저장한다. 저장소를 통해 작업자가 변경한 모든 히스토리를 확인 할 수 있다.
  • Working Tree : 저장소를 어느 한 시점으로 바라보는 작업자의 현재 시점.
  • Staging Area : 저장소에 커밋하기 전에 커밋을 준비하는 위치.
  • Commit : 현재 변경된 작업 상태를 점검을 마치면 확정하고 저장소에 저장하는 작업.
  • Head : 현재 작업중인 Branch를 가리킨다.
  • Branch : 가지 또는 분기점을 의미하며, 작업을 할 때에 현재 상태를 복사하여 Branch에서 작업을 한 후에 완전하다 싶을 때 Merge를 하여 작업을 한다.
  • Merge : 다른 Branch의 내용을 현재 Branch로 가져와 합치는 작업을 의미한다.

 


Git 기초 명령어

 

git init 

  • 버전 관리 하고싶은 폴더에서 초기화를 하는 준비

git branch

  • 독립적인 공간을 만든다.
  • 새로 만든 branch lab1은 master와 완전히 동일한 상태를 가진 공간.
  • 브랜치에서 수정을 한 후 커밋하면 lab1에만 기록되며 master 브랜치에는 어떤 영향도 주지 않는다.
  • 원하는 만큼 빠르게 branch를 만들 수 있다.
  • 실험 중 다른 브랜치로 돌아가야 할 때 : checkout master 로 head를 옮겨야 한다. ( cf > 작업 중인 위치를 가르키는 가상의 커서가 존재하는데 이를 git에서는 HEAD라 한다.
  • 실험 성공 : lab1 브랜치의 내용을 마스터 브랜치와 병합(Merge) 한다.
  • 실험 실패 : lab1 브랜치를 삭제한다.

checkout

  • 독립된 작업 공간인 브랜치를 자유롭게 이동할 수 있다.

git commit

  • 의미있는 수정 작업이 끝났을 때 마침을 알리는 작업.

pull

  • 리모트 저장소의 변경된 내용은 로컬 저장소에 적용하는 작업을 pull이라 한다.

master

  • git init을 했을 때, default로 만들어지는 가지가 'master'이다.

 


add, commit, push, pull, fetch, checkout 용어에 따른 프로세스

 

반응형