수학과의 좌충우돌 프로그래밍

05. git의 원리(2) commit, status의 원리 본문

git

05. git의 원리(2) commit, status의 원리

ssung.k 2019. 2. 6. 21:38




안녕하세요 강민성입니다.


이번에는 git 중에서 commit과 status의 원리에 대해서 알아보도록 하겠습니다.


기본적인 디렉토리와 내용은 저번 시간과 지어지니 참고해주시면 감사하겠습니다.


https://ssungkang.tistory.com/entry/04-git%EC%9D%98-%EC%9B%90%EB%A6%AC1-gistory%EC%99%80-add%EC%9D%98-%EC%9B%90%EB%A6%AC



git commit 의 원리를 알아보자



위에서 말했듯이 저번 시간에 하던 디렉토리에서 이어서 하도록 하겠습니다.


먼저 현재 어떤 상태인지 git status를 통해 살펴보겠습니다.

3개의 파일이 생성되어있고 각각 add 가 되어 commit이 될 준비가 되었습니다.

3개의 파일을 모두 commit 해보도록 하겠습니다.


commit 메세지는 1로 입력하였습니다.


그 후 gistory의 변화를 관찰해보겠습니다.


gistory가 뭔지 모르겠다면, 위의 링크에서 다시 보시길 바랍니다.


2개의 디렉토리만 바뀌었던 add와 달리 많은 디렉토리가 변경되었습니다.

먼저 objects 폴더부터 확인해보겠습니다.


commit 메세지 1 이 파일의 내용이 저장되었을 때와 같은 방식으로


객체로서 저장이 되었습니다.


내용을 좀 더 자세히 보면 tree, author , committer 를 확인 할 수 있습니다.


tree 는 우리가 commit한 파일들을 확인할 수 있고


author 와 committer 는 작성자와 commit한 사람의 정보를 확인할 수 있습니다.


다음으로는 test2.txt 파일의 내용을 수정하고 다시 commit 해보겠습니다.


이번에는 commit 메세지를 2로 하고 다시 objects를 확인해보겠습니다.


아까와는 다르게 parent가 추가되었습니다.

tree는 마찬가지로 commit된 파일들을 확인할 수 있고

새로 생긴 parent는 이전의 commit과 연결되어 있습니다.


따라서 첫번째 commit 에서는 이전 commit 이 없었으므로 parent가 존재할 필요가 없었습니다.

정리를 해보면 commit을 하게 되면 그 정보가 객체로서 objects 에 저장이 됩니다.


commit 메세지와 여러 정보들에 따라 이를 암호화 시켜 objects 안에 디렉토리와 파일을 생성하게 됩니다.


그 파일안에는 다음과 같은 정보들이 담깁니다.


1. commit 메세지


2. tree : commit 한 파일들의 파일명과 그 내용


3. parent : 앞선 commit에 대한 정보


4. 파일의 수정자와 commit 한 자에 대한 정보



objects 디렉토리에 생성되는 파일들은 어떤 파일들일까?


새로운 파일을 만들어서 add 했을 때도, 또한 commit 했을 때도 objects 디렉토리가 변했습니다.


각 상황에 따라서 어떤 파일이 생기는 것인지 짚고 넘어가도록 하겠습니다.


생성되는 파일은 3가지 종류 중 하나 입니다.


( 파일의 종류는 좌측 상단에 [ ] 안에서 확인 할 수 있습니다. )



1. 파일의 내용을 담고 있는 blob


2. 파일명과 파일내용에 해당되는 정보가 담기는 tree


3. 전체적인 걸 아우르는 정보를 담고 있는 commit




git status의 원리를 알아보자



다음으로는 status가 어떤 원리도 동작하는지 알아보겠습니다.


commit한 직후, 변경사항이 없을 때는 아래와 같이 commit할 게 없다는 걸 알려주고

test2.txt 파일을 수정한 후에 status 명령을 하면


다음과 같이 어떤 파일이 변경되었는지 정확히 캐치합니다.

또한 add 를 한 후에도 commit 할 준비가 되었다는 점을 정확히 캐치합니다.

먼저 add 한 직후 gistory를 살펴보겠습니다.


add 후 index 디렉토리에서 test2.txt 를 확인해보면 파일이 수정된 형태로 존재하지만

objects 디렉토리에 있는 test2.txt 는 아직 수정되기 전의 내용으로 존재합니다.


따라서 이럴 경우에는 add 는 되었지만 아직 commit은 되지 않았다고 판단합니다.

이제 commit을 하게 되면 index 디렉토리의 내용과

objects 의 내용이 같아집니다.


이 때 로컬에 있는 파일도 이와 같으면 수정사항이 없는 것으로,


로컬에 있는 파일은 이들과 다르면 수정은 되었지만 add하기 전으로 판단을 하게 됩니다.



즉 우리가 개념적으로 알고 있던 stage area 가 내부적으로는 index 라는 디렉토리로 역할을 하고 있었습니다.


정리해보자면,


우리가 작업하고 있는 공간은 working directory


stage area 에 해당되는 공간은 index 또는 cache 라고도 부르고,


마지막으로 commit을 하게 되면 repository에 올라가게 됩니다.




Comments