[Git] 그림으로 Git 뜯어보기

2022. 4. 18. 14:59Git

1. 커밋은 Delta(차이점)가 아니라 Snapshot(스냅사진)

SVN(SubVersion)과 Git의 차이점

Git은 커밋에 변경된 것만 저장하는 것이 아니라 전체 코드를 저장합니다. 예를 들어서 README.txt의 세번째 라인에 '안녕'을 추가한 커밋이 있다면 Git은 추가한 세번째 라인뿐만 아니라 첫번째 라인부터 전체를 저장합니다.

전체를 저장하는 Git보다 차이점만 저장하는 SubVersion이 훨씬 용량도 작고 빠를것 같습니다. 하지만 차이점만 저장하는 방식은 버전을 보여줄 때 파일이 만들어졌던 맨 처음까지 거슬러 올라가며 바뀐 점을 모두 반영하는 계산을 해야 한다는걸 알 수 있습니다. 예를 들어 README.txt가 백번 바뀌었다면 SubVersion은 백번의 계산을 모두 해야합니다. 하지만 파일의 스냅샷을 저장하는 Git은 계산이 필요없습니다. 바로 앞에서 바뀐 커밋이랑 비교하는 연산 한번만 하면 됩니다. 그리고 바뀌지 않은 파일은 이전 파일의 링크만 저장하기 때문에 용량도 적고 계산도 하지 않아도 됩니다. Git의 이러한 특징은 아프로 배울 여러 복잡한 명령어들을 빠르게 처리할 수 있게 됩니다.

 

2. Git으로 관리하는 파일의 4가지 상태

2.1 프로젝트 폴더에 처음 Git 초기화를 하고 README.md 파일과 app.js 파일, 두개를 생성

아래 두 파일은 모두 한번도 커밋되지 않은 파일이기 때문에 '추적 안됨(untracked)' 상태입니다.

2.2 add 명령어를 통해 두 파일 모두 스테이지에 올림

두 파일의 상태가 '추적 안됨'에서 '스테이지됨(staged)'으로 변경됩니다.

2.3 스테이지에 있는 파일 전체를 commit 명령어를 통해 하나의 스냅샷, 즉 버전으로 생성함

파일 상태가 '스테이지됨'에서 '수정 없음(unmodified)'으로 변경됩니다. 이렇게 '수정 없음' 상태로 된 파일은 다시 다른 수정을 할 수 있습니다.

2.4 원격 저장소에 푸시

2.5 app.js 파일 수정 및 app.css 파일 생성

app.js 파일은 수정되었기 때문에 수정됨(modified)으로 변경되고, app.css 파일은 생성되었기 때문에 추적 안됨 상태가 됩니다.

2.6 app.js 수정본과 app.css 파일을 스테이지에 올림

파일 상태가 '수정 없음'인 README.md 파일은 스테이지로 올릴 수 없습니다. README.md 파일은 지금 add하지 않았지만 변경사항이 없기 때문에 이미 올라와 있습니다.

2.7 commit을 통해 새로운 버전을 생성합니다.

이 커밋은 앞서 만든 커밋인 '프로젝트 초기화'에 연결되어 있습니다. 그래서 앞 커밋에 비해 이번 커밋은 app.js가 수정되었고 app.css가 추가되었다는 것을 Git이 계산을 통해 알아낼 수 있습니다.

2.8 push 명령어를 통해서 새로 만든 커밋을 원격저장소에 올림

 

Git으로 관리하는 파일의 4가지 상태

 

References

source code : https://github.com/yonghwankim-dev/git_study
팀 개발을 위한 Git Github 시작하기, 정호영 진유림 저