본문 바로가기
컴퓨터 사이언스(CS)/기타 CS

[CS] Git의 명령어는 어떤 동작을 할까?

by char_lie 2024. 7. 31.
반응형
Git

 

Git

  • 분산형 버전 관리 시스템(VCS)의 한 종류
  • 빠른 속도로 업무처리하는데 중점을 둔 시스템
  • 복사, 백업, 저장 등의 역할 수행

 

VCS(Version Control system)

  • 시간에 따라 파일 변화를 기록하고 특정 시점의 버전을 찾아 사용할 수 있는 시스템
  • 동시에 작업할 경우 발생할 수 있는 충돌 문제를 해결해줌
  • 여러 명이 동시에 작업하는 병렬 개발 가능
  • 분산 버전 관리이므로 인터넷이 연결되지 않은 곳에서도 개발 가능

출처 : https://dev.to/mollynem/git-github--workflow-fundamentals-5496

동작 순서

  • 작업 디렉토리에 있는 파일을 add 명령어를 통해 staging 영역으로 전달
  • staging 영역에 저장된 파일은 commit 명령어를 통해 local repository로 커밋 파일을 저장
  • local repository에 있는 메타 데이터 및 데이터 정보가 push 명령어를 통해 원격 repository에 저장

※ 질문 받은 부분

Git add 명령어의 동작

  1. 작업 디렉토리와 인덱스 디렉토리로 나누어 동작
  2. add 명령어를 받으면 파일 상태를 확인
    • Untracked : 새롭게 생성된 파일
    • Modified : 마지막 커밋 이후 변경된 파일
    • staged : 인덱스에 추가되어 다음 커밋에 포함될 파일.
  3. 인덱스에 추가하기 전에 SHA-1 해시를 계산하여 고유 식별자로 사용
    • 해시를 기반으로 Blob객체를 만들어 파일 내용과 함께 git의 객체 데이터베이스에 저장
  4. Blob 객체를 기반으로 인덱스 업데이트
    • Blob 객체가 생성되면 인덱스 파일(.git/index)를 업데이트 하여 파일 경로와 해시 값 저장
    • 인덱스 파일은 특정 형식을 가진 바이너리 파일

Git commit 명령어의 동작

  1. 현재 인덱스의 상태를 확인
  2. 사용자가 입력한 커밋 메시지를 수집
  3. 인덱스를 바탕으로 트리 객체를 생성
    • 인덱스의 모든 항목을 기반으로 디렉토리 구조 작성
    • 각 디렉토리에 대해 트리 객체를 생성하고, 각파일에 대해 블롭 객체 생성
  4. 트리 객체를 git의 객체 데이터베이스(.git/object)에 저장
  5. 커밋 객체를 트리 객체의 해시, 부모 커밋의 해시, 작성자 정보, 커밋 메시지 등을 포함한 커밋 객체 생성
  6. 커밋 객체를 git의 객체 데이터베이스(.git/objects)에 저장
  7. 현재 브랜치가 새로운 커밋을 가리키도록 참조를 업데이트

Git log 명렁어의 동작

  1. 현재 브랜치의 HEAD를 확인하여 브랜치가 가리키는 최신 커밋을 git의 HEAD에서(.git/HEAD) 찾음
  2. HEAD가 가리키는 커밋의 해시 값을 기반으로 해당 커밋 객체를 Git 객체 데이터베이스(.git/object)에서 역방향으로 탐색
  3. 부모 커밋의 해시를 추적하며 반복해서 값을 읽고, 커밋 히스토리를 역방향으로 탐 
반응형

댓글