* branch의 원리
우선 새로운 저장소를 만든다.
Q. git init했을 때 내부에서 어떤 일이 일어나는가?
-> head라는 파일은 git을 처음 생성했을 때 생성이 되며 동시에 refs/heads/master라고 적혀있다.
이것은 파일의 이름 의미하는데 아직 존재하지는 않고 이름만 있는 상태이다.
-> commit한 뒤 head라는 파일이 어떻게 편하는지 살펴보자.
-> 깃을 처음 초기화 하면, git 디렉터리에는 head라는 파일이 생긴다. (일반 텍스트 파일)
그 파일을 열어보면 refs/heads/master라고 적혀있고 이것은 첫번째 커밋을 한 시점부터 생성이된다.
파일의 내용을 보면 방금 커밋한 내용을 가리키고 있다.
* 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 브랜치와 똑같이 최신 커밋을 가리킨다.
* 이번에는 브랜치를 바꿔보겠다.
Q. git checkout exp하면 어떤 변화가 생기는가?
-> head파일이 변한다. refs/heads/exp를 가리킨다
* exp 브랜치에서 파일을 하나 추가해보자
* vim f2.txt > git add f2.txt > git commit -m "3"
-> head는 refs/~/exp를 가리키고 방금 한 커밋인 3번을 가리킨다.
여기서 git checkout master를 하면 어떻게 바뀌는지 보자.
-> 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 |