브랜치

새로운 작업

브랜치 작업

원본은 기반으로 새로운 사본에 기능을 추가할 수 있다.

깃 브랜치 특징

  • 가상 폴더
    • 깃의 브랜치는 작업 폴더를 실제로 복사하는 것이 아닌 가상 폴더로 생성
  • 독립적인 동작
    • 원본 폴더와 독립적으로 개발 작업 수행
  • 빠른 동작
    • 깃은 Blob 개념을 도입하여 내부를 구조화, 포인터를 이동하여 빠르게 전환 가능.
    • 브랜치 명령을 사용하면 내부적으로 커밋을 하나 생성하여 브랜치로 할당

실습준비

저장소 생성 및 초기화

원격 저장소 하나를 생성 및 초기화

기본 브랜치

기본적으로 생성 시, master 브랜치가 생성됨.

# 현재 브랜치 확인.
git branch

브랜치 생성

브랜치는 공통된 커밋을 가리키는 지점. 커밋처럼 SHA1 해시 키를 가리킴.

해시 키는 너무 길고 알아보기 힘들어, 특정 커밋을 가리키는 별칭을 만들어 가리키게됨 → 이것이 브랜치.

새 브랜치를 생성하면 포인터만 있는 브랜치가 생성됨.

일반적으로 브랜치 생성 명령을 실행하면 현재 커밋을 가리키는 HEAD 기준으로 생성됨.

  • 그렇다면 언제 실제 브랜치를 생성하나?
    • 생성된 브랜치로 이동하여 첫 추가 커밋이 발생하는 경우, 브랜치는 새로운 커밋으로 브랜치의 포인터를 이동 시킨다. 즉, 브랜치는 실제 커밋이 추가될 때 생성된다.

브랜치 생성

# 브랜치 이름만 인자 값으로 하면 HEAD 포인터 기준으로 생성
# 추가로 커밋 ID를 인자로 주게 되면, 해당 커밋을 기준으로 생성
git branch 브랜치이름 커밋ID

브랜치 이름

브랜치 이름은 중복되지 않아야 한다.

소스트리 브랜치

브랜치 확인

간단 브랜치 목록

git branch 명령으로 브랜치 목록 조회 가능.

dk@Chiptune gitstudy04 % git branch
* master

별표는 현재 선택된 브랜치를 의미.

브랜치 해시

브랜치는 특정한 커밋 SHA1 값을 가리킨다.

rev-parse를 사용하면 현재 브랜치가 어떤 커밋 해시 값을 가리키는지 확인할 수 있다.

dk@Chiptune gitstudy04 % git rev-parse master
0a71b28b7be16ae41c66ef8573c92c760ddea427

브랜치의 해시 값과 브랜치를 생성한 기준 커밋의 해시 값이 동일하다는 것을 확인할 수 있다.

브랜치 세부사항 확인

branch 명령 뒤에 -v 또는 -verbose 옵션을 사용하면 브랜치 정보를 볼 수 있다.

dk@Chiptune gitstudy04 % git branch -v       
* master 0a71b28 123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123

브랜치 이동

체크아웃

현재 브랜치를 떠나 새로운 브랜치로 이동한다.

git checkout 브랜치이름

깃은 하나의 워킹 디렉토리만 가지고 있다. 따라서, 다른 브랜치에서 작업하려면 브랜치를 변경하여 워킹 디렉토리를 재설정 해야 한다.

  • 워킹 디렉토리에 커밋하지 않은 내용이 있다면 브랜치를 변경할 수 없다.
  • 체크아웃은 브랜치 외에 특정 커밋이나 파일로도 할 수 있다.
git checkout 브랜치이름
git checkout -- 파일이름

브랜치 동작 원리

  • 브랜치를 이동하면 HEAD 포인터도 함께 이동한다.
  • 기존 브랜치의 워킹 디렉토리를 정리해야 한다.

소스트리

이전 브랜치

쉽게 이전 브랜치로 이동하려면 ‘-’ 를 사용한다.

git checkout -

워킹 디렉터리 정리

충돌 방지를 위해 워킹 디렉터리에 작업이 남아 있다면 경고 메세지를 보여 주고 브랜치를 변경할 수 없게 제한한다.

작업된 워킹 디렉터리를 커밋하지 않고 브랜치를 변경할 때는 스태시 기능을 이용한다.

브랜치 공간

브랜치 로그

로그를 출력할 때 브랜치 흐름도 같이 보려면 —graph —all 옵션을 사용한다.

git log --graph --all

[dk@Chiptune gitstudy04 % git log --graph --all
* commit 0a71b28b7be16ae41c66ef8573c92c760ddea427 (HEAD -> master)
| Author: Chiptune93 <eoen012@gmail.com>
| Date:   Sun Jun 11 03:45:47 2023 +0900
| 
|     123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123123
| 
* commit 00dc0e8460420f9b6ddfea00f27310f1ffd63b39
| Author: Chiptune93 <eoen012@gmail.com>
| Date:   Sun Jun 11 03:42:01 2023 +0900
| 
|     second
| 
* commit ba79b88755858bc0458fae0b5ef050ea81a03aa2
| Author: Chiptune93 <eoen012@gmail.com>
| Date:   Sun Jun 11 03:34:00 2023 +0900
| 
|     first
| 
* commit 25e213f01db70b974910b3c15177c926b73dd306

more 옵션으로 출력될 커밋 개수를 제한할 수 있다.

git show-branch --more=10

브랜치 소스 확인

HEAD 포인터

마지막 커밋

깃은 마지막 커밋 정보가 중요하다.

깃은 마지막 커밋 정보를 기반으로 새로운 커밋을 생성한다.

깃은 마지막 커밋 정보를 가리키는 HEAD 포인터를 부모 커밋으로 대체하여 사용한다.

브랜치 HEAD

브랜치를 이동하면 HEAD 포인트도 이동된다.

dk@Chiptune gitstudy04 % git checkout first
'first' 브랜치로 전환합니다
dk@Chiptune gitstudy04 % git log
commit 0a71b28b7be16ae41c66ef8573c92c760ddea427 **(HEAD -> first, master)**
Author: Chiptune93 <eoen012@gmail.com>
Date:   Sun Jun 11 03:45:47 2023 +0900

소스트리 HEAD

상대적 위치

깃의 다양한 명령어를 입력할 때도 기준점으로 삼음.

상태적 커밋 위치를 지정할 떄는 캐럿(^)과 물결(~) 기호를 같이 사용한다.

이 기호들은 HEAD를 기준으로 몇 번째 인지 상대적인 위치를 지정합니다.

기호 하나당 하나의 상대적위치 이기 때문에 HEAD^^^, HEAD~~~ 로 사용한다. (이 의미는 HEAD 기준 이전 3개 위치를 나타낸다.)

AHEAD, BHEAD

HEAD 앞에 A,B 가 붙은 포인터, 각각 로컬 저장소의 HEAD와 원격 저장소의 HEAD를 가리킨다.

깃은 항상 원격과 로컬의 HEAD를 비교한다.

  • AHEAD
    • 서버로 전송되지 않은 로컬 커밋이 있는 것.
    • 새로운 커밋을 원격에 전달하지 않으면 발생한다.
    • 로컬 브랜치에 있는 커밋이 서버의 커밋 개수보다 많은 경우 발생.
  • BHEAD
    • 로컬 저장소로 내려받지 않은 커밋이 있는 것.
    • 원격 저장소의 커밋이 자신의 로컬 저장소보다 더 최신 상태인 것.

생성과 이동

자동 이동 옵션

깃은 브랜치 생성과 이동을 한 번에 처리하는 옵션을 제공

git checkout -b 브랜치이름

커밋 이동

브랜치 이름은 커밋 해시키와 동일하다. 커밋 해시키를 사용하여 체크아웃 할 수 있다.

# 해시키 앞의 7자리만 사용해도 무방하다.
git checkout 커밋해시키

중간에 작업한 특정 커밋으로 이동하여 내용을 확인 할 수 있다.

HEAD를 활용한 이동

HEAD 포인터를 사용하여 체크아웃 할 수 있다.

# 마지막 커밋인 HEAD 기준으로 1단계 커밋 전으로 이동
git checkout HEAD-1

# 여러 단계의 경우 숫자만 바꾸면 됨.
git checkout HEAD-5

돌아오기

간단하게 다시 돌아오려면 ‘-’ 를 사용

# 빠르게 바로 이전 브랜치로 복귀
git checkout -

# 특정 브랜치로 복귀
git checkout master

원격 브랜치

리모트 브랜치

원격 저장소에 생성한 브랜치를 리모트 브랜치라고 함.

로컬에서 생성한다고 바로 원격에도 생성되는 것이 아니기 때문에 동기화 작업을 거쳐야 함.

보통 ‘별칭/브랜치이름’ 형태를 가짐.

실습 준비

브랜치 추적

원격 저장소의 브랜치를 가리키는 것을 브랜치 추적이라고 함.

트래킹 브랜치는 원격 브랜치의 마지막 해시 값을 가리킨다. 이 포인터 정보는 ‘.git/refs’ 폴더 안에 저장된다.

로컬 저장소가 원격 저장소와 연결될 때 원격 브랜치의 트래킹 정보는 자동으로 갱신 된다, 로컬 저장소는 마지막으로 연결된 리모트 브랜치의 커밋 해시 값을 항상 가지고 있다.

브랜치 업로드

리모트 브랜치는 서버간에 통신을 하고 나서 생성됨.

# 등록된 원격 저장소의 리모트 브랜치 확인
git remote show 브랜치 이름

# 푸시 작업을 진행하여 동기화 
git push 원격저장소별칭 브랜치이름

# 자주 사용하는 명령
# 선택된 브랜치(master)를 원격 서버(origin)로 전달한다.
git push -u origin master

이름이 다른 브랜치

깃은 서로 다른 로컬 브랜치와 리모트 브랜치를 수동으로 지정하여 연결할 수 있다.

수동으로 지정할 때는 콜론(:)을 사용한다.

git push origin 브랜치이름:새로운브랜치

# 다른 이름으로 원격에 브랜치 전송
git push -u origin feature:fiction

업스트림 트래킹

브랜치 추적을 다르게 표현한 것. 로컬 저장소의 브랜치와 원격 저장소의 브랜치는 업로드할 수 있도록 매칭되어 있다.

이러한 매칭을 업스트림 매칭이라고 한다.

트래킹 브랜치는 리모트 브랜치와 로컬 브랜치를 연결해 주는 중간 다리 역할을 한다.

# 원격 저장소의 리모트 브랜치 목록 확인
git branch -r

# 모든 브랜치 정보를 확인.
git branch -a

# 복제 저장소의 트래킹 브랜치를 확인
git branch -vv

로컬에 복제한 브랜치가 원격 브랜치와 업스트림 트래킹 된 것을 확인할 수 있다.

# 새로운 업스트림 트래킹 생성
git checkout --track origin/브랜치이름

이 상태에서 브랜치에서 작업 후, 등록 및 커밋을 하고 다시 브랜치 정보를 확인하면

‘AHEAD 1’ 이 표시된다. 원격 저장소로 커밋을 전송하지 않은게 하나 있다는 의미이다.

원격 저장소의 브랜치와 로컬 브랜치가 이름이 다르지만 로컬에서 원격 저장소로 브랜치를 전송할 때

이름을 변경하여 전송한 경우, 다시 로컬 브랜치에서 pull을 받으면 원격 브랜치에 전송된 내용을 내려받는다.

원격 브랜치 복사

원격 브랜치를 로컬 저장소에 이름을 변경하여 복사하기.

git checkout -b 새이름 origin/브랜치이름

업스트림 연결

기존에 있는 브랜치를 업스트림으로 직접 설정 가능. 원격 저장소로 트래킹 브랜치가 설정된다.

git branch -u origin/브랜치이름

기존 브랜치를 특정 원격 브랜치로 추적한다.

브랜치 전송

브랜치 푸시

처음에는 커밋과 브랜치를 푸시하는 데 업스트림 설정이 필요함.

원격 저장소 연결 만으로 업스트림이 자동으로 설정 되지는 않는다.

# 현재 브랜치를 origin/master에 업스트림 연결 후, 푸시를 하겠다.
git push --set-upstream origin master

브랜치 페치

리모트 브랜치를 페치한다고 자동으로 로컬 저장소에 새로운 브랜치가 생성되지는 않는다.

원격 저장소에서 리모트 브랜치 내용을 내려받기만 할 뿐, 병합하지는 않기 떄문.

새로운 로컬 브랜치로 반영하려면 병합 명령을 실행해야 한다.

# 원격 저장소 브랜치를 로컬에 자동 병합
git merge 원격저장소별칭/브랜치이름

# 병합하지 않고 새 브랜치로 내려받기
git checkout -b 임시브랜치이름 origin/브랜치이름

브랜치 삭제

현재 자신이 있는 브랜치는 삭제할 수 없다.

일반적인 삭제 방법

-d 옵션은 스테이지 상태가 깨끗할 때만 삭제를 허용

git branch -d 브랜치이름

강제로 삭제하는 방법

push 하지 않은 상태에서 커밋이 남아있다면 브랜치는 삭제되지 않음.

따라서, 강제 삭제 옵션을 주어 삭제해야 한다.

git branch -D 브랜치이름

소스트리에서 삭제하는 방법

리모트 브랜치를 삭제하는 방법

삭제 명령을 푸시 해야 한다.

git push origin --delete 리모트브랜치이름

© 2024. Chiptune93 All rights reserved.