티스토리 뷰

깃(git)

git 작동원리 설마 모르는건... 1편

안양사람 2021. 7. 11. 20:46
728x90
SMALL

개발자라면 git을 무조건!! 사용한다. 그중에서도 가장 보편적인 github는 개발자 준비생이나 학부생, 비전공자들도 알고 사용할 정도로 유명하다. 나의 경우를 보면 친구가 프로젝트 한 것을 github에 올리라고 했다. 그래서 맨처음에는 cli를 사용하지 않고 그냥 깃허브 사이트에서 올렸고 그다음에는 git bash를 사용해서 올렸다. 옆에서 누가 알려주지 않는 한 보통 이렇게 시작한다. 처음부터 branch, merge, pr 등을 알고 기능별로 commit을 하면 좋겠지만 무엇이든지 단계가 있고 필요성을 느낄때 사용하게 된다. 그리고 필요성을 느낄때 공부하고 적용하는 것은 '이걸왜쓰는거지??' 하면서 책보고 넘어가는 것과는 매우 다르다. 이제 점차 단계별로 git에 대해 알아가기 시작하는데 주관적인 기준으로 단계별로 얘기를 해보겠다.

 

1. git add, commit, remote, push로 내 코드를 올릴줄만 아는 상태

 이 단계에서 git에 대해 이해하고 쓰는 사람은 거의 없을것이다. 그래도 지금쓰는 용어정도는 알 필요가 있다. 참고로 git status는 git의 상태(untracked, tracked, commit)를 보여주고 git log는 커밋한 정보를 보여준다.

git init은 해당 디렉토리에 로컬 저장소를 만드는 것이고 git add를 하면 스테이지라는 곳에 파일을 올린다. 여기서 git commit을 하면 스테이지의 객체로 트리가 만들어진다. 이 부분을 직접 만들어보면서 실습하면 원리를 쉽게 이해할 수 있다.(실습하지 않고 눈으로 봐서는 이해가 조금 힘들것이다.)  https://ms3864.tistory.com/360?category=994434  링크를 첨부한다. 이를 보고 이해하는 것을 추천

 

add

디렉토리에서 git init을 하고 파일을 만들고 파일의 체크섬을 확인해보자.(git hash-object) (체크섬은 Git에서 사용하는 가장 기본적인(Atomic) 데이터 단위이자 Git의 기본 철학이다.) 그리고 add를 해서 스테이지에 올리면 untracked에서 tracked로 바뀌고(git status로 확인) 방금 확인한 파일의 체크섬이 스테이지에 올라간것을 알 수 있다.(git ls-files --state (.git/index))

ls -a .git/objects/ 명령어로 확인해보면 체크섬 처음 두자리 폴더가 있고 폴더 내부에 나머지 체크섬이 있는 것을 확인할 수 있다.

체크섬의 객체까지는 너무 복잡해질 것 같아서 설명하지 않겠다.(스테이지에 올라간 체크섬의 객체는 blob이다.) 궁금하면 링크를 가서 직접 해보자

 

commit

commit을 하고 git log로 방금 커밋한 체크섬을 기억하고 .git/objects를 살펴보면 방금 본 체크섬이 add할때처럼 있는 것을 볼 수 있다.  참고로 이 체크섬의 객체는 commit이다. 여기서 git status를 하면 working tree가 클린하다고 나온다. 그러면 스테이지가 비어있는 걸까?? 아니다. git status로 clean한 상태는 워킹트리=스테이지=HEAD 커밋

그런데 이상한 폴더하나가 더 생겼다. 이게뭘까?? 궁금하면 살펴보세요

라고 말하면 너무 무책임하니 설명하자면 이 체크섬의 객체는 tree다. 그리고 방금 커밋한 객체와 내용이 같다.

 

remote

보통 git remote add origin <저장소 코드> 를 사용한다. 이때 origin은 원격저장소 이름이고 git 저장소와 연결하는 것이다. 

 

push

보통 git push origin master 또는 git push를 이용한다. 여기서 origin은 아까 연결한 원격저장소이고 master는 푸시할 저장소의 branch인데 일단 범위를 넘어가기 때문에 다음 단계에서 설명하겠다.

참고로 matster에서 main으로 default 브랜치가 바뀌었다. master, slave의 용어를 사용하는 것을 지양하는 추세이기 때문에 github도 이를 따르는 것 같다. 그런데 기본 git init을 했을 때는 다음과 같이 master로 생성이 된다. 그래서 여기서 git push origin master를 하면 깃의 브랜치가 master로 설정된다.

이를 원하지 않으면 git branch -m main으로 브랜치 이름을 변경하면 된다. 만약 git에서 readme를 미리 만들거나 하는 등 한 번 이상의 커밋이 있으면 main으로 기본 브랜치가 설정된다. 무엇을 사용해도 상관없지만 main으로 사용하는 것을 추천한다. master를 사용해도 이런 사실을 모르면 어?? fork한 저장소에 왜 push가 안될까?? 하는 오류를 해결할 수 있다.

 

 

지금까지 따라왔으면 그 다음 동작원리는 쉽게 알 수 있다. 못다한 얘기들은 다음글에서...

 

2편 : pull, checkout, clone

3편 : branch, merge, fork, pr

4편 : amend, cherry-pick, reset, revert, stash

5편 : ??

728x90
LIST
댓글
공지사항