KimMK

버전 관리 툴 Git에 대한 정리 본문

Git

버전 관리 툴 Git에 대한 정리

KimMK 2023. 7. 13. 11:37

Git이란..?

  • 파일의 변경된 내용을 관리하는 버전 관리 도구
  • Git은 소프트웨어를 개발하는 기업의 핵심 자산인 소스코드를 효과적으로 관리할 수 있게 해주는 무료 공개 소프트웨어
  • SVN보다 여러 장점이 있어 기존 SVN을 사용하던 조직들이 Git으로 옮기는 추세

 

SVN과 Git의 차이

  • SVN중앙 집중식 버전 관리, Git분산 버전 관리 시스템
    • SVN은 중앙 서버에 소스 코드와 히스토리를 저장
      Git은 소스 코드를 여러 개발 PC와 저장소에 분산해서 저장
  • Git은 사본을 로컬에서 관리하기 때문에 SVN에 비해 성능면에서 우수
    SVN은 변경 로그 하나를 보는 것도 인터넷을 경유해야 함

 

중앙 집중식과 분산식 버전 관리

로컬 버전 관리(VCS)
: 오래전에 사용되었던 버전 관리 시스템으로, VCS는 아주 간단한 DB를 사용해 파일의 변경 정보를 관리

출처: Git 공식 메뉴얼 / Git - 버전 관리란? (git-scm.com)

>> 많이 사용되는 VCS 도구 중 RCS는 기본적으로 Patch Set(파일에서 변경되는 부분)을 관리합니다. 이 Patch Set은 특별한 형식의 파일로 저장하며, 일련의 Patch Set을 적용해 모든 파일을 특정 시점으로 되돌릴 수 있습니다.

 

중앙 집중식 버전 관리 (CVCS)

파일을 관리하는 서버가 별도로 있고, 클라이언트가 중앙 서버에서 파일을 받아서 사용(Checkout)을 하는 형태의 버전 관리 시스템입니다.

출처: Git 공식 메뉴얼 / Git - 버전 관리란? (git-scm.com)

>> CVCS는 사용하는 클라이언트 모두가 누가 무엇을 하고 변경했는지 알 수 있습니다. 따라서 관리자는 VCS의 모든 로컬 DB를 관리하는 것보다 중앙에 집중되어 있는 버전을 관리하기가 더욱 쉽습니다.

하지만, 이 시스템은 치명적인 결함이 존재합니다.

중앙 서버가 다운되면, 이를 사용하는 모든 클라이언트들이 다른 클라이언트와 협업, 백업하는 방법이 없습니다.

또한, 중앙 DB가 있는 하드디스크에 문제가 생기면, 프로젝트의 모든 히스토리를 잃습니다.

 

분산 버전 관리 시스템 (DVCS)

Git이 사용하고 있는 시스템으로, 저장소를 히스토리와 더불어 전부 복제(Clone)하고 서버에 문제가 생기면 이 복제물을 이용해 작업할 수 있습니다. 

출처: Git 공식 메뉴얼 / Git - 버전 관리란? (git-scm.com)

>> 대부분의 DVCS 환경에는 원격 저장소가 존재하는데, 이를 이용해 여러 사람들이 동시에 다양한 그룹과 협업을 진행할 수 있습니다. 계층 모델같은 중앙 집중식 시스템으로는 할 수 없는 워크플로를 다양하게 진행할 수 있습니다.

 

 

Git의 장점

  • 같은 파일을 여러 사람이 동시에 작업하는 병렬 개발이 가능
    Branch를 통해 개발한 뒤, 메인 프로그램에 병합하는 방식으로 개발을 진행할 수 있습니다.
  • 분산 버전 관리 시스템이기 때문에, 인터넷이 연결되지 않은 오프라인 상태에서도 작업을 할 수 있으며 중앙 저장소가 훼손되어도 다시 복구할 수 있습니다.
  • 작업된 모든 내역(Commit 내역)들이 모두 별도의 영역에서 관리되기 때문에 안전하게 프로젝트를 운영할 수 있습니다. 따라서, 팀으로 작업하는 프로젝트가 아니더라도 체계적인 개발이 가능해지고 프로그램이나 패치를 배포하는 과정도 간단해집니다. 

 

 

Git의 서비스 GitHub

Git과 GitHub가 같다고 혼동하는 사람들이 꽤나 많습니다.

Git: 버전 관리 도구

GitHub: Git에서 제공하는 웹 호스팅 서비스

즉, GitHub는 코드 저장소라고 생각하시면 되겠습니다..

Git으로 관리한 코드를 push를 통해 GitHub에 업로드하는데, Git으로 코드를 관리하고 그 코드를 저장 및 공유하는 곳이 GitHub입니다 (GitHub는 구글 드라이브와 같은 개념)

GitHub는 무료 서버 저장소를 지원하며 무료로 이용하는 대신 코드가 오픈되어 수많은 사람들이 보며 활용이 가능하고, 다른 개발자와 함께 작업할 수 있도록 환경을 제공해줍니다. 물론 private한 저장소도 지원하는데 이는 유료입니다.

 

Git의 또다른 서비스로 GitLab이 있는데 보안성을 중시하는 기업에서 코드를 올려 함께 협업하는 툴로 자신의 서버에 설치해 서버 내 private한 Git 원격 저장소를 만들 수 있는 서비스입니다.

 

 

 

Git의 구조

출처: UX 공작소 (stories.pe.kr)

개인이 작업한 것을 원격 저장소로 밀어내거나 원격 저장소에서 최신 버전을 내 작업 공간으로 가져오는 프로세스

여기서,

개인이 작업하는 공간 >> 로컬 저장소

원격 저장소로 밀어내는 작업 >> Push

원격 저장소에서 작업 공간으로 가져오는 작업 >> Pull

 

 

Git의 명령어

분류 명령어 설명
<새로운 저장소 생성> git init .git 하위 디렉토리 생성
폴더를 만든 후, 그 안에서 명령을 실행하면 새로운 git 저장소가 생성됨
<저장소 복제> git clone 원격 저장소의 내용을 통째로 다운로드/복제
<추가 및 확정>
(commit)
git add git add는 작업 디렉토리의 변경 내용을 스테이징 영역에 추가하기 위해 사용하는 Git 명령어

git add 명령어는 다음 변경(commit)을 기록할 때까지 변경분을 모아놓기 위해 사용함. 따라서, git commit 명령어를 통해 명시적으로 기록을 남기기 전까지는 아무리 git add 명령어를 많이 실행해도 Git 저장소의 변경 이력에는 영향을 주지 않음

git add<파일/디렉토리 경로>
작업 디렉토리의 변경 내용의 일부만 스테이징 영역에 넘기고 싶을 때 수정한 파일이나 디렉토리의 경로를 인자로 넘김

git add.
작업 디렉토리의 변경 내용의 일부만 스테이징 영역에 넘기고 싶을 때 .을 인자로 넘김

git add -A
작업 디렉토리 내의 모든 변경 내용을 전부 스테이징 영역으로 넘길 때는 -A을 사용
git commit git commt -m "커밋 메시지"
파일 및 폴더의 추가/변경 사항들을 저장할 때 사용 (실제 변경사항 확정)
git status 파일 상태 확인

git add 명령어를 사용할 때, 항상 함께 사용하게 되는 명령어로 작업 디렉토리와 스테이징 영역의 상태를 확인하기 위해서 사용함

Changes to be committed
이 영역은 스테이징 영역에 넘어가 있는 변경 내용을 보여줌

Changes not staged for commit
이 영역은 아직 워킹 디렉토리에 있는 변경 내용을 보여줌

Untracked files
이 영역은 아직 워킹 디렉토리에 있는 한 번도 Git 저장소가 관리한 적 없는 새로운 파일을 보여줌
<Branch 작업> git branch 독립적인 작업 공간을 생성하기 위한 브랜치 작업

git branch <브랜치 명>
새 브랜치 생성 - 로컬로 만듦

git checkout -b <브랜치 명>
브랜치 생성 및 이동

git checkout -- <파일명>
로컬의 변경 사항을 변경 전으로 되돌림

git fetch origin
원격에 저장된 프로젝트의 현 상태를 다운로드
<변경 사항 발행> git push commit한 내용(head의 변경 내용)을 원격 저장소에 올리는 작업
즉, 로컬에서 변경한 내용을 원격 저장소에 업로드

git push origin master
변경사항 원격 서버에 업로드

git push origin <브랜치 명>
생성한 브랜치를 원격 서버에 전송

git push -u <remote> <브랜치 명>
커밋을 원격 서버에 업로드
<갱신 및 병합> git pull 원격 저장소의 변경 내용을 현재 디렉토리에 가져오고(fetch) 병합(merge)

git pull <remote> <브랜치 명>
원격에 저장된 프로젝트의 현재 상태를 다운받고 현재 위치한 브랜치로 병합
git merge 브랜치의 변경사항을 다른 브랜치에 반영할 때 사용
현재 브랜치를 기준으로 병합되며, 두 브랜치가 같은 파일의 같은 곳을 수정하면 충돌이 발생함

git merge <다른 브랜치 명>
현재 브랜치에 다른 브랜치의 수정 사항 병합