[Git] branch란?

tabi·2023년 7월 2일
0

Git

목록 보기
3/3
post-thumbnail

Git의 branch에 대해 알아보자.

1. branch 이해하기

  • Git에 push를 하고 나면 내 프로젝트의 default branch가 main 혹은 master로 표시되는 것을 확인할 수 있다.
  • 많은 곳에 있는 branch들...

1. branch의 용도

  • branch는 커밋 사이를 가볍게 이동할 수 있는 어떤 포인터 같은 것이다.
  • 개발을 하다 보면 코드를 복사해야 하는 일이 자주 생긴다. 이렇게 복사된 코드를 원래 코드와는 상관없이 독립적으로 개발하기 위해 생긴 것이 바로 branch 이다.
  • Git은 브랜치를 만들어 작업하고 나중에 Merge 하는 방법을 권장하고 있다.

2. Git의 데이터 처리 방식

  • Git은 데이터를 Change Set이나 변경사항(Diff)으로 기록하지 않고 일련의 스냅샷으로 기록한다.
  • commit하면 Git은 현재 Staging Area에 있는 데이터의 스냅샷에 대한 포인터, 저자나 커밋 메시지 같은 메타데이터, 이전 커밋에 대한 포인터 등을 포함하는 커밋 개체(커밋 Object)를 저장하게 된다.
  • 즉, 커밋 포인터가 있어서 현재 커밋이 무엇을 기준으로 바뀌었는지를 알 수 있으며, 최초 커밋을 제외하고 나머지 커밋은 이전 커밋 포인터가 적어도 하나씩 존재하게 된다. (브랜치를 합친 Merge 커밋 같은 경우에는 이전 커밋 포인터가 여러 개 존재하게 됨)

blob, tree, commit?

  • blob: 파일을 Stage했을 때 Git 저장소에 파일을 저장하는 것
  • tree: 파일과 디렉토리 구조가 들어 있는 개체
  • commit: 메타데이터와 루트 트리를 가리키는 포인터가 담긴 개체
  • 만약 Git에 파일 3개를 commit 했다면 3개의 blob, 1개의 tree, 1개의 commit 데이터 개체가 생기게 된다.
  • 이 때, 마냑 파일을 수정하고 커밋한다면 이전 커밋이 무엇인지도 저장한다.

3. branch는 언제 생성될까?

  • Git에서는 기본적으로 master 브랜치가 생성된다.
  • 최초 commit 시 master 브랜치는 생성된 커밋을 가리키고, 이후 커밋을 만들면 master 브랜치는 자동으로 가장 마지막 커밋을 가리킨다.

master, main?

  • Repository 생성 시 기본 default branch는 master이 아니라 main이다.
  • 기존 default branch 생성 시 기본 이름은 master였지만, 'Black Lives Matter' 운동에 따라 주인과 노예관계를 뜻하는 master, slave를 다른 단어로 대체하기 위해서 main을 사용하는 추세이다.
  • 만약 기본 branch 이름이 master 라면, 아래 코드를 통해 main으로 변경이 가능하다.
# 변경 코드
git branch -M main 
  • 기본 브랜치 이름 설정 바꾸기
    - 아래 링크에서 기본 브랜치명을 변경할 수도 있다.
    - https://github.com/settings/repositories
  • 만약 local에 저장소를 clone한 경우 다음과 같이 기본 저장소 이름을 바꿔줘야 한다.
git branch -m master main
git fetch origin
git branch -u origin/main main

2. branch 활용하기

1. branch 생성하기

  • branch 생성 명령문
git branch [브랜치명]
  • 활용 예시
git branch mynewbranch
  • git branch로 생성된 branch 확인
git branch
  • 실행 결과

2. branch 위치 확인하기

  1. 현재 위치한 branch 확인하기
  • 다음 명령어를 이용해 현재 위치한 branch를 확인할 수 있다.
git branch
  • *가 있는 곳이 현재 내가 위치한 branch 이다.
  1. 현재 '작업중'인 branch 확인하기

그렇다면 Git은 현재 작업 중인 브랜치가 무엇인지 어떻게 파악할까?

  • Git에는 HEAD라는 특수한 포인터가 존재하며, 이 포인터는 현재 작업하고 있는 로컬 브랜치를 가리킨다.
  • git branch 명령은 브랜치를 만들기만 하고 브랜치를 옮겨주지는 않기 때문에, 새로운 브랜치를 생성하더라도 Git은 아직 main 브랜치를 가리키게 된다.
  • git log --oneline --decorate 를 활용해 브랜치가 어떤 커밋을 가리키고 있는지 확인할 수 있다.
git log --oneline --decorate
  • 실행 예시(커밋명 = my first commit)

3. branch 이동하기

  • git checkout 브랜치명 명령어를 사용하면 다른 브랜치로 이동할 수 있다.
git checkout 브랜치명
  • 활용 예시
git checkout mynewbranch
# 이렇게 하면 HEAD는 mynewbranch 브랜치를 가리킨다.
  • 실행 결과
  • 그림으로 본다면 다음과 같다.

4. commit?

  • 만약 위의 상황에서 커밋을 시켜준다면?
git commit -a -m 'made a change'
# 커밋명 'made a change'
  • 새로 커밋을 시켜줬으므로 mynewbranch 브랜치는 새로운 커밋 개체를 가리키게 된다.
  • 여기서 다시 main 브랜치로 되돌아가보자.
git checkout master
  • 이제 HEAD는 다시 main 브랜치를 가리키게 되었다.
  • main 브랜치가 가리키는 커밋을 HEAD가 가리키게 하고, 워킹 디렉토리의 파일도 그 시점으로 되돌려 놓은 것.
  • 이렇게 해 둔 뒤 커밋을 하게 되면 다른 브랜치의 작업들과 별개로 진행되기 때문에 두 작업 내용은 서로 독립적으로 각 브랜치에 존재한다고 할 수 있다.
  • mynewbranch 브랜치에서 임시로 작업하고 원래 main 브랜치로 돌아와서 하던 일을 계속할 수 있다는 의미이다.

기억해두기!

  • 브랜치를 이동하면 워킹 디렉토리의 파일이 변경된다.
  • 이전에 작업했던 브랜치로 이동하면 워킹 디렉토리의 파일은 그 브랜치에서 가장 마지막으로 했던 작업 내용으로 변경된다.
  • 만약 파일 변경시 문제가 있어 브랜치를 이동시키는게 불가능한 경우 Git은 브랜치 이동 명령을 수행하지 않는다.

5. branch 합치기 - merge

  • 각 브랜치에서 작업을 하다 필요 시 다음 명령어를 사용해 merge 할 수 있다.
  • 다른 브랜치에서 했던 작업 내용을 가져오고 싶을 때 merge를 사용한다.
git merge [브랜치명]

6. branch 삭제하기

  • mynewbranch 브랜치의 내용이 main 브랜치에 통합(merge) 되었기에 더 이상 필요없게 된 경우 아래 명령어를 이용해 mynewbranch 브랜치를 삭제할 수 있다.
git branch -d [브랜치명]
  • 활용 예시
git branch -d mynewbranch
  • git branch 로 남아있는 branch 목록을 확인할 수 있다.
git branch

참고자료

profile
개발 공부중

0개의 댓글