Git Add and Commit

git add

  • untracked 상태인 파일에 대해 stage(tracked)상태가 되며 이는 commit을 수행하기전 .git/index파일에 add한 파일이 반영되며 .git/objects에 해당 파일의 blob(파일명은 파일내용의 SHA1알고리즘으로 생성된 40글자)이 생성된다.
    • blob 파일이란 Binary Large OBject의 약자로, 대용량 데이터를 저장하기 위한 이진 데이터의 모음을 말한다.
  • tracked된 상태의 파일중 modified된 파일 또한 위의 과정을 가진다.

git commit

  • Commit을 하게되면 .git/objects에 tree파일과 commit파일이 생성된다.
  • Commit파일은 commit의 메세지와 작성자와 그리고 해당 commit의 tree파일(commit할때 같이 생성된 tree파일)이 들어있다. 또한 첫 번째 commit이 아닌 경우 자신의 부모 commit에 대한 정보를 가지고 있다(즉, 부모를 가리키고 있다).
  • Tree파일은 해당 commit의 추가된 파일의 blob의 파일명이 저장되어있다.
    • Tree파일에는 해당 commit에 추가된 파일 뿐만 아니라 해당 commit까지 모두 유지되어야 할 파일들의 blob들의 파일명이 저장되어 있다.
    • 특이점은 해당 commit에서 추가된 blob은 방금 생성된 것 이지만 다른 파일들의 blob은 다른 commit에서 생성되어 저장되어 있는 것이며 이번 commit이 가리키고 있는 tree파일이 해당 commit이 유지해야할 파일들에 대한 모든 blob 파일명 정보를 유지하고 있다(즉 tree 파일은 해당 commit이 유지하는 파일들의 blob들을 가리키고만 있다)
    • 위의 설명에서 blob의 파일명은 파일내용의 SHA1알고리즘으로 생성된다고 했다. 그 말인 즉슨, 같은 파일의 내용이면 같은 blob 파일명이 생성될 것이며 commit이 계속되어도 파일내용이 수정되지 않는다면 새로운 blob파일을 생성하지 않는다는 의미이다.

git branch

  • git branch는 단순한 pointer 즉 가리키는 것인데 브랜치는 단순히 commit을 가리킨다.
  • .git/refs/heads 디렉토리에는 브랜치명들로 된 파일들이 있는데 그 파일을 확인하면 commit object명(SHA1 40글자)이 존재한다.
  • 즉 브랜치는 단순히 브랜치의 최신 commit을 가리키기만 함으로써 그 commit의 부모 commit의 부모 commit 또 그 모든 commit들의 tree들의 blob들의 정보를 모두 얻어낼 수 있으며 이것으로 우리가 브랜치로 어떤 commit들을 하였는지 볼 수 있고 각 스냅샷을 가져올 수 있는 원리이다.

Git의 Three main section

Git directory

  • 이곳은 프로젝트를 위해 git이 메타데이터와 object 데이터베이스를 저장하는 곳이다.
  • git에서 가장 중요한 파트이며 git clone을 하면 복사되는 것도 이것이다.

Working directory

  • checkout된 프로젝트의 한 버전이다.
  • 이곳에 존재하는 모든 파일들은 압축된 git의 object 데이터베이스에서 우리가 작업할 수 있도록 우리의 컴퓨터로 꺼내온것이다.

Staging area

  • git directory에 존재하는 하나의 단순한 파일로서 다음 commit에 어떤것이 포함 될 것인지에 대한 정보가 들어있다.
  • 가끔씩 index라고 불리지만 이제는 staging area이 표준이 되어가고 있다.
추천 동영상