🧑🏻💻 git add
git add는 변경사항을 staging area에 추가하는 명령어이다. 개발자라면 이걸 모르는 사람은 없을 것이라고 생각한다.
그렇다면 git add를 하면 내부에서는 어떠한 일이 벌어질까? 라는 궁금증이 생겼다. 자세한 내용은 생활코딩님의 지옥에서 온 git을 시청하는 것을 추천한다. 나는 아주아주 간단하게만 다룰 예정이다.
😎 실습
뭐니뭐니해도 실습이 기억에도 남고, 최고이다. 그 과정을 기록해보려고 한다.
🎉 간단한 프로젝트 생성
GitPractice 폴더 생성 → git init을 통해 git을 시작하게 되면 아래와같이 .git파일만 생성되게 된다.
들어가보면 아래와 같이 나오는데
config, description, HEAD 문서는 열수있는 파일이여서 열어보았다. 일단 여러가지 설정들을 할수있는 config파일과 아마 레포지토리의 설명을 저장하는 description, HEAD의 경우 commit과 관련이 있어보인다.
config의 경우 아래와 같이 다른 프로젝트에서 확인해보니 원격 저장소가 있는 경우 이렇게 설정이 되는 듯 하다.
우선 여기까지만 알아보고... git add를 봐야하니깐...
📃 간단한 파일 추가
foo.txt파일을 간단하게 생성해 주었다.
.git 폴더에 들어가보니 당연히도 아무 변경사항이 없다.
하지만 git add foo.txt를 하는 순간 index라는 파일이 생긴다. (아주 중요)
🧐 생성된 파일이 어떤것이 있을까?
열어서 확인해보고싶지만 index파일은 이진 형식으로 저장되어 있다고 한다. git ls-files --stage를 통해 어떤 느낌인지를 확인해볼 수 있다.
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 foo.txt
위와 같이 SHA-1 (Secure Hash Algorithm)의 어떠한 값과 파일명이 보인다. 또한 생성된 것이 하나 더 있다. object 파일에 위의 해시값의 앞 두자리, 나머지 자리로 되어있는 문서가 생성되었다.
git cat-file -p 78981922613b2afb6025042ff6bd878ac1994e85 를 통해 한번 확인해보면 내가 쓴 a가 잘 들어있는 것을 볼 수 있다.
🤓 중간 결론
git add를 하는 순간 벌어지는 일은 간단하다.
- index파일과 object에 SHA-1으로 변환된 해시값을 가지고 있는 폴더, 파일이 생성된다.
- index파일은 해시값과 파일명을 가지고 있다.
- object에 있는 파일(blob)은 실제 파일의 내용을 담고 있다.
🖨️ 파일을 복사해보자
foo.txt파일을 boo.txt파일로 복사했다.
이 상태에서 git add를 해보면...! 어라라? 나는 분명 파일을 두개 추가했는데... object에는 78밖에 없고 index를 살펴보니 두 파일이 똑같은 해시값을 가지고 있다.
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 boo.txt
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 foo.txt
아하...! 여기서 중요한 사실 하나를 알 수 있다. 내용이 같으면 같은 object로 관리가 되는구나! 라는 것을 알 수 있다. 여기서 boo.txt내용을 변경하고 다시 git add를 해보면... 당연하게도 object가 새롭게 생성되는 것을 볼 수 있다.
100644 63d8dbd40c23542e740659a7168a0ce3138ea748 0 boo.txt
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 foo.txt
🥳 최종 결론
git add를 하게 되면 index, object폴더에 해시값을 사용한 폴더, 파일이 생긴다. object폴더는 파일의 내용을 기준으로 생성된다. (다양한 메타정보가 들어가서 SHA-1으로 해싱되는 것 같다. 단순히 파일의 내용을 해싱하니 다른값이 나온다)
✨ 중요한 내용
내가 생각하기에 중요한 내용을 간단하게 요약하면 아래와 같이 요약할 수 있을 것 같다.
- git add를 하면 index, object(blob)파일이 생긴다. 이를 쉽게 staging area에 올라간다고 표현한다.
- 파일의 내용을 SHA-1으로 해싱하여 폴더명, 파일명을 구분한다.
- 실제 파일의 내용은 해시값으로 만들어진 파일(blob)에 들어가 있다.
- 파일의 내용이 같다면 다른 파일명이더라도 같은 object(blob)를 가르키고 있다.
'→ Git의 원리' 카테고리의 다른 글
[Git] git commit을 하면 어떤 일이 일어날까? (0) | 2024.12.20 |
---|