yooniiverse
개발 블로그
yooniiverse
전체 방문자
오늘
어제
  • 분류 전체보기
    • 운영체제
    • 네트워크
    • ~2023.02
      • 외부교육
      • 대외활동
      • 스터디
      • 동아리
      • TIL
      • IT지식
      • 기타
      • 트러블 슈팅
      • 프로그래밍
      • Python
      • Java
      • JS
      • DB(SQL)
      • JSP
      • Spring
      • 기술면접
      • 자바
      • 코딩테스트
      • 자료구조
      • 알고리즘
      • 백준 문제풀이
      • 인공지능
      • 머신러닝
      • 프로젝트
      • 안드로이드 앱개발
      • 웹개발
      • 웹 서비스
      • 웹퍼블리싱
      • Node.js 백엔드 개발
      • CS
      • 1일 1CS지식
      • 운영체제
      • 네트워크
      • 데이터베이스
      • 정보처리기사
      • 도서 리뷰
      • 개발 관련 도서
      • 기타 도서

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
yooniiverse

개발 블로그

Git
~2023.02/기타

Git

2022. 1. 19. 21:06

Git의 3가지 작업 영역

더보기

내용을 수정한 파일 중 커밋에 반영하고 싶은 파일을 git add를 해야 한다고 했다.

 

Git은 내부적으로 크게 3가지 종류의 작업 영역을 두고 동작한다.

각 작업 영역의 이름은 아래와 같다.

  1. working directory
  2. staging area
  3. repository

첫 번째 작업 영역인 working directory는 작업을 하는 프로젝트 디렉토리를 말한다. 지금 상황에서는 MathTool 디렉토리가 working directory이다.

두 번째 작업 영역인 staging area는 git add를 한 파일들이 존재하는 영역이다. 커밋을 하게 되면 staging area에 있는 파일들만 커밋에 반영된다.

세 번째 작업 영역인 respository는 working directory의 변경 이력들이 저장되어 있는 영역이다. 즉 커밋들이 저장되는 영역이라는 뜻인데, 조금 풀어서 설명해보면

  • working directory에서 뭔가 작업을 하고,
  • 작업한 파일들을 git add 해주고,
  • 커밋을 하면 staging area에 있던 파일들의 모습이 마치 영화의 한 장면, 스냅샷 처럼 이 repository에 저장되는 것이다.

그리고 실제로는 MathTool 디렉토리 안에 숨겨져 있던 .git 디렉토리가 repository이다.

 

왼쪽부터 순서대로 working directory, staging area, repository가 있다. 다음과 같은 작업을 한 상태를 나타내는 그림이다.

  1. working directory에서 A.txt 파일과 B.txt 파일을 작성하고
  2. git add A.txt와 git add B.txt를 실행해서 A.txt, B.txt 둘 다 staging area에 올렸다.
  3. 그다음 git commit -m "Ver_1"를 실행해서 staging area에 있는 파일들을 가져와 커밋으로 남겼다.

Git에서 커밋을 할 때 어떤 식으로 일이 진행되는 것인지 조금 이해가 될 것이다. 작업을 조금 더 해보자.

이전 그림에서 작업을 좀 더 하고 나서의 모습인데, 다음과 같은 작업을 추가적으로 해주었다.

  1. working directory에서 A.txt 파일 내용에 Python~이라는 단어를 추가, B.txt 파일 내용에 Morning이라는 단어를 추가했다.
  2. 그런데 이번에는 git add B.txt만 실행해서 B.txt 파일만 staging area에 올렸다.
  3. 그다음 git commit -m "Ver_2"로 두 번째 커밋을 했다.

이전 그림과 다른 점은 A.txt는 staging area에 올리지 않고, B.txt만 staging area에 올렸다는 점이다. 그랬더니 지금 repository에서 그 결과가 어떠한가? Ver_2 커밋을 보면 지금

  • A.txt는 staging area에 있던 모습, 그러니까 수정하기 이전의 모습이 Ver_2 커밋에 반영되었고
  • B.txt도 staging area에 있던 모습, 하지만 A.txt와는 달리 수정한 이후의 모습이 Ver_2 커밋에 반영되었다.

aA.txt, B.txt 둘 다 working directory에서 수정했다는 사실은 같지만, staging area에 올렸는지 여부에 따라 그 최신 모습이 커밋에 반영되는지가 달라지는 것이다. 바로 이 점이 Git을 사용할 때 잘 알고 기억해야 하는 부분이다.

 

그런데 staging area가 굳이 왜 필요할까? working directory에서 작업을 하고 git add할 필요 없이 바로 커밋해버리는 구조가 더 편할 것 같은데 말이다.

하지만 꼭 그렇지는 않다. 방금처럼 A.txt와 B.txt 파일을 둘 다 수정했더라도 두 파일 모두 그 최신 모습을 다음 커밋에 반영하고 싶지 않을 수도 있다. 방금처럼 B.txt의 최신 모습만 그 다음 커밋에 반영하고 싶을 수도 있는 것이다.

이런 상황은 실제로 꽤 자주 있다. 만약 staging area가 없다면 원하는 것들만 선별적으로 커밋에 반영할 수 없게 된다. 그럼 좀 더 세밀한 버전 관리를 할 수 없게 되는 것이다.

 

참고로 working directory는 working tree라고 하기도 하고, staging area는 index라고 할 때도 있다!

 

Git 써보기 정리노트

지금까지 배운 커맨드들을 정리해보자.

  • git init : 현재 디렉토리를 Git이 관리하는 프로젝트 디렉토리(=working directory)로 설정하고 그 안에 레포지토리(.git 디렉토리) 생성
  • git config user.name 'codeit' : 현재 사용자의 아이디를 'codeit'으로 설정(커밋할 때 필요한 정보)
  • git config user.email 'teacher@codeit.kr' : 현재 사용자의 이메일 주소를 'teacher@codeit.kr'로 설정(커밋할 때 필요한 정보)
  • git add [파일 이름] : 수정사항이 있는 특정 파일을 staging area에 올리기
  • git add [디렉토리명] : 해당 디렉토리 내에서 수정사항이 있는 모든 파일들을 staging area에 올리기 
  • git add . : working directory 내의 수정사항이 있는 모든 파일들을 staging area에 올리기
  • git reset [파일 이름] : staging area에 올렸던 파일 다시 내리기
  • git status : Git이 현재 인식하고 있는 프로젝트 관련 내용들 출력(문제 상황이 발생했을 때 현재 상태를 파악하기 위해 활용하면 좋음) 
  • git commit -m "커밋 메시지" : 현재 staging area에 있는 것들 커밋으로 남기기
  • git help [커맨드 이름] : 사용법이 궁금한 Git 커맨드의 공식 메뉴얼 내용 출력

 

    yooniiverse
    yooniiverse

    티스토리툴바