[git]git이란 무엇인가?, git과 github의 차이

양진혁·2021년 11월 18일

git

목록 보기
1/1

git이란?

git이란 리누스 토르발스가 개발한 로컬에서 관리되는 분산버전관리시스템(DVCS: Distributed Version Control System)이다.

그렇다면 git은 어디에 쓰이는 것일까?

우리가 조별과제를 한다고 가정한다.
사람들은 각자의 역할을 맡게되고 조장은 발표 및 최종 결과물을 만들어야 한다.
조장은 각자 보낸 자료들을 취합하고 결과물을 만든다.
그 과정 중에 지속적으로 수정이 이루어지고 수정본 1, 수정본 1-1, 수정본 2, 최종결과, 최종결과 수정1등 지속적으로 많은 파일들이 생겨나고 중간 중간 조원들에게 결과물도 각각 보내줘야 한다.

이런 프로젝트 관리를 도와주는 것이 git의 역할이라고 할 수 있다.
git은 모든 파일의 변화를 기록하며 소스코드의 수정에 따른 버전을 관리한다.

여기서 버전 관리라고 부르는 것이 파일들에 대한 복사,백업,저장이라고 할 수 있다.

  • git의 장점
    • 수정시 현재코드는 나 혼자 수정하기 때문에 충돌의 염려 없이 수정이 가능하며 최종적으로 서버에 올릴 때만 신경써서 머지해주면 된다.
    • 모든 작업자가 원본을 가지고 있다.(중앙 서버의 다운시에도 원상복구가 가능하다.)
    • 빠르다.

버전관리시스템(VCS: Version Control System)

버전 관리 시스템은 문서나 설계도, 소스 코드 등의 변경점을 관리해주는 소프트웨어이다.

버전관리시스템은 세가지 시스템이 존재한다.

  • 로컬 버전관리 시스템

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

  • 중앙집중식 버전관리 시스템

프로젝트의 메인 버전을 하나의 중앙서버에 저장할 수 있고, 각 팀 구성원은 프로젝트의 특정 버전을 받아 올 수(checkout) 있다. 프로젝트에서 필요한 변경 사항을 업데이트한 후 각 구성원은 변경 사항을 중앙 저장소에 다시 저장(check in) 할 수 있으며, 나머지 팀원들이 새 업데이트를 이용할 수 있다.

대표적인 것으로는 CVS, Subversion 등이 있다.

  • 장점

    • 팀 구성원 간의 파일 공유가 가능하다.

    • 프로젝트가 보다 안정적인 서버(클라우드)에 저장된다.

    • 관리자가 저장소의 사용 및 구조를 제어할 수 있다.

  • 단점

    • 서버에 장애가 발생하면 변경 사항을 사용할 수 없음
    • 다른 사용자의 업데이트로 인한 파일 충돌
  • 분산 버전관리 시스템

    하나의 중앙 서버가 존재하는 것은 동일하지만, 여러 클라이언트들이 각자의 컴퓨터 저장소에 중앙 서버의 전체 사본을 가지고 작업을 하는 것을 의미한다.

    대표적인 것으로 git이 존재한다.

  • 장점

    • 신뢰할 수 있음(모든 사용자가 모든 버전의 사본을 가지고 있음)
    • 중앙서버가 다운돼도 내용이 남아있기에 안정성이 높다.
    • 다양한 그룹과 협업이 가능하다.
  • 단점

    • 사용/설정이 더 까다롭다.
    • 로컬 컴퓨터에 과부하가 올 수 있다.

git의 주요 용어

저장소(Repository)

소스코드가 저장되어 있는 여러개의 브랜치(Branch)들이 모여 있는 디스크상의 물리적 공간을 의미한다.
git은 저장소가 로컬저장소(Local Repository)와 원격 저장소(Remote Repository)로 나뉜다.
작업시 원격저장소에서 로컬 저장소로 소스코드를 복사해서 가져오고, 소스코드를 변경한 다음 커밋을 한다. 이때 커밋한 소스는 로컬저장소에 저장되며, 푸시 하기 전에는 원격 저장소에 반영되지 않는다.

커밋(Commit)

작업한 내용을 로컬 저장소에 저장하는 과정이다. 각각의 커밋은 의미 있는 변경 단위이며, 변경에 대한 설명을 커밋 로그에 남긴다. 대게 하나의 커밋은 하나의 주제로 묶을 수 있는 변경단위가 된다.
프로젝트 팀에 따라 커밋을 하는 단위가 서로 다르고 커밋 로그의 작성 형식도 다르다. 만약 원격 저장소와 연결된 자동화 시스템을 사용한다면 시스템이 인식할 수 있도록 엄격한 형식에 맞춰 커밋 로그를 작성해야 할 수도 있다.

브랜치(Branch)

커밋을 단위로 구분된 소스코드 타임라인에서 분기 후 새로운 커밋을 쌓을 수 있는 가지를 만드는 것 혹은 그 가지를 브랜치라고 한다.
브랜치는 개발의 주축이 되는 마스터브랜치(Master Branch)가 존재하며 모든 브랜치는 마스터 브랜치에서 분기 후 최종적으로 다시 마스터 브랜치에 병합되어 개발이 진행된다.

체크아웃(Checkout)

특정 시점이나 브랜치의 소스코드로 이동하는 것을 의미한다. 체크아웃을 통해 과거 여러 시점의 소스코드로의 이동이 가능하며 체크아웃 대상은 브랜치, 커밋, 태그이다.

스테이지(Stage)

임시저장 영역으로 작업한 내용이 올라간다. 이것을 이용해 작업한 내용중 커밋에 반영할 파일만 선별 후 커밋 수행이 가능하다.

태그(Tag)

커밋의 임의적인 위치를 쉽게 추적할 수 있도록 붙여놓은 이정표이다. 태그가 붙여진다면 커밋의 ID 대신 태그명을 입력하여 체크아웃이 가능하다.

풀(Pull)

원격 저장소에 있는 내용중 로컬저장소에 반영되지 않은 내용을 가져와 로컬 저장소에 저장하는 과정을 의미한다.

푸쉬(Push)

로컬 저장소의 내용중 원격 저장소에 반영되지 않은 커밋을 원격 저장소로 보내는 과정을 의미한다.

병합(Merge)

하나의 브랜치를 다른 브랜치와 합치는 과정을 의미한다.
머지에는 fast-forward merge, 3way merge, 2way merge등 다양한 개념이 존재한다. 그 중 기본은 두개의 브랜치를 합쳐 하나의 브랜치로 만드는 3way merge이다.
병합되는 브랜치는 주종관계가 성립한다. 그렇기에 A를 B에 병합, B를 A에 병합 하는 작업은 서로 다른 작업이다.
병합도 커밋의 한 종류로 3way merge는 서로 다른 두 커밋으로부터 하나의 새로운 커밋을 생성하는 작업이다.

git 기초

git의 세가지 상태

  • Committed
    수정된 사항들이 git에 저장된 상태를 committed라고 하며 이러한 행위를 commit이라 한다.
  • Modified
    수정된 file을 의미한다. 하지만 아직 committed 되지 않은 상태의 file을 의미한다.
  • Staged
    modified에서 한단계 더 나아가 곧 commit 될거라고 mark 해놓은 것이다. modified와 committed의 중간단계이다.

git을 사용한 버전관리 흐름

  • Working Directory
    현재 작업죽인 Git 프로젝트 파일이 있는 내PC의 디렉토리, 평소 작업하듯 자유롭게 프로젝트 작성 가능
  • Staging Area
    커밋할 변경내역들의 대기장소 add 명령어를 사용해 Working Directory 변경내역을 이곳에 올릴 수 있다.
  • Local Repository
    커밋들이 스냅샷으로 기록된 곳 commit 명령어를 사용하면 Staging Area의 변경내역들이 스냅샷으로 묶어 이곳에 올릴 수 있다.
    -Remote Repository
    로컬PC를 넘어 원역 서버에 관리되는 저장소 이곳에 올라온 커밋은 다른사람들도 참조 가능하다. 커밋 단위로 해당 버전의 프로젝트를 내려받는 등 행위가 가능하다. 로컬 파일이 손상되더라도 외부 저장소이기 때문에 올라온 기록은 따로 유지 가능하다.

git 기초 명령어

  • git init
    현재 디렉토리 깃 초기화, 폴더 이름을 적시할 시 디렉토리를 새로 만드는 동시에 깃 초기화
  • git add
    수정한 파일을 스테이징한다. 만약 .을 사용한다면 모든 파일을 뜻하는 것이다.
  • git commit
    • git commit -m
      커밋 메시지 메시지명을 붙여 커밋
    • git commit -a-m
      메시지 메시지명을 붙여서 스테이징과 커밋을 동시에 진행
  • git diff
    어떤 수정사항들이 적용되었는지 보여주는 명령어
  • git status
    현재 상태를 보여주는 명령어
  • git log
    커밋 내용 살펴보기, 버전이 제대로 만들어졌는지 확인할때 사용
  • git rm
    원하는 파일을 git repo에서 삭제함
  • git mv
    원하는 파일을 git repo 상에서 이동시킬때 사용한다.
  • git branch
    Branch를 생성할 때 사용하는 명령어
  • git checkout
    어떤 branch를 check out할 때 사용한다.

git 관련 웹 기반 솔루션

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

이러한 서비스를 제공하는 대표적인 예가 GitHub와 GitLab 등을 들 수 있다.

  • GitHub
    GitHub의 경우 공개적으로 사용 가능한 무료 서비스로 유료계정이 없는 경우 모든 코드를 공개해야 한다. 누구나 GitHub에 푸시한 코드를 보고 개선을 위한 제안을 제공할 수 있다.
    GitHub은 주로 오픈소스 프로젝트에서 많이 사용된다.즉 개방적인 성격을 가진다.

  • GitLab
    GitLab은 개인 혹은 조직이 깃 리포지토리의 내부 관리를 제공하는데 사용할 수 있는 서비스이다.GitLab은 중앙 서버에서 깃 저장소를 관리하는 방법으로 리포지토리 또는 프로젝트를 완벽하게 제어할 수 있으며 공개 또는 비공개 여부를 무료로 결정할 수 있다.
    GitLab은 주로 기업체 등에서 인트라넷에 설치하여 많이 사용한다. 즉 폐쇄적인 성격을 가진다.

References and Image

https://www.tuwlab.com/ece/22202

https://velog.io/@shin6403/Git-%EC%9D%B4%EB%9E%80

https://tech.10000lab.xyz/git/git-cheat-sheet.html

https://www.secmem.org/blog/2019/04/10/git_pr/

0개의 댓글