Git 5. 브랜치

7924 단어 gitgit

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 리모트브랜치이름

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

좋은 웹페이지 즐겨찾기