프로그래밍 관련 도구/Git

Git(branch의 원리)

benjykim 2017. 8. 10. 16:25
반응형

* branch의 원리


우선 새로운 저장소를 만든다. 


Q. git init했을 때 내부에서 어떤 일이 일어나는가?


-> head라는 파일은 git을 처음 생성했을 때 생성이 되며 동시에 refs/heads/master라고 적혀있다. 

    이것은 파일의 이름 의미하는데 아직 존재하지는 않고 이름만 있는 상태이다.



save image



-> commit한 뒤 head라는 파일이 어떻게 편하는지 살펴보자. 


* vim f1.txt (text : "a") > git add f1.txt > git commit -m "1"

-> refs/heads/master 라고하는 파일이 생겼다. 클릭해보면 오브젝트 ID값을 가지고 있고 클릭하면 
    방금 커밋한 내용이 있다. 

save image





-> 깃을 처음 초기화 하면, git 디렉터리에는 head라는 파일이 생긴다. (일반 텍스트 파일)

    그 파일을 열어보면 refs/heads/master라고 적혀있고 이것은 첫번째 커밋을 한 시점부터 생성이된다. 

    파일의 내용을 보면 방금 커밋한 내용을 가리키고 있다. 




save image



* vim f1.txt (text 추가 : \n "b") > git commit -am "2" 


-> refs/heads/master역시 바꼈다. 이번에 오브젝트 아이디는 방금 커밋한 2번을 가리킨다.






-> 깃을 처음 만들면 헤드라는 파일이 반드시 생기고 마스터(refs/heads/master)라는 파일을 가리킨다. 

    마스터라는 파일은 가장 최신 커밋을 가리킨다.




Q. git log를 했을 때 git이 2번을 가장 최신 커밋이라고 알려줄 수 있었던 이유? 


-> head 파일을 가지고 있고 헤드라는 파일은 refs/heads/master파일을 가리키고 있고 이 파일은 가장 

    최근에 커밋한 오브젝트 아이디 값을 가지고 있기 때문이다.


즉, 깃은 git log를 하면 "HEAD->refs/heads/master->커밋오브젝트 아이디값"을 통해서 현재 가장 최신이 무엇인가를 알아낼 수 있다. 그리고 그 이전 커밋은 parent를 통해서 탐색할 수 있다.




-> 그리고 우리는 깃에서 브랜치라고 하는것은 refs 디렉터리 밑에있는 파일을 의미한다는 것을 알 수 있다.




* git branch exp 명령을 실행한 뒤(exp 브랜치를 만든 뒤) gistory를 살펴보자.



Q. 내부적으로 어떤 변화가 생기는?


-> refs/heads/exp라는 파일이 생겼다. 그리고 이 파일은 master 브랜치와 똑같이 최신 커밋을 가리킨다.



save image




* 이번에는 브랜치를 바꿔보겠다. 

Q. git checkout exp하면 어떤 변화가 생기는가?


-> head파일이 변한다. refs/heads/exp를 가리킨다




save image




* exp 브랜치에서 파일을 하나 추가해보자

* vim f2.txt > git add f2.txt > git commit -m "3"



save image




-> head는 refs/~/exp를 가리키고 방금 한 커밋인 3번을 가리킨다.

    여기서 git checkout master를 하면 어떻게 바뀌는지 보자.



save image



-> head파일이 master가 되고 master가 가리키는 최신커밋(2)이 된다. master로 체크아웃 했을 때 어떤 

    파일을 가지고 있어야하는지는 tree가 알려준다.




-> ls -al 하면 f1.txt만 있는 것을 확인할 수 있다.





-> head는 현재 사용하고 있는 브랜치를 가리킨다.

    head는 내부적으로는 특정한 파일이다. 그 파일이 하는 역할은 현재 체크아웃된

    가장 최신 커밋이 무엇인가를 알려주는 것이다.










*이 포스트는 이고잉님의 '지옥에서 온 Git'강의를 참고하여 작성했습니다.

URL : https://opentutorials.org/course/2708

반응형

'프로그래밍 관련 도구 > Git' 카테고리의 다른 글

Git(stash 정리)  (0) 2017.08.09
Git(branch_merge_conflict 정리)  (0) 2017.08.04
Git(branch_merge 정리)  (0) 2017.08.03
Git(branch_log,diff 정리)  (0) 2017.08.02
Git(branch 정리)  (0) 2017.08.02