git 저장소 이해하기

0
77

git 에서 말하는 공간의 종류


git 에서는 여러가지 공간이 나온다. 그 중에서 가장 기본적인 세가지 공간에 대해서 먼저 알아보자.

  • Working directory  :  git 작업을 수행하는 폴더를 말한다.
  • Staging Area (= index) : commit 하기 전에 사용하는 임시 공간이다.
  • Repository : git 이 관리하는 파일에 대한 정보를 저장하는 DB 와 같은 저장소 역할을 한다.

 

그림0. git 에서 사용되는 대표적인 공간 세가지.

 

워킹 디렉토리에서 파일의 종류


워킹 디렉토리(Working directory)에 존재하는 파일은 크게 추적상태(Tracked) 상태와 비추적상태(Untracked)로 구분된다. tracked 상태는 말 그대로 git 이 해당 파일의 존재를 인식한 상태를 의미한다. 그리고 git 이 인식 하지않고 있는 파일은 전부다 Untracked 상태라고 한다. 워킹 디렉토리 내부에 있는 파일을 tracked 상태로 만들고 싶다면 해당 파일을 commit 하면 된다.

그림1. Working directory 에 있는 파일은 크게 Tracked 와 Untracked 파일로 나눠진다.

그럼 비어있는 폴더를 Working directory로 초기화하자. 그리고 vim 에디터를 통해서 파이썬 코드를 하나 생성하겠다. 이름은 test.py 로 했다. 아래와 같이 코드를 작성하고 저장하자. (이 내용을 모르다면 이전 포스트를 확인하자.)

그림2. vim test.py 으로 파일을 생성하자.
그림3. 코드를 작성하고 저장하자.

위에서 새롭게 파일을 만들었으니 test.py 파일을 관리 할 수 있게 commit 해보자. git commit 명령어를 실행하면 아래 그림4 와 같이 noting added to commit …  출력되는데 commit 에 실패했다는 의미이다.

그림4. git commit 에 실패.

 

commit 과 add


Untracked 파일을 commit을 하는 과정을 생각해보자. 앞서 배운것과 같이 워킹 디렉토리 내에서 새롭게 추가된 파일은 Untracked 파일로 취급된다. 그렇다면 해당 파일을 git 으로 관리하기 위해서는 commit 을 수행해야한다. 하지만 Untracked 상태의 파일을 바로 commit 할 수는 없다. 반드시 commit 이전에 해야하는 작업이 있다. 바로 add 명령어이다. 바로 commit 을 수행하면 될 것을 왜 중간에 add 라는 작업을 한번 더 수행해야 하는 것일까?

그림5. Untracked 파일을 바로 commit 할 수는 없다.

 

tracked 파일의 상태


위에서 commit  못한 이유를 알기 위해서는 알아야 하는 개념이 있다. 바로 Staging Areatracked 파일의 상태이다. 우선 tracked 상태의 파일은 크게 세가지 상태로 나눠진다.

  • Modified
  • Unmodified
  • Staged
그림6. tracked 파일의 세가지 상태

Unmodified 상태는 말 그대로 수정돼지 않았다는 의미이다. 정확한 의미는 git이 관리하고 있는 tracked 파일 중에서 이전 commit 에서 아무런 변동이 없는 파일을 의미한다. 반면 Modified 상태는 tracked 상태의 파일이 이전 commit 상태와 다른 변동이 있다는 것을 의미한다.

이렇게 변경된 파일은 반드시 commit 해야 git이 파일의 변화를 관리 할 수 있다. 하지만 수정한 파일도 바로 commit 할 수 없다. 반드시 add 를 사용해서 Staged 상태로 변경하고 commit 이 가능하다.

 

Staging Area 와 Staged 상태


commit 을 하기 위해서는 add 과정을 거쳐야 하는데 여기서 나오는 개념이 Staging AreaStaged 상태이다. 어떠한 상태의 파일을 commit 하기 위해서는 add 명령어로 해당 파일을 Staging Area 에 Staged 상태로 만들어야 한다. Staging Area 는 commit 하기 이전에 파일을 대기 시키는 공간으로 일종의 안전장치다. 같은 의미로 index 라고 부르기도 한다. 그리고 파일이 Staging Area 에 위치한 상태를 Staged 상태라 한다. commit 을 위한 add 가 필요한 경우는 크게 세가지다.

1. Untracked 파일을 tracked 상태로 변경할때
2. tracked 파일을 수정(Modified)할때
3. tracked 파일을 삭제(Remove)할때

그림7. add 와 commit 이 필요한 상황

이런 공간과 상태를 만드는 이유는 간단하다. commit 이라는 명령어는 매우 중요하고 큰 의미를 가지기 때문이다. 따라서 반드시 commit 하기 전 Staging Area 에서 Staged 상태의 파일들을 확인 할 수 있게 만들어 둔것이다.

이 개념을 조금 더 쉽게 생각해보자. 예를 들어 장바구니에 우리가 사고 싶은 물품을 미리 담아두고 마지막에 결제를 하는 것과 유사한 형태이다. commit 이 필요한 파일들을 add 명령어를 통해서 Staging Area 라는 장바구니에 넣어두고 commit 하기 전에 확인 할 수 있다. 또한 한번에 git 에게 파일들을 한번에 넘겨줄 수 있다.

그림8. add 로 Staging Area 에 파일을 Staged 상태로 만들어 넣어야 commit 이 가능해진다.

 

1. Untracked 파일을 tracked 상태로 변경할때

Untracked 파일을 add 명령어를 수행하면 Staging Area 라는 공간에 해당 파일을 Staged 상태로 만든다. 위에서 만든 test.py 를 다시한번 add 하고 commit 하는 과정을 보자.

우선 git status 로 현재 저장소가 어떤 상태인지 보자. 아래 그림9 에서 Untracked file 이 존재하고 이름이 test.py 라는 것을 알려준다. 이 파일을 tracked 상태로 만들기 위해서는 git add 파일명 라는 명령어를 사용하라는 내용이다.

그림9. git status 로 현재 git 저장소의 상태를 확인 가능하다.

그럼 git add test.py 로 Untracked 파일을 tracked 파일로 상태를 변경해보자. 아무런 반응이 없으면 제대로 add 명령이 수행된 것이다. 아래처럼 warning 이 나오는 경우도 있지만 무시해도 상관없다.

그림10. git add test.py 로 Staged 상태로 변경하자.

test.py 파일을 add 를 했으니 파일의 상태는 어떻게 변했을까? 생각한 내용이 정답인지 git status 명령어로 다시 한번 저장소의 상태를 확인해보자. Changes to be committed 문구는  Untracked 상태였던 test.py 파일이 tracked 상태로 변경됐다는 의미이다. 하지만 아직은 git 이 해당 파일을 인식하고 있을 뿐 관리하고 있는 상태는 아니다.

그림11. Changes to be committed 는 commit 준비가 됐다는 뜻이다. 잘 기억하자.

tracked 상태에서 반드시 commit 을 해줘야 git이 관리 할 수 있는 파일이 된것이다. git commit 을 입력하고 commit 메세지 내용을 작성하자.

그림12. git commit 으로 파일을 git 으로 관리하자.
그림13. commit 메세지를 작성하자.

마지막으로 git status 명령어로 git 저장소 상태를 확인해보자. 아래 그림14 에서 nothing to commit 이라 출력된다. 뜻은 commit 으로 Staged 파일이 git 으로 관리가 시작되고 Unmodified 상태가 됐으므로 저장소에 Staged 상태인 파일이 존재하지 않는다 라는 의미이다.

그림14. 잘 commit 해서 Staged 파일이 없다는 뜻이다.

 

2. tracked 파일을 수정(Modified)할때

tracked 파일을 수정한 경우도 똑같이 commit 을 하기 위해서는 반드시 staged 상태로 변경해야 한다. 그래서 파일을 수정한 뒤에도 add 명령어를 통해 Staged 상태로 변경하고 commit 한다. 실제로 위에서 commit 한 test.py 파일을 수정해보면서 확인 해보자. 우선 vim test.py 로 코드를 추가해보자.

그림15. vim 에디터로 코드를 추가하자.
그림16. print(“2”) 코드를 추가하고 저장하자.

commit 한 이후에 파일을 수정하지 않은 test.py 파일의 상태는 Unmodified 였다. 하지만 해당 파일은 수정했기 때문에 Modified 상태로 변경된다. git status 로 확인해보자. 그림24 처럼 test.py 파일의 상태가 modified 상태라는 것을 알 수 있으며 Chages not staged for commit : commit 을 하기 위해서는 add 가 필요하다는 뜻이다. 이 문장은 잘 기억해두자.

그림17. test.py 가 modified 상태이며 commit 을 위해서는 add 를 수행해야한다.

파일을 commit 하기 위해서 git add test.py 로 파일을 Staged 상태로 변경하자.

그림18. 수정 된 파일을 git add test.py 로 commit 할 수 있는 상태로 만들자.

commit 할 수 있는 상태가 됐는지 git status 로 확인해보자. 아래의 그림19 를 잘 보면 그림18 과 달리 test.py 가 commit 될 수 있는 상태인 Staged 상태가 됐다는 Changes to be committed 라는 문구와 함께 색깔이 초록색으로 변경된 것을 볼 수 있다.

그림19. modified 상태에서 commit 이 가능한 Staged 상태로 변경된 test.py

수정한 파일을 git 이 관리 할 수 있게 git commit 을 수행하고 commit 메시지를 작성하자. 저장이 됐으면 저장이 성공했다는 메시지가 뜰것이다. 다시하번 git status 로 Staged 상태로 남아있는 파일이 있는지 확인하는 것도 좋을것이다.

그림20. git commit 으로 수정된 파일을 git 으로 관리하자.
그림21. 수정된 test.py 가 잘 관리돼고 있다.

 

3. tracked 파일을 삭제(Remove)할때

사실 삭제는 위의 경우보다 조금 더 복잡하다. 그래서 우선 git 에 대한 여러가지 정보를 기록해 놓은 로그에 대해서 먼저 배워야한다. 그 이후에 파일의 삭제와 복구에 대해서 알아보자.

 

요약


명령어의미
git add 파일명파일을 Staged 상태로 만든다.
git commitStaged 상태의 파일을 commit 해서 git 으로 관리한다.
git status현재 저장소의 상태를 볼 수 있다.

 

댓글 남기기

Please enter your comment!
Please enter your name here