Git 5. 브랜치

한미현·2022년 2월 14일
0

Git

목록 보기
5/12
post-thumbnail

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 <mh@mail.com>
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 리모트브랜치이름

😳 혹시 틀린 부분이 있다면 댓글 남겨주세요!

profile
FE Developer

0개의 댓글

관련 채용 정보