본문 바로가기

Project Management/Git & Github

[Chapter 2.5] git의 기본 작동 원리 - 파일 관리 status

github logo image

 

 

이제까지 git을 통해서 파일들을 수정하고, 그것을 원격 저장소에 업데이트하는 과정을 살펴보았습니다. 여기에서 add, commit 등의 몇 가지 프로세스를 거치게 되는데 이 과정에서 git을 통해 관리되는 파일의 상태(status)에는 여러 가지 변화가 일어나게 됩니다. 이번 아티클에서는 이 파일들의 단계별 status를 살펴보고, 어떤 식으로 동작하는지를 확인해 보겠습니다. 

 

 


 

 

우선 git에서 파일이 관리되는 status는 다음과 같이 총 4개가 있습니다. 이제 차근차근 이 각각의 스테이터스가 무엇을 의미하는지 살펴보겠습니다. 

 

- 추적 안됨[untracked]
- 스테이지됨[staged]
- 수정 없음[unmodified]
- 수정함[modefied]

 

추적 안됨[untracked]은, 한 번도 커밋되지 않은 파일을 의미합니다. 예를 들어, 로컬 저장소에서 readme.txt라는 파일을 새로 생성하고 내용도 수정을 했는데 add 명령어를 통해 해당 파일을 등록하지 않은 경우라고 생각하면 됩니다. 이 상태의 파일은 add되지 않았기 때문에, 아무리 수정을 해도 반영되지 않습니다. 

 

스테이지됨[staged]은, add 명령어를 실행해 파일을 git 스테이지에 등록한 상태를 의미합니다. 이 상태부터는 포괄적으로 추적됨[tracked]상태가 되는 것이라고 생각하면 됩니다. 이제 이 파일은 git으로 관리가 시작되는 것이죠. 물론, 아직 commit은 진행하지 않았습니다. 

 

수정 없음[unmodified]는 어떤 상태일까요? '스테이지됨' 상태의 파일을 commit 하고 나면 바뀌는 상태입니다. 이제 스테이지에 있는 파일이 커밋되었으니, 해당 파일을 기준으로는 할 일이 끝난 것입니다. 이제 이 상태에서 push를 진행하게 되면, 해당 커밋은 다른 사용자도 업데이트할 수 있게 되는 것입니다. 

 

수정함[modified]는, 말 그대로 파일의 수정이나 변화가 일어난 상태입니다. 위에서 우리가 readme.txt라는 파일을 commit 후 push를 진행해서 '수정 없음' 상태로 만들었죠? 그런데 업데이트가 필요해서, 우리의 로컬 저장소 상의 readme.txt를 고치게 되면 해당 파일은 '수정함[modified]' 상태가 됩니다. 우리가 아까 말했듯이 한 번 add와 commit 작업을 진행했기 때문에, 이 readme.txt는 추적상태가 되었기 때문에 파일에 변화가 생기면 이를 감지하여 수정되었음을 인지하게 되는 것입니다. 

 

이제 위에서 '수정함' 상태의 파일을 다시 add하게 되면 '스테이지됨' 상태로 변하게 되는 것이고, 또 commit을 진행하면 '수정 없음' 상태가 됩니다. 이 과정이 반복되는 것이죠.

 

만일 중간에 새로운 파일 'index.html'이 추가되었다면? 이 파일은 처음 등장했고 한 번도 커밋이 이루어지지 않았기 때문에 '추적 안됨' 상태가 됩니다. 이 파일을 다시 add, commit을 진행하면 동일한 상태가 반복되는 것이죠. 

 

조금 복잡한 것 같지만 차근차근 읽어보면 이해가 가실 것입니다. 이해를 돕기 위해 이 과정과 status를 도식화하여 살펴보겠습니다. 

 

 


 

1. 아래와 같이 git init된 폴더에서, 처음으로 새 파일 두 개 [readme.txt] 와 [index.html]을 만들었습니다. 지금은 두 파일 모두 [추적 안됨] 상태입니다.

새 파일 두 개를 생성했습니다

 

 

 

 

2. 이제 여기서 git add를 사용해 [readme.txt]와 [index.html]을 등록했습니다. 여기까지 진행했으면, 두 파일은 [스테이지됨] 상태로 변합니다.

 

$git add를 실행했습니다

 

 

 

 

3. 여기서 commit을 실행합니다. 이제 하나의 사진이 찍혀(스냅샷) 첫 번째 커밋이 만들어졌습니다. 이제 두 파일의 상태는 커밋이 완료되었으므로 [수정 없음] 상태가 되었습니다. 그리고 여기서 push까지 진행하면 해당 커밋은 원격 저장소에 저장됩니다.

 

commit을 실행하고 즉시 수정 없음 상태가 됩니다

 

 

 

 

4. 자, 이제 중요한 부분입니다. 우리는 3번까지 진행한 상태에서 "index.html"을 수정하고 "style.css"라는 파일을 새로 만들었습니다. 그럼 index.html의 경우 [수정됨] 상태가 됩니다. style.css는 어떤 상태일까요? 새로 만들어졌기 때문에, [추적 안됨] 상태가 됩니다. 

 

 

 

5. 이제 변화가 생긴 파일이 뭐였죠? "readme.txt(수정본)"와 "style.css" 두 개입니다. 이 두 개의 파일을 add로 스테이지에 올려주고 커밋을 준비합시다. 이제 두 파일은 모두 [스테이지됨]이 됩니다.

 

 

 

 

 

6. 이제 해당 스테이지 상태에서 찰칵! 스냅샷을 또 찍습니다. commit을 실행하고, 새로운 커밋이 생성됩니다. 새로 생성된 커밋은 이전의 커밋 "기본 파일 생성"과 연결되는 히스토리를 남기게 됩니다. 당연히 파일들은 모두 [수정 없음] 상태로 변화합니다. 이제 새로운 커밋을 push해주면 원격 저장소에도 저장됩니다.