Branch
- 나뭇가지, 지사, 분점 등 줄기 하나에서 뻗어나온 갈림길을 의미한다.
- 저장공간 하나에서 가상의 또 다른 저장 공간을 만드는 것이다.
Branch 특징
- 가상 폴더
- 작업 폴더를 실제로 복사하지 않고, 가상 폴더로 생성한다.
- 외부적으로는 물리적인 파일 하나만 있는 것으로 보인다.
- 독립적인 동작
- 원본 폴더와 분리하여 독립적으로 개발 작업을 수행할 수 있다.
- 분리된 코드를 좀 더 쉽게 병합할 수 있다.
- 빠른 동작
- 다른 버전관리 도구에 비해 가볍고 전환이 빠르다. 왜냐하면 Blob 개념을 도입하여 내부를 구조화 하기 때문이다. Blob는 포인트와 유사한 객체이며, 이 포인터를 이용해 빠르게 전환이 가능하다.
- (참조 : https://ko.wikipedia.org/wiki/%ED%8F%AC%EC%9D%B8%ED%84%B0_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D))
Branch 생성
- 공통된 커밋을 가리키는 지점
- 커밋처럼 SHA1 해시키를 가리킨다.
- SHA1 해시키는 기억하기 어려워 특정 커밋을 가리키는 `별칭`을 만든다.
- 기존 브랜치 또는 커밋에 새로운 연결고리를 하나 더 만드는 것
- 브랜치를 생성한다는 것은 `분기점`을 의미한다.(생성에 제한은 없음)
- 현재 `HEAD` 기준으로 새로운 브랜치가 생성된다.
- 커밋 ID를 지정할 시, 지정한 `커밋ID`를 기준으로 브랜치를 생성한다.
- 실제 브랜치 생성 시점은 커밋이 추가될때 생성된다.
$ git branch 브랜치이름 커밋ID
Branch 이름
- 알기 쉬운 이름으로 짓기
- 깃 플로우에서 정의한 브랜치 이름을 적용
- master : 제품으로 출시될 수 있는 브랜치
- feature : 기능을 개발하는 브랜치
- hotfix : 출시 버전에서 발생한 버그를 수정 하는 브랜치
- release : 이번 출시 버전을 준비하는 브랜치
- develop : 다음 출시 버전을 개발하는 브랜치
- 슬래시(/)를 사용해 계층구조로 만들어 사용할 수 있음
- 브랜치 이름은 중복해서 사용하지 않아야함
- branch 이름 제한
- 기호(-)로 시작할 수 없음
- 연속적인 마침표(..) 포함할 수 없음
- 아스키 제어 문자는 포함할 수 없음
- 빈칸, 공백문자, 물결(~), 캐럿(^), 물음표(?), 별표(*), 대괄호([]) 등은 포함할 수 없음
- 마침표(.)로 시작할 수 없음
Branch 확인
- 간단한 브랜치 목록을 보기 명령어
- 별 * 표시가 된 브랜치는 현재 선택된 브랜치를 의미(내가 보고 있는 브랜치)
$ git branch
Branch hash
- 특정한 커밋의 해시(SHA1)사용한다.
- 아래 명령어는 현재 브랜치가 어떤 커밋 해시 값(SHA1)을 가리키는지 확인할 수 있다.
$ git -h
Branch 세부 사항 확인하기
- 옵션을 사용하면 상세한 브랜치 정보를 확인할 수 있다.
- branch 명령어 뒤에 `-v`, `-verbose` 옵션을 함께 사용하면 브랜치 이름, 커밋ID, 커밋 메시지를 확인할 수 있다.
$ git branch -v
$ git branch --verbose
Branch 이동
- - 명령어로 생성하거나 비트버킷으로 브랜치를 생성하게 되면, 브랜치가 자동으로 이동 되지 않는다.
- - 따라서 `git fetch` 명령어를 입력해 현재 저장소 상태를 업데이트 해주고 `checkout` 해아한다.
$ git fetch
$ git checkout 브랜치명
- - 현재 브랜치를 떠나 새로운 브랜치로 들어간다는 의미한다.
- - 깃은 하나의 워킹 디렉터리만 가지고 있다.
- - 한 브랜치에서만 작업과 커밋을 할 수 있다.
Branch 동작 원리
- HEAD 정보는 항상 변경된 브랜치의 마지막 커밋을 가리킨다.
- HEAD 는 브랜치의 마지막 커밋을 의미하기 때문에 브랜치가 이동하려면 HEAD 포인터도 함게 이동한다.
- 다른 브랜치로 이동하려면 기존 브랜치의 워킹디렉터리를 정리해야 이동할 수 있다.
Branch 로그
- --graph, --graph --all 과 같은 옵션을 사용할 수 있다.
- --more 옵션으로 출력될 커밋 개수를 제한할 수도 있음
$ git log
$ git log --graph // 인텔리제이나 vscode나 소스트리에서 제공해주는 흐름도 확인이 가능
$ git log --graph --all // 브랜치의 모든 로그를 확인할 수 있음
$ git log show-branch --more=10
HEAD 포인터
- 마지막 커밋 : `HEAD`
- 브랜치를 이동하면 HEAD 포인트도 이동된다.
- 브랜치가 여러개면 HEAD 포인트도 여러개 이다.
AHEAD, BHEAD
- AHEAD, BHEAD 앞에 A, B가 붙은 포인터도 있다.
- 서로 다른 커밋을 가리키는 HEAD 포인터를 가진다는 의미한다.
- AHEAD : 서버로 전송되지 않은 로컬 커밋이 있는것 -> 로컬 브랜치가 앞서 있는것
- BHEAD : 로컬 저장소로 아직 내려받지 않은 커밋이 있는것 -> 로컬 브랜치가 뒤쳐져 있는것
생성과 이동
- 생성과 이동은 별개의 동작 branch, checkout 명령어가 구분되어 있다.
- 자동 이동 옵션 : -b` 옵션을 사용하면 브랜치 생성과 이동을 한 번에 할 수 있다.
- 커밋 이동 : 커밋 해시값을 입력하면 체크아웃 할 수 있다.
- HEAD 를 활용한 이동 : 좀 더 간편한 방법으로 HEAD 포인터를 사용해 체크아웃도 가능하다.
$ git checkout -b 브랜치명
$ git checkout d87466c
$ git checkout HEAD-1 // 현재를 기준으로 한단계 전
$ git checkout HEAD-숫자 // 숫자영역을 입력하면 여러단계 이전으로 이동 가능
'Git' 카테고리의 다른 글
[Git 교과서] 7장 Stash (0) | 2023.06.15 |
---|---|
[Git 교과서] 6장-2 Branch (0) | 2023.06.03 |
[Git 교과서] 5장 서버 (0) | 2023.05.24 |
[Git 교과서] 4장 커밋 (1) | 2023.05.11 |
[Git 교과서] 3장 깃 개념 잡기 (0) | 2023.05.02 |