개요
Git이 작동하는 방식을 알아보자
https://learngitbranching.js.org/?locale=ko
얘를 하면서 나온 내용 정리해보기
커밋 단위
- 커밋은 DAG에서 노드라고 생각하면 편함
- git commit을 할 때 마다 이전 커밋과의 diff만 저장하고 새로운 커밋이 생김
- 트리에서 보면 새 노드가 생기고 부모로 이전 커밋을 가리키게 됨
브랜칭
- 브랜치는 특정 커밋의 참조일 뿐
- checkout 명령어는 수행하는 일이 너무 많아서 switch와 restore로 나뉘었음
- switch : 브랜치 혹은 커밋으로 이동만 담당, HEAD를 옮기는 작업임
- restore : 커밋되지 않은 작업사항을 되돌림
merge
- merge는 서로 다른 두 개의 브랜치를 합치는 명령어
- merge 명령어는 두 개의 부모를 가리키는 특별한 커밋을 만들어냄(이 커밋을 머지 커밋이라고 함)
rebase
- merge 말고 두 브랜치끼리 작업을 접목하는 방법
- rebase를 하면 원래 있던 커밋은 다른 곳에 가고 rebase 대상 커밋이 부모가 되는 커밋을 만듦
- 커밋들을 모아서 복사한 뒤 다른 곳에 떨궈 놓는 것임
- 커밋들의 흐름을 보기 좋게 한 줄로 만들기 위해 사용
- -i 옵션 사용 시 cherry-pick과 유사하지만 UI로 복사할 커밋과 순서 선택가
HEAD
- HEAD는 현재 체크아웃된 커밋(현재 작업중인 커밋)을 가리키는 포인터
- 일반적으로 브랜치의 이름을 가리킴
- switch 명령어로 HEAD를 브랜치가 아닌 커밋을 가리키게 할 수도 있음
상대 참조
- 각 커밋들은 해시값을 가지고 있음
- 하지만 해시값은 매우 길어서 일일이 git log로 확인하기 불편함
- 특정 지점(브랜치 혹은 HEAD)에서 상대 위치로 움직일 수 있는 방법이 있음
- {특정 지점}^{num}: 커밋 트리의 부모로 이동, 부모가 여러 개일 때는 num이 있으면 num번째 부모로 이
- {특정 지점}~{num}: num번째 위에 있는 부모로 이동
변경사항 되돌리기
- reset랑 revert가 있음
- reset는 브랜치가 예전 커밋을 가리키게 하는것
- 애초에 커밋하지 않은 것 처럼 보이게됨
- revert는 현재 커밋을 되돌리는 것 처럼 동작하는 새 커밋을 만듦
- 로컬에서는 reset을 사용할 수 있지만 다른 사람과 협업하려면 revert을 사용해야함(history를 날려버리지 않기 하기 위해)
cherry-pick
git cherry-pick <commit1> <commit2> <…>
- HEAD 아래에 있는 일련의 커밋에 대한 복사본을 만들겠다는 것
- 인자로 주어진 커밋을 복사해 자식으로 만듦
tag
- 브랜치는 커밋의 참조이지만 임시적인 것임
- const 참조가 필요할 때(릴리즈 버전, 큰 merge) 등 사용하는 것이 tag
- describe <ref> 명령어로 가장 가까운 부모 태그를 알아낼 수 있음