1. branch의 원리, Head의 원리


오브젝트 id란, 40개의 숫자의 영문자의 조합으로 이루어진 것으로 커밑 당시의 폴더구조와 파일내용의 전체 상태를 가르키는 참조값이다.


・git init 

-.git/HEAD 파일이 생성되고 그 파일은 .git/refs/heads/master를 값으로 지닌다.

(master는 디폴트 브랜치)

-아직 커밑을 한번도 하지 않았기 때문에,.git/refs/heads/master파일은 존재하지 않는 상태

-.git/HEAD : 현재 속해있는 브랜치의 디렉토리 주소(.git/refs/heads/[브랜치 이름])를 값으로 지니게 됨.

-.git/HEAD과 .git/refs/heads/master는 바이너리 값이아니라 모두 텍스트 값을 갖는다.



・git commit

-.git/refs/heads/master는 최신 커밑 상태의 오브젝트 id값을 가지게 됨. 



・git branch exp

-.git/refs/heads/exp 파일을 생성하고, 그 파일은 최신 커밑 상태의 오브젝트 id값을 가지게 됨.

-이때 드는 의문이, 처음으로 만들어진 브랜치는 최신 커밑이 없는데 어떤 오브젝트 id를 갖나? 라는 것인데,'최신' 커밑 상태의 오브젝트 id값에서 의미하는 바와 같이, 최초에 브랜치가 생성되면 아직 exp 의 내용에 변화가 없기때문에 master의 최신 커밑 상태의 오브젝트 id값과 exp의 최신 커밑 상태의 오브젝트 id값은 동일하게 됨.

-아직 브랜치가 옮겨지지 않았기 때문에 .git/HEAD 파일은 .git/refs/heads/master를 값으로 지닌다.


 



・git checkout exp

-브랜치의 위치가 변화했기 때문에, .git/HEAD 파일은 .git/refs/heads/exp를 값으로 지닌다.



・git commit

-.git/refs/heads/exp는 최신 커밑 상태의 오브젝트 id값을 가지게 됨. 






2.되돌아가기 - reset과 checkout
・git reset --hard 93c95176






・아래 그림에서 refs/heads/master 의 최신 커밑 상태의 오브젝트 id값이 93c95176로 바뀐 것을 볼 수 있다.
-그럼 4의  커밑 상태의 오브젝트 id값이 없어졌을까?



・ORIG_HEAD : 삭제한 커밑을 가르킴
-ORIG_HEAD는 reset과 같은 명령을 시행할시, 삭제될 커밑을 저장해둠
-ORIG_HEAD는 4번 커밑의 오브젝트 id인 f3ea13을 가지고 있음
-그런데, 이때 3단계로 돌아가는게 아니라 2단계로 돌아간다고 하면, ORIG_HEAD는 3번 커밑의 오브젝트 id과 4번 커밑의 오브젝트 id을 모두 들고 있을까? 아니다, 최신 커밑의 오브젝트 id인 4번만 들고있는다.

・git reset --hard ORIG_HEAD
-reset하기 전으로 돌아감

・git reflog 하면 내가 했던 커밑을 쪼르륵 보여줌


・git checkout 은 이후에 브랜치 명 뿐만아니라 커밑아이디를 직접 적을 수도 있다.
-이때 checkout 명령으로 되돌아가면, .git/HEAD의 값이  .git/refs/heads/master와 같은 브랜치를 가르치는 것이 아니라 커밑 상태의 오브젝트 id를 직접 갖고 있는 것을 볼 수 있는데, git checkout master 를 시행하여 ./git/HEAD을 .git/refs/heads/master로 변경해준다.





3.reset의 soft,mixed,hard



(git reset 5c5184를 때리면, reset 커밑 오브젝트 id의 위쪽에서 변화가 발생한다)


-.git/objects : add와 commit에 의해 생성된 오브젝트 id가 쌓이는 가장 중요한 폴더.
각각의 파일은 오브젝트 id가 파일명으로 지정되어 있으며, 바이너리 형식이다.
add에 의해 추가되는 오브젝트 id파일은 파일의 내용을 바이너리로 담고있으며, 이를 blob라고 한다.
commit에 의해 추가되는 오브젝트 id파일은 커밑당시의 모든 디렉토리와 파일의 상태(당시의 blob들,parent)를 담는다.
-.git/index.file : 바이너리 형식이며 add 명령어를 시행할시 파일의 파일명만을 담는다. 
-.git/HEAD.file : 현재 속한 브랜치의 .git/refs/heads/[브랜치명]을 텍스트 형식으로 담는다.
-.git/refs/heads/[브랜치명].file : 최신의 커밑 오브젝트 id 값을 텍스트 형식으로 담는다.
-.git/ORIG_HEAD.file : reset과 같은 명령 시행시, 삭제된 커밑 오브젝트 id값을 텍스트형식으로 담는다.


+ Recent posts