Git 5. 브랜치
1. 브랜치
프로젝트를 독립적으로 관리하는데 사용한다. 버그 수정과 새로운 기능을 구현할 때마다 작업 폴더를 복사하는 것은 프로젝트를 유지 관리하는 측면에서 좋지 않기 때문에 기존 코드와 분리해서 작업할 수 있는 브랜치를 사용한다.
1) 깃 브랜치의 특징
- 가상 폴더
- 깃의 브랜치는 실제로 작업 폴더를 복사하지 않고 가상 폴더로 생성한다. 따라서 외부적으로는 물리적인 파일 하나만 있는 것으로 보인다. 브랜치로 생성된 가상 폴더는 빠르게 공간 이동이 가능해 쉽게 브랜치를 이동하면서 프로젝트를 수행할 수 있다.
- 독립적인 동작
- 원본 폴더와 분리하여 독립적으로 개발 작업을 수행할 수 있다. 분리된 브랜치에서 소스 코드를 각자 수정한 후 원본 코드에 병합하는 명령만 실행하면 된다.
- 빠른 동작
- Blob 개념을 도입하여 내부를 구조화한다. 따라서 다른 버전 관리 도구보다 가볍고 브랜치 전환이 빠르다.
- 브랜치 명령을 사용하면 내부적으로 커밋을 하나 생성하여 브랜치로 할당한다. 다른 버전 관리 시스템은 폴더의 파일 전체를 복사하는 반면, 깃은 해시 파일 하나만 만들면 된다.
2. 브랜치 생성
- 새 브랜치를 생성하면 포인터만 있는 브랜치가 생성된다. 브랜치는 깃에서 또 하나의 개발 분기점을 의미한다. 새로운 개발 분기점이 필요할 대 브랜치를 추가로 생성한다.
- 브랜치 이름만 입력하면 현재 HEAD 포인터를 기준으로 새로운 브랜치를 생성하고, 직접 커밋 ID를 지정하면 지정한 커밋 ID를 기준으로 브랜치를 생성한다.
$ git branch 브랜치이름 커밋 ID
✅ 브랜치 이름 작성 규칙
- 기호(
-
)로 시작할 수 없다. - 마침표
.
)로 시작할 수 없다. - 연속적인 마침표(
..
)를 포함할 수 없다. - 빈칸, 공백 문자, 물결(
~
), 캐럿(^
), 물음표(?
), 별표(*
), 대괄호([]
) 등은 포함할 수 없다. - 아스키 제어 문자는 포함할 수 없다.
- 중복해서 사용하지 않아야 한다.
✅ 브랜치 생성 과정 예시
$ git add branch.html // 추적 등록
$ git commit -m "first" // 커밋 작성
[master (root-commit) cc66412] first
1 file changed, 1 insertion(+)
create mode 100913 branch.html
$ git branch footer // 브랜치 생성
$ git branch
footer // 생성된 브랜치
* master // 현재 브랜치
✅ 브랜치 이름 수정
$ git branch -m 원래브랜치이름 새로운브랜치이름
3. 브랜치 확인
$ git branch
* feature
footer
master
별표(*
)는 현재 선택된 브랜치를 의미한다.
브랜치 해시 - rev-parse
-> 브랜치는 특정한 커밋의 해시 값을 가리킨다.rev-parse
명령어를 사용하면 현재 브랜치가 어떤 커밋 해시 값을 가리키는지 확인할 수 있다.
$ git log // 로그 확인
commit d329083250298fad8790ad0f98s (HEAD -> feature, master, footer)
Author: hanmihyeon <[email protected]>
Date: Fri Feb 11 10:07:02 2022 + 0900
first
$ git rev-parse footer
d329083250298fad8790ad0f98s // footer 브랜치의 커밋 해시
브랜치의 해시 값과 브랜치를 생성한 기준 커밋의 해시 값이 동일하다.
브랜치의 세부사항 확인
$ git branch -v
* feature d23222c first
footer d23222c first
master d23222c first
4. 브랜치 이동
1) 체크아웃
현재 브랜치를 떠나 새로운 브랜치로 들어간다.
$ git checkout 브랜치이름
$ git checkout - // 이전 브랜치로 이동
- 깃은 하나의 워킹 디렉토리만 가지고 있어 선택한 브랜치 하나만 연결되어 있다. 즉, 한 브랜치에서만 작업과 커밋을 할 수 있다. 따라서 다른 브랜치에서 작업하려면 반드시 브랜치를 변경하여 워킹 디렉토리를 재설정해야 한다.
5. 브랜치 공간
로그를 확인할 때 브랜치의 흐름도 보기 위해 --graph
명령어를 사용한다.
--graph --all
옵션을 사용하면 모든 로그를 출력한다.
$ git log --graph --all
$ git show-branch --more=10 // 출력될 커밋 개수 10개로 제한
6. HEAD 포인터
-
마지막 커밋 : 깃은 마지막 커밋 정보를 기반으로 새로운 커밋을 생성한다. 마지막 커밋은 새로운 커밋의 부모 커밋. 시스템이 매번 커밋할 때마다 마지막 커밋 정보를 찾으면 부하가 발생하기 때문에, 마지막 커밋을 쉽게 확인할 수 있도록 특수한 포인터를 제공한다.
HEAD
는 작업중인 브랜치의 마지막 커밋 ID를 가리키는 참조 포인터이다. 깃은 마지막 커밋을 가리키는 HEAD 포인터를 부모 커밋으로 대체하여 사용한다. -
각각의 브랜치마다 마지막 커밋이 다르기 때문에 브랜치가 여러 개면 HEAD 포인터도 여러 개이다.
7. 생성과 이동
1) 브랜치 생성 및 이동
$ git checkout -b 브랜치이름
// 예시
$ git checkout -b hotfix
Switched to a new branch 'hotfix'
$ git branch -v // 브랜치 목록
feature d84755c first
footer d84755c first
* hotfix dcdb1c1 master working.. // 현재 브랜치
master dcdb1c1 master working.. // 브랜치 생성만 했기 때문에 같은 커밋 ID를 가리킴
커밋 이동
브랜치 이름은 커밋 해시키와 동일하기 때문에 브랜치 이름 대신 커밋 해시키를 사용하여 체크아웃할 수 있다.
$ git checkout 커밋해시키
HEAD를 사용한 이동
// 바로 이전 커밋으로 체크아웃 할 때
$ git checkout HEAD~1 // 현재의 한 단계 전
※ 커밋 해시키 또는 HEAD를 사용하여 과거의 커밋으로 체크아웃했을 때 다시 현재 시점으로 돌아와야 한다.
$ git chekcout - // 이전 브랜치로 이동
$ git checkout master // 특정 브랜치로 복귀
8. 원격 브랜치
- 리모트 브랜치
- 원격 저장소에 생성한 브랜치, 로컬 저장소에 새로운 브랜치를 생성해도 원격 저장소에 자동으로 브랜치가 생성되지 않는다. 그러므로 별도 명령을 실행하여 저장소를 동기화 해야 한다.
- 브랜치 추적(트래킹 브랜치)
- 원격 저장소의 브랜치를 가리키는 것, 추적 브랜치는 원격 브랜치의 마지막 커밋 해시 값을 가리킨다. 이 포인터 정보는 .git/refs 폴더 안에 저장되어 있다.
- 브랜치 업로드
1) 푸시
$ git push 원격저장소별칭 브랜치이름
// 예시
$ git push -u origin master // 선택한 브랜치(master)를 원격 서버(origin)로 전달한다
2) 브랜치를 원격 저장소에 등록
$ git push -u origin hotfix // hotfix 브랜치 전송
✅ 이름이 다른 브랜치
- 일반적으로 로컬 저장소와 원격 저장소의 브랜치 이름은 동일하게 사용하지만, 다른 개발자가 만든 원격 서버의 브랜치를 테스트하려고 할 때 자신의 브랜치 이름과 동일하면 충돌이 생긴다. 이때 서로 다른 로컬 브랜치와 리모트 브랜치를 수동으로 지정하여 연결할 수 있다. 브랜치를 직접 수동으로 지정할 때는 콜론(:)으로 구분한다.
$ git push origin 브랜치이름:새로운브랜치
// 예시
$ git push -u origin feature:function
✅ 업스트림 트래킹
- 브랜치 추적을 다르게 표현한 것으로 로컬 저장소의 브랜치와 원격 저장소의 브랜치는 업로드 할 수 있도록 매칭되어 있는데 이러한 매칭을 업스트림 트래킹이라 한다. 트래킹 브랜치는 리모트 브랜치와 로컬 브랜치를 연결해 주는 중간 다리 역할을 한다.
원격 저장소의 리모트 브랜치 목록 확인
$ git branch -r
모든 브랜치 정보 확인
$ git branch -a
트래킹 브랜치 확인
$ git branch -vv
새로운 업스트림 생성
$ git checkout --track origin/브랜치이름
// 예시
$ git checkout --track origin/fucntion
- 원격 브랜치 복사
$ git checkout -b 새이름 origin/브랜치이름
1) 원격 브랜치 생성
2) 원격 저장소의 브랜치 정보를 로컬 저장소로 가져온다.
$ git fetch // 브랜치 커밋 가져오기
From http://gitub.com/hanmihyeon/gitstudy06
* [new branch] aaa -> origin/aaa
$ git branch -r // 원격 브랜치 확인
origin/aaa
origin/function
origin/hotfix
origin/master
$ git checkout -b aaa origin/aaa // 브랜치 생성 및 이동
Switched to a new branch 'aaa'
Branch 'aaa' set up to track remote branch 'aaa' from 'origin'.
- 업스트림 연결
기존 브랜치를 업스트림으로 직접 설정할 수도 있다. 브랜치를 생성한 후 직접 트래킹 브랜치를 지정. 업스트림을 직접 설정하면 원격 저장소로 트래킹 브랜치가 설정된다.
*-u : --set-upstream-to의 약자로 기존 브랜치를 특정 원격 브랜치로 추적
$ git branch -u origin/브랜치이름
9. 브랜치 전송
로컬 저장소의 브랜치를 원격 저장소로 전송하는 다른 방법
1) 브랜치 푸시
- 푸시 작업은 파일 뿐만 아니라 브랜치 정보와 커밋까지 모두 전송한다.
2) 브랜치 페치
- 원격 저장소에서 리모트 브랜치 내용을 내려받기만 하고 자동으로 병합하진 않는다. 리모트 브랜치가 페치되면 깃은 단순히 원격저장소별칭/브랜치 포인터만 생성한다. 따라서 원격 저장소에서 페치된 커밋들을 새로운 로컬 브랜치로 반영하려면 병합 명령을 실행해야 한다.
$ git merge 원격저장소별칭/브랜치이름
// 브랜치 병합하지 않고 테스트만 할 때
$ git checkout -b 임시브랜치이름 origin/브랜치이름
10. 브랜치 삭제
✅ 현재 자신이 있는 브랜치는 삭제할 수 없다!
// 일반적인 삭제 방법, 스테이지 상태가 깨끗할 때만 사용
$ git branch -d 브랜치이름
// 강제 삭제
$ git branch -D 브랜치이름
// 리모트 브랜치 삭제
$ git push origin --delete 리모트브랜치이름
😳 혹시 틀린 부분이 있다면 댓글 남겨주세요!
Author And Source
이 문제에 관하여(Git 5. 브랜치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@1015mh/Git-5.-브랜치저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)