Git

2022. 3. 15. 14:50git

버전 관리 시스템

배경

  • 너무 많은 복사본이 있어서 어떤 것이 최신 파일인지, 어떤 버전이 어떻게 수정되었는지 알기 어려움
  • 코드 원상 복구가 어려움
  • 여러 명이 동시에 작업을 할 때, 충돌 오류 발생
  • 여러 명이 동시에 작업을 할 때, 누가 어떤 부분을 어떻게 수정했는지 알 수 없음

 

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

 

분산식 버전 관리 시스템

 

  • server에서 소스코드, 변경 이력 등 모든 정보를 통으로 받아옴
  • 각 클라이언트들이 모두 서버의 백업본을 가짐
  • 중앙 집중식 버전 관리 시스템에 비해 복잡하고 동기화 문제가 있음
  • 여러 사람이 동시에 작업하는 병렬 개발이 가능
  • 프로젝트를 복사해 로컬 환경에서 마음껏 테스트 가능
  • Git, Mecurial, Bazzar이 대표적

 


Git

  • 소스 코드를 효과적으로 관리하기 위해 개발된 분산형 버전 관리 시스템
  • 원래는 Linux 소스 코드를 관리할 목적으로 개발됨
  • 업데이트 이력이 git에 저장되어 백업용 파일 복사본을 만들 필요 없음
  • 소스 코드 변경 이력을 쉽게 확인할 수 있음
  • 특정 시점에 저장된 버전과 비교 가능, 특정 시점으로 되돌아갈 수 있음
  • 상용 git 서버 - github, Bitbucket, GitLab, Visual Studio Team Services

snapshot

  • 특정 시점에서의 파일, 폴더 또는 워크스페이스의 상태
  • 스냅샷을 통해 특정 시점에 어떤 파일에 어떤 내용이 기록되어 있었는지, 폴더 구조는 어떠했는지, 어떤 파일이 존재했었는지 등 저장소의 모든 정보를 확인할 수 있음
  • 파일에서 변경된 부분을 찾아 그 부분만 저장
  • HEAD가 가리키는 commit을 기반으로 사진 찍음 --> 인덱스(staging area)와 비교하여 새로운 커밋으로 기록
  • 빠르게 버전의 차이점을 처리, 용량을 적게 사용

Git Repository

  • 파일이나 폴더를 저장해 두는 곳
  • 파일이 변경 이력 별로 구분되어 저장됨

 

원격 저장소(Remote Repository):

  • 파일이 원격 저장소 서버에서 관리됨
  • 여러 사람이 함께 공유하기 위한 저장소

 

로컬 저장소(Local Repository): 

  • 내 PC에 파일이 저장되는 개인 전용 저장소

오프라인 상태에서도 버전 관리 가능


Commit 

  • 파일 및 폴더의 추가/변경 사항을 저장소에 기록하기 위해 사용
  • 이전 commit상태부터 현재 commit상태까지 변경 이력이 기록된 커밋이 만들어짐
  • 커밋을 거슬러가면 과거 변경 이력과 내용을 알 수 있음
  • 각 커밋은 고유 이름이 붙음 - 영문/숫자 40자리
  • 메시지를 필수로 입력해야 함

 

  • 메시지 형식

1줄: 커밋 내의 변경 내용을 요약

2줄: 빈칸

3줄: 변경한 이유

 

HEAD와 STAGE 영역간의 차이를 비교하여 새로운 객체를 생성

 


File Status LifeCycle

파일의 lifecycle

 

 

  • Tracked(관리 대상): 이미 한번 이상 커밋되어 스냅샷에 포함되어 있는 파일, '수정'단위로 관리됨
  • Unmodified: 수정하지 않음
  • Modified: 수정함
  • Staged: 커밋하면 저장소에 기록됨
  • Untracked(비 관리 대상): Tracked이외의 파일. '추가'단위로 관리됨, 특정 파일이나 디렉토리를 Git관리 목록에서 제외할 수 있음


작업 트리(Work Tree)

git에서의 폴더, 우리가 작업하고 있는 폴더

인덱스(Index) - Staging Area

  • 커밋을 실행하기 전의 저장소와 작업 트리 사이에 존재하는 (가상의)공간
  • 저장소에 변경 사항을 기록하기 위해서 기록하고자 하는 모든 변경 사항들이 인덱스에 존재해야 함
  • 작업 트리 안에 있는 커밋이 필요 없는 파일들을 커밋에 포함시키지 않음
  • 파일에서 내가 원하는 일부 변경 사항만 인덱스에 등록해 커밋할 수 있음

출처: https://velog.io/@polynomeer/Git%EC%9D%98-%EA%B8%B0%EB%B3%B8


출처

https://backlog.com/git-tutorial/kr/intro/intro1_1.html
https://heekangpark.github.io/git/vcs
https://planbs.tistory.com/entry/Git-%EC%9E%91%EC%97%85-%ED%8A%B8%EB%A6%AC%EC%99%80-%EC%9D%B8%EB%8D%B1%EC%8A%A4
https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%99%80-Merge-%EC%9D%98-%EA%B8%B0%EC%B4%88
https://www.lainyzine.com/ko/article/git-stash-usage-saving-changes-without-commit/
https://velog.io/@kwonh/Git-Rebase%EB%9E%80
https://hajoung56.tistory.com/5
https://math-coding.tistory.com/178
https://www.nobledesktop.com/learn/git/what-is-git
https://goddaehee.tistory.com/217
https://niklasjang.tistory.com/21

'git' 카테고리의 다른 글

Git 명령어 모음  (0) 2022.03.17