챕터 8 <Git 내부 동작 원리>와 챕터 9 <인증 기능 살펴보기>를 학습했다. 이렇게 책을 끝까지 한 번 공부하는데 성공했다!
교재 실습하기
📌git add 명령의 동작 원리
❗git init 명령 수행 시의 변경사항 확인
- ls -al : .git 폴더 생성을 확인한다.
- ls -al .git/ : .git 폴더 내부를 확인한다.
- git status 명령은 워킹트리의 상태를 보는 명령어이다.
- git stauts 명령은 워킹트리, 스테이지, HEAD 커밋 세 가지 공간의 차이를 비교해서 보여준다.
- 새로 파일을 생성할 경우 워킹트리에만 해당파일이 존재한다.
- git hash-object cat.txt : 파일의 체크섬을 확인한다.
- ls -a .git : .git 폴더를 확인하면 index가 생성되었다.
- file .git/index : .git/index 파일이 무엇인지 확인한다.
- .git/index는 Git index이다. index는 스테이지의 다른 이름으로, 이 index 파일이 Git의 스테이지이다.
- git ls-files --stage : 스테이지 파일의 내용을 확인한다.
- cat.txt 파일이 스테이지에 들어있으며 체크섬은 이전의 값과 동일하다.
- ls -a .git/objects/ : .git/objects/ 폴더를 확인한다.
- ls -a .git/objects/ff/ : .git/objects/ff 폴더를 확인한다.
- 폴더명과 파일명을 합쳐보면 ff5bda이다. 이는 앞에서 확인했던 체크섬이다. objects 폴더 안에 존재하는 파일들은 Git 객체이다.
- git show ff5bda : 해당 객체의 내용을 확인한다.
- git cat-file -t ff5bda : 체크섬으로 객체의 종류를 알아본다. -> ff5bda 객체는 blob이다.
- git cat-file blob ff5bda : 해당 객체의 내용을 확인한다.
📌git commit 명령의 동작 원리
- 워킹트리가 깨끗한 상태이다.
- 이때 워킹트리가 깨끗하다는 의미를 스테이지가 비어있다는 것으로 생각하기 쉽다.
- ls -a .git/objects : .git/objects/의 변화를 확인한다.
- 방금 만든 커밋 1c는 .git/objects/1c 폴더 아래에 있다.
- git show 1ccbed : 객체를 확인해보면 커밋 객체임을 알 수 있다.
- git ls-files --stage : 스테이지를 확인해보면 비어있지 않다.
- clean하다는 의미는 위킹트리, 스테이지, HEAD 커밋의 내용이 같다는 뜻이다.
📌Git tree 객체
- 7a5459 객체는 tree이다.
- git ls-tree 7a5459 : 객체의 내용을 보면 스테이지와 동일하다.
- git cat-file -t 1ccbed : 커밋 객체의 체크섬을 이용해 타입을 확인하면 commit이다.
- git cat-file commit 1ccbed : 커밋 객체의 내용을 확인하면 커밋메지와 트리로 구성되어 있다.
📌수동 커밋하기
- 파일 내용을 수정하고 파일 체크섬 값을 확인한다.
- 변경사항을 스테이지에 추가하지 않았기 때문에 현재 폴더의 체크섬만 다르다.
- git write-tree : 트리를 생성한다.
- git ls-tree 4ced2d : 생성된 트리 객체를 확인한다. 스테이지의 내용과 같다.
- echo "트리로 커밋하기" | git commit-tree 4ced2d -p HEAD : 트리로 커밋을 생성한다.
- git cat-file commit b1ece1 : 생성된 커밋을 확인한다.
- git log --oneline : 커밋 로그를 확인한다. 방금 생성한 커밋이 로그에는 나오지 않는다.
- 아직 HEAD가 갱신되지 않았다!
- ls .git : .git 폴더의 목록을 확인한다.
- cat .git/HEAD : HEAD 파일의 내용을 확인한다. (텍스트 파일인데 refs/heads/master라는 내용이 들어 있다.)
- cat .git/refs/heads/master : refs/heads/master 내용을 확인한다.
- refs/heads/master 파일의 내용은 HEAD 커밋의 체크섬 값이다.
- git update -ref refs/heads/master b1ece1 : 직접 커밋한 객체로 업데이트한다.
- cat .git/refs/heads/master로 refs/heads/master 파일의 내용을 확인한다. -> 값이 갱신되었다.
📌중복 파일 관리
- cp cat.txt cat2.txt : 파일을 복사한다.
- 스테이지 내용을 확인하면 해시 체크섬이나온다.
- cat.txt와 cat2.txt 파일의 내용이 같다.
- cat3.txt 파일은 이전 커밋의 cat.txt 와 같은 값이다.
- 커밋한다.
📌브랜치 생성과 삭제
- git branch test : 브랜치를 생성한다. 커밋을 지정하지 않았으므로 HEAD 커밋으로부터 test 브랜치가 생긴다.
- git log --oneline : 생성된 브랜치를 확인한다. 생성된 브랜치는 9688396 커밋을 참조하고 있다.
- ls .git/refs/heads/ : .git 폴더의 내부를 확인한다. master 파일과 test 파일이 있다.
- cat .git/refs/heads/test : 파일 내용을 살펴보면 HEAD 커밋의 전체 체크섬 내용이 들어 있다.
- git branch -d 브랜치명 명령은 .git/refs/heads/에 있는 브랜치 파일을 삭제하는 것이다.
- git branch -d test으로 브랜치를 삭제하면 refs/heads 폴더에 있던 test 파일이 삭제된다.
- rm .git/refs/heads/test2 명령은 refs/heads/test2 파일을 삭제한다.
📌브랜치 체크아웃
- git branch test3 HEAD^ : 현재 HEAD의 부모로부터 test3 브랜치를 만든다.
- cat .git/HEAD : 체크아웃 전에 HEAD 파일을 확인한다. -> refs: refs/heads/master
- test3 브랜치를 체크아웃한다.
- cat .git/HEAD : HEAD 파일을 확인한다. -> refs: refs/heads/test3 (master에서 test3로 변경됨.)
- git status : 워킹트리가 깨끗한 상태로, 워킹트리, 스테이지 모두 test3 내용으로 변경되었다.
📌수동 체크아웃
- echo "ref: refs/heads/master" > .git/HEAD : HEAD 파일을 직접 수정한다.
- git log --oneline -n1 : 로그를 확인해보면 HEAD가 master로 이동했다.
- git status : 상태를 보면 스테이지와 워킹트리는 아직 변하지 않았다.
- 워킹트리와 스테이지는 여전히 test3 커밋을 가리키고 있는데, HEAD 커밋만 master 커밋으로 변경되었다.
- git reset --hard : hard reset을 수행하면 커밋, 스테이지, 워킹트리의 내용이 같아진다.
📌윈도우의 자격 증명(Crednetial) 관리
- CLI로 옵션 값 확인하기
- 자격 증명 관리자에 사용자 인증 관련 정보를 사용할 수 있다.
📌SSH 키 생성하기
- ssh-keygen 명령을 이용해서 SSH key를 생성한다.
- cd ~/.ssh/ : 키가 저장된 폴더로 이동한다
- ls : 파일 목록 확인
- id_rsa, id_rsa.pub 파일이 생기는데 id_rsa.pub 파일이 공개키, id_rsa가 비밀키이다.
- cat id_rsa.pub : 공개키를 확인해서 복사한다.
📌SSH 키 사용하기
❗SSH를 사용하는 원격저장소 주소 : git@github.com:이름/폴더명.git
- SSH 설정 파일을 만들어야 한다.
- echo "Host github.com" >> ~/.ssh/config 명령을 실행하고 /.ssh/config 파일을 찾아서 아래와 같이 수정한다.
- 이후 다시 clone을 시도하면 성공한다.
배운 내용 정리
⭐ls -al 명령에서 각 컬럼의 의미
- -rw-r--r-- 1 : 첫 번째 칸은 파일의 권한과 상태, -로 시작하면 일반 파일, d로 시작하면 폴더이다.
- 0yeon : 파일의 소유자 아이디
- 0 : 파일의 크기로 바이트로 표시되는데 폴더는 0으로 표시된다.
- Feb 16 19:08 : 파일 생성 시간
- HEAD : 파일이름, 폴더의 경우 /가 붙는다.
⭐ 체크섬
- 체크섬이 같은 객체는 같은 내용을 가진다.
- 모든 커밋은 다른 체크섬은 가진다.
⭐ git commit : 이전 HEAD를 부모로 하는 커밋 객체를 생성한 후 방금 만든 새 커밋이 새로운 HEAD가 된다.
⭐ 파일
- git에서 파일은 blob으로 관리된다.
- git의 blob는 제목이나 생성 날짜와는 관계없이 내용이 같을 경우 같은 체크섬을 가진다.
- 이전 blob 객체를 활용한 커밋을 하면 저장소에 별도의 blob 객체가 추가로 생기지 않는다.
- 새로운 커밋을 여러 개 만들거나 같은 파일을 여러 폴더에 복사해도 그 안의 파일 내용이 같다면 하나의 blob로 관리된다..
⭐ 워킹트리, 스테이지, HEAD 커밋 공간
- git status 명령은 워킹트리, 스테이지, HEAD 커밋 세가지 공간의 차이를 비교해서 보여준다.
- 커밋은 객체이고, 객체는 .git/objects 에 저장된다.
- 새로 파일을 생성할 경우 : 워킹트리에만 파일이 존재한다. 스테이지는 비어 있고, HEAD 커밋은 없다.
- git add 파일명 명령 실행 : 워킹트리와 스테이지에 파일이 존재한다. HEAD 커밋은 없다.
- git status로 clean한 상태
- 워킹트리 = 스테이지 = HEAD 커밋
- 워킹트리와 스테이지, HEAD 커밋의 내용이 모두 똑같다.
- 커밋
- 커밋을 하면 스테이지의 객체로 트리가 만들어진다.
- 커밋에는 커밋 메시지와 트리 객체가 포함된다.
- modified : 스테이지와 워킹트리의 내용이 다른 파일
- staged : 스테이지에 있는 파일의 체크섬이 워킹트리의 내용과 같아진 상태
- git add : 워킹트리의 내용을 스테이지에 반영한다.
- git commit : 스테이지의 내용을 가지고 트리 객체를 만들고 이 트리 객체를 기반으로 기존 HEAD 커밋을 부모로 하는 새로운 커밋을 만든다.
- 마지막으로 생성된 커밋은 다시 HEAD가 된다.
⭐ 브랜치
- 커밋의 참조
- git branch 브랜치명 커밋체크섬 명령을 실행하면 내부적으로 커밋체크섬 내용을 가지는 .git/refs/heads/브랜치명 텍스트 파일을 생성한다.
- 브랜치 삭제는 refs/heads 폴더에 있던 브랜치명의 파일을 삭제하는 것이다.
- 브랜치 체크아웃은 .git/HEAD 파일의 내용을 참조하는 브랜치로 변경하고, 워킹트리와 스테이지 내용을 해당 커밋의 내용으로 변경하는 것이다.
- 즉 체크아웃은 해당 브랜치로 HEAD를 이동시키고, 스테이지와 워킹트리를 HEAD가 가리키는 HEAD가 가리키는 커밋과 동일한 내용으로 변경하는 것이다.
- 수동으로 브랜치 체크아웃을 하기 위해서는 .git/HEAD 파일을 수정하고, reset --hard를 이용해서 스테이지와 워킹트리를 초기화하면 된다.
⭐ SSH 키
- SSH(Secure SHell) 프로토콜은 1995년에 개발되었다.
- 원래 unix, linux 같은 OS에 안전하게 접속하기 위해 만들어졌다.
- 최근에는 클라우드 등 리눅스 서버에 접속하기 위해서 주로 사용한다.
- git에서도 SSH를 이용해서 안전하게 데이터를 주고받을 수 있다.
- 공개키/비밀키 방식을 사용한다.
❗공개키/비밀키 관련 포스팅
https://0yeonjae2.tistory.com/entry/IT%EA%B0%9C%EB%A1%A0-%EB%B3%B4%EC%95%88%EA%B3%BC-%EC%95%94%ED%98%B8%ED%99%94
배운 명령어 정리
⭐git hash-object 파일명 : 일반 파일의 체크섬을 확인할 때 사용한다.
⭐ git show 체크섬 : 해당 체크섬을 가진 객체의 내용을 표시한다.
⭐ git ls-files --stage
- 스테이지 파일의 내용을 표시한다.
- 스테이지 파일은 git add 명령을 통해 생성되는데 .git/index 파일이 스테이지 파일이다.
⭐ git cat-file -t 체크섬
- 해당 체크섬을 가진 객체의 타입을 알려주는 명령
- blob : binary large object의 줄임말
⭐ git cat-file 객체타입 체크섬 : 객체의 타입을 알고 있을 때 해당 파일의 내용을 표시한다.
⭐git write-tree : 스테이지의 내용으로 트리 객체를 선언한다. 그 후 생성된 트리 객체의 체크섬을 화면에 출력한다.
⭐ echo "커밋 메시지" | git commit -tree 트리 객체 체크섬 -p HEAD: 트리 객체를 이용해서 직접 커밋을 생성한다.
- -p HEAD : 부모 커밋이 HEAD
- -p는 부모를 지정해주는 옵션이다.
⭐git update refs/heads/master 체크섬
- refs/heads/master의 내용을 새로운 커밋의 체크섬 값으로 변경한다. -> HEAD 갱신
⭐ cp 파일1 파일2 : 파일1의 내용을 파일2에 복사한다.
⭐git reset --hard : 커밋, 스테이지, 워킹트리의 내용이 같아진다.
⭐ git config credential.helper
- git config credential.helper
- git config --local credential.helper
- git config --global credential.helper
- git config --system credentail.helper
⭐ssh-keygen : SSH Key 생성
'독학 > [책] git, github' 카테고리의 다른 글
[Git/GitHub🐱] 팀 개발을 위한 Git, GitHub 시작하기 DAY6 (0) | 2023.02.17 |
---|---|
[Git/GitHub🐱] 팀 개발을 위한 Git, GitHub 시작하기 DAY5 (0) | 2023.02.14 |
[Git/GitHub🐱] 팀 개발을 위한 Git, GitHub 시작하기 DAY4 (0) | 2023.02.12 |
[Git/GitHub🐱] 팀 개발을 위한 Git, GitHub 시작하기 DAY3 (0) | 2023.02.12 |
[Git/GitHub🐱] 팀 개발을 위한 Git, GitHub 시작하기 DAY2 (2) | 2023.02.06 |