본문 바로가기
[Git]

git의 상태 영역(add → commit → push)

by 황원용 2023. 7. 31.
728x90

다시 한번 Git의 주요 기능을 상기해 봅시다.

  1. 버전 관리
  2. 백업
  3. 협업에 활용

 Git을 통해 로컬에서 파일의 버전을 관리하고 그 파일을 온라인으로 업로드하여 협업에 이용함과 동시에 데이터 백업 기능을 활용할 수 있습니다. 여기서 자연스레 드는 질문이 있습니다. 로컬에서는 Git이 파일을 어떻게 탐지하며, 어떻게 파일을 관리하는 것일까요?

 

 

위의 그림을 참고하여 간단히 설명드리겠습니다.

  • Work Space에 새로운 파일이 업로드된다고 가정하겠습니다.
    • Work Space는 로컬 레파지토리로 지정한 폴더를 말합니다.
    • Work Space는 파일을 항상 스캔하고 있습니다.
  • Work Space에 새롭게 파일을 생성하거나 기존 파일을 수정하면 git이 인지합니다. 여기서 git add 명령어를 사용하면 해당 파일은 Staging Area라는 곳으로 갑니다.
    • 이곳은 로컬 레파지토리에 의해 파일이 트래킹 되어 커밋으로 기록되기 전에 임시로 파일을 저장하는 영역입니다.
    • 한 폴더에서 다른 폴더로 옮기는 것이 아닙니다. 실제로는 해당 폴더에 그대로 남아있습니다.
    • 물리적 공간이 아닌 논리적 공간 간의 이동이라고 생각하시면 됩니다.
  • 여기서 git commit 명령어로 해당 파일을 커밋하면 로컬 레파지토리 영역으로 들어오게 되며 이후부터는 로컬 레파지토리의 트래킹(기록 저장 및 추적)을 받게 됩니다.
    • 새로 생성된 파일은 세세한 부분까지 깃이 감지하게 됩니다.
    • 기존 파일의 경우 변경 사항이 커밋 기록에 남게 됩니다.
    • 이 역시 폴더 간의 이동(물리적 이동)이 아닌 논리적 공간 간의 이동입니다.
  • 마지막으로 git push를 통해 트래킹 되고 있는 파일을 원격 레파지토리로 전송하면 원격 레파지토리에서도 해당 파일의 생성 및 업데이트를 반영하게 되는 것입니다.

 

 

깃 파일의 상태

Untracked

  • 깃이 트래킹 하고 있지 않은 파일을 말합니다.
  • 아직 commit 되지 않은 파일입니다.(Work Space, Staging area에 있는 파일)
  • 로컬 레파지토리의 자동 스캔으로 파일의 존재와 변경 여부는 파악하지만, 파일 내부의 정확한 변경 사항은 감지할 수 없는 상태입니다.

Tracked

  • 깃이 트래킹하고 있는 파일을 말합니다.
  • commit 하여 로컬 레파지토리의 관리를 받고 있는 파일입니다.
  • commit을 통해 트래킹 되며 이후에는 세부 변경 사항까지 모두 감지됩니다.

Staged

  • 파일이 add(추가)되어 Staging area에 등록된 상태를 말합니다.
    • Staging area는 로컬 레파지토리에 저장할 파일을 임시로 저장하는 영역입니다.
  • 일반적으로 Work Space에서 작업을 마친 파일을 Staging area에 모아두고 일정량의 작업을 끝내면 한 번에 commit을 통해 로컬 레파지토리에 저장합니다.

New file

  • 사용자가 git add 명령어로 Staging area로 파일을 올리면 new file이라고 나옵니다.

Modified

  • 기존에 업로드된 파일에 변경 사항이 있다는 것을 git이 감지하고 있는 상태입니다.

 

 

예시를 통해 좀 더 자세히 알아봅시다.

Work Space(Working Tree, Work Tree)

  • 우리가 로컬 레파지토리로 지정한 폴더에 새로운 파일이 생성되면 그 파일은 Git에 의해 자동으로 스캔됩니다.
  • 물리적으로는 로컬 레파지토리로 사용 중인 로컬 PC의 폴더입니다.

  • 직전 시간에 테스트한 git test라는 이름의 폴더를 들어가 봅시다.
  • 이 폴더에는 원격 레파지토리와 연동 중인 helloWorld.html이라는 파일이 들어있습니다.

 

git status

  • 터미널에서 로컬 레파지토리 경로로 들어가 git status라는 명령어를 사용하게 되면 해당 폴더의 git 상태를 확인할 수 있습니다.

  • cd 명령어를 사용하여 해당 폴더에 들어간 후 git status를 입력하였습니다.
  • 현재 branch는 main이며 아무것도 commit 된 것이 없고 working tree는 클린 하다고 나옵니다.
    • branch는 다음 시간에 알아보겠습니다.
  • 왜냐하면 지난 시간에 helloWorld.html 파일을 깃이 관리하도록 등록하고 커밋한 후에 원격 레파지토리로 업로드했기 때문에 이후에 변경 사항이 없어 클린하다고 나오는 것입니다.
  • 테스트를 위해 새로운 파일을 만들고 추가해 봅시다.

  • 텍스트 파일을 만들었습니다.

 

  • git test 폴더(로컬 레파지토리)에 넣었습니다.
  • 이제 다시 터미널에서 git status 명령어를 입력해 봅시다.

 

  • 여전히 branch는 main이며, 위와는 다르게 Untracked files:라는 이름으로 방금 폴더에 업로드한 testfile.txt가 보입니다.
  • 현재 testfile.txt 파일은 Work Space라는 논리적 영역에 있습니다.
  • (use "git add <file>..." to include in what will be committed)
    • Staging area에 파일을 올리기 위해 "git add <file>..." 명령어를 사용하라는 문구가 보입니다.
  • nothing added to commit but untracked files present (use "git add" to track)
    • Staging area에 파일을 올리려면 "git add <file>..." 명령어를 사용해야 할 것 같습니다.

 

현재 파일 상태

 

git add

  • git add .을 입력하여 해당 경로에서 Staging area에 등록되지 않은 파일을 모두 등록해 줍니다.
  • Untracked file이었던 testfile.txt가 Staging area에 올라오면서 new file로 변경되었습니다.
  • 현재 testfile.txt는 커밋되기 전 Staging area에 임시로 저장된 상태입니다.

 

현재 파일 상태

 

git commit

  • 테스트 파일을 수정하여 저장하고, 다시 git status를 입력했습니다.

 

  • git이 staging area에 등록되지 않은 변화가 있음을 감지한 것으로 보입니다.
  • 사진에는 나와있지 않지만, 다시 git add . 명령어로 변경 사항을 Staging area에 올렸습니다.

 

  • 이후에 git commit을 해봅시다.
  • commit은 기본적으로 < -m “커밋 메시지” > 추가 명령어를 통해 커밋 메시지를 입력해야 합니다.
  • commit을 했기 때문에 testfile.txt는 이제부터 깃의 관리를 받게 됩니다.

 

현재 파일 상태

 

git push

  • 마지막으로 로컬 레파지토리에서 원격 레파지토리로 업로드해 봅시다.
  • git push origin main 명령어를 통해 원격 레파지토리의 main branch에 로컬 레파지토리에 커밋된 내용을 업로드했습니다.

 

  • 정상적으로 원격 레파지토리에도 파일이 업로드되었음을 확인할 수 있습니다.

 

현재 파일 상태

  • 그림과 같이 원격 레파지토리와 로컬 레파지토리 양쪽이 동일한 최신 커밋을 가지고 있게 됩니다.

 

 

<추가> 기존에 있는 파일을 수정하여 add -> commit 하는 과정을 자세히 설명

  • 기존에 있는 파일을 수정하여 add -> commit하는 과정을 자세히 살펴보겠습니다.
  • 위 사진은 로컬 레파지토리에 존재하는 파일을 수정하고 그 결과를 git에 반영하는 과정입니다.
  • 기존 파일이 있는 경우 파일 내부를 수정하면 git이 인지합니다.(빨간색 modified)
  • add . 명령으로 staging area에 올라가면 변경 사항이 임시 저장 상태가 됩니다.(초록색 modified)
  • commit을 하게 되면 로컬 레파지토리에 완전히 기록 저장됩니다.

 

다음 시간에는 git push와 pull에 대해 자세히 알아보겠습니다.

728x90