Git 데이터 개체
- Blob: 개별 파일에 대한 스냅샷
- 트리 개체: 파일과 디렉토리 구조가 담긴 개체 (디렉토리)
- 커밋 개체: 메타데이터 및 루트 트리를 가리키는 포인터
커밋 개체
- parent에는 이전 커밋의 해시값이 들어간다.
- git이 포인터로 어떤 커밋을 가리킬 때, 커밋 객체의 루트 트리를 기반으로 스냅샷을 복구한다.
- git이 사용하는 포인트 이름이 HEAD.
- HEAD는 현재 작업 중인 브랜치를 가리킨다.
- 만약 HEAD가 브랜치가 아닌 특정 커밋을 가리키면 이를 Detached 됐다고 한다.
브랜치
- 필요 시 기존 코드에서 독립적으로 개발할 수 있게 스냅샷을 분리한 것
- 매우 가볍다
- HEAD가 이동할 수 있는 이정표의 역할을 함
- 기본 브랜치는 main(master)
브랜치와 태그의 차이
- 둘 다 HEAD가 이동할 수 있는 이정표의 역할을 하긴 함
- 브랜치는 가변적 포인터를 제공해서 커밋을 따라 움직인다
- 태그는 특정 커밋에 고정된 포인터를 제공한다.
브랜치 workflow
- Long-Running 브랜치: 안정적으로 장기간에 걸쳐 사용하는 브랜치 (main 등)
- 토픽 브랜치: 어떤 주제를 위해 만든 단기간용 브랜치 (iss 등)
관련 명령어
- git branch: 브랜치 목록을 확인한다.
- git branch -v: 브랜치 별 최신 커밋 메시지 확인
- git branch <branch>: 새 브랜치를 생성한다.
- git checkout <branch>: HEAD가 바라보는 브랜치를 변경한다.
- git checkout -b <brancn>: 새 브랜치 생성 후 checkout
- git branch -d <branch>: 브랜치 삭제
- git log --oneline --decorate --graph --all: 브랜치 히스토리 확인 가능
Merge
- Fast-forward merge: 병합하려는 브랜치가 현재 브랜치 기반이라면, merge가 단순히 최신 커밋으로 이동하는 것
- 3-way merge: 병합하려는 브랜치가 현재 브랜치 기반이 아니라면, 두 브랜치의 최소 공통 조상을 기반으로 두 브랜치의 충돌 내용을 merge하는 것
- 3-way merge의 경우, merge의 결과물이 새로운 커밋(merge commit)이 된다.
- 두 브랜치의 변경 내역이 충돌(conflict)이 일어나지 않더라도 3-way merge이다. 그러나 git이 자동으로 merge를 진행한다.
- 충돌이 일어났다면, unmerged file(충돌난 파일)에 대해 git이 자동으로 충돌 부분을 알려줌
- 충돌난 파일을 수동으로 고치고 add, commit하면 충돌 해결
- merge 도구를 사용하면 ui도 편하고 add도 자동으로 되므로 잘 이용할 것
관련 명령어
- git branch --merged: merge된 브랜치 확인
- git branch --no-merged: merge되지 않은 브랜치 확인
- git branch -D <branch>: no-merged branch를 강제로 삭제
Remote Tracking Branch
- 리모트 저장소로부터 받아온 커밋 내역 브랜치
- <remote>/<branch> 형식의 이름
- remote와 연결된 그 순간의 스냅샷. 자동 갱신되지 않음
- 해당 브랜치는 수정할 수 없고, 로컬에서 merge하는 용도로 사용한다.
관련 명령어
- git fetch <remote> <branch>: remote 브랜치의 최신 내역 가져옴 (merge 별도)
- git pull <remote> <branch>: remote 브랜치의 최신 내역을 가져오고 merge함
- git push <remote> <branch>: 로컬 브랜치와 동명인 리모트 브랜치에 내용을 push
- git push <remote> --delete <branch>: 로컬 브랜치와 동명인 리모트 브랜치를 삭제
Tracking Branch
- 리모트 브랜치와 연결된 로컬 브랜치
- 해당 브랜치로 pull / push 명령을 내리면 리모트 브랜치에 영향을 준다.
Remote Tracking Branch와 Tracking Branch의 차이
- 둘 다 원격 브랜치를 추적하는 것은 맞음
- Remote Tracking Branch는 Remote Branch지만 읽기 전용으로 로컬에 두는 것
- Tracking Branch는 Remote Branch와 연결되어 로컬 브랜치로 존재하는 것.
관련 명령어
- git checkout -b <branch> <remote branch>: 설정한 branch의 이름으로 remote branch와 연결된 tracking branch를 생성
- git checkout <branch>: remote branch에는 있지만 로컬에는 동명의 branch가 없는 경우, 자동으로 tracking branch로 생성 후 checkout
- git branch -u <remote branch>: 현재 로컬 branch를 tracking branch로 변경
- git push -u <remote> <branch>: 현재 로컬 branch를 tracking branch로 변경 후 push
- git branch -vv: 로컬 브랜치에 대해 tracking branch가 어떻게 설정되어 있는지 확인
'GitOps > Git' 카테고리의 다른 글
[Git] Git Flow (0) | 2025.01.07 |
---|---|
[Git] 기초 및 명령어 (0) | 2024.12.30 |
[Git] 개념 (0) | 2024.12.20 |
[Git] Github flow 실습: Member편 (0) | 2024.06.24 |
[Git] Github flow 실습: Owner편 (0) | 2024.06.24 |