본문 바로가기
기타/Git

[Git] branch 생성

by 코딩하는 랄로 2024. 1. 2.
728x90

Git과 같은 VCS(버전관리시스템)를 사용할 때, branch는 매우 많이 사용하고 그 이상으로 중요한 부분을 차지하고 있다. 일반적으로 브랜치를 사용하여 코드를 복사하여 기존의 코드와는 독립적으로 코드를 변경하는데에 사용이 된다. 하지만 사용법이 단순해 보인다하여 아무 지식없이 사용하다 보면 나중에 상당히 난감한 상황에 처할 수 있다...

 

후에 난감한 상황에 마주하지 않기 위해, 마주하더라도 문제점을 파악하고 해결하기 위해 branch에 대해서 잘 알아야 할 필요가 있다. 또한 Git의 branch는 매우 가볍다라는 특징을 가지고 있다. 그렇기 때문에 브랜치의 생성이 너무나 쉽고 브랜치 사이를 이동하고 다른 브랜치와 merge 하는 등의 작업이 쉽게 가능하다. 이러한 Git이 가지는 branch의 장점을 잘 다루기 위해서도 branch에 대해서 알아야 한다.

 

 

 

branch란?

Git에서 branch를 다루는 과정을 이해하기 위해서는 Git이 데이터를 어떻게 저장하는지 알아야 한다. 이미 우리는 이전의 글들을 통해 Git이 어떻게 데이터를 저장하고 기록하는지를 알아보았다.

 

Git은 데이터를 다룰 때 Git 개체들을 활용한다. 먼저 커밋(기록)할 때에는, 현재 staging area에 있는 데이터의 snapshot에 대한 포인터, author, commit message 등의 메타 데이터, 이전 커밋에 대한 포인터 등을 포함하는 커밋 개체를 저장한다. 

 

또한 커밋 개체에서 저장되는 snapshot에 대한 포인터는 snapshot을 통해 생성한 트리 개체의 루트 트리를 가리키고 있는 것이다. 여기서 트리 개체는 snapshot의 구조에 따라 폴더는 트리 개체, 파일은 Blob 개체로 저장되어 해당 포인터들로 트리 구조를 형성하게 되는 것이다.

 

예를 들어, 파일 3개를 staging area에 올린 후 커밋을 한다고 하여보자.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/example (master)
$ git add file1.txt file2.txt file3.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/git/example (master)
$ git commit -m "Add three files"
[master (root-commit) 0aa91ca] Add three files
 3 files changed, 3 insertions(+)
 create mode 100644 file1.txt
 create mode 100644 file2.txt
 create mode 100644 file3.txt

 

이 때에 각 파일에 해당하는 Blob 개체 3개와 파일과 디렉토리를 가지고 있는 트리 개체 하나, 트리 개체의 루트 트리를 가리키는 포인터를 가지고 있는 커밋 개체 하나 총 5개의 Git 개체가 생성이 되는 것이다.

 

그리고 파일을 수정하고 다시 커밋을 하게 되면, 새로 생성된 커밋 개체에는 직전의 커밋 개체에 대한 포인터도 담기게 된다. Git에서 branch는 커밋 개체 사이를 가볍게 이동할 수 있는 어떤 포인터와 같은 것이다. 

 

즉, branch를 생성하였을 때 생성한 시점의 working directory를 그대로 복사한다라는 표현은 틀린 표현인 것이다. 올바른 표현은, 생성한 시점의 마지막 커밋 개체를 가리키는 포인터를 하나 더 생성한다고 해야 하는 것이다. 만약, 처음 branch를 생성하게 되면 master branch가 가리키고 있는 커밋 개체를 가리키는 또 하나의 branch가 생성되게 되는 것이다.

 

 

 

branch 생성

좀 더 이해를 돕기 위해서, 브랜치를 하나 생성해보자. git에서 브랜치를 생성하기 위해서는 간단하게 git branch 명렁어 뒤에 생성하고 싶은 branch 이름을 작성하면 된다. 

user@DESKTOP-UCJOAKJ MINGW64 /d/git/example (master)
$ git branch ralro

 

 

이 때, git branch -v 명렁어를 통해 현재 branch들의 목록과 가리키고 있는 커밋 개체를 확인할 수 있다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/example (master)
$ git branch -v
* master 0aa91ca Add three files
  ralro  0aa91ca Add three files

 

 

결과를 확인해보면, master와 ralro branch 모두 가장 마지막에 커밋했던 커밋 메세지가 Add three files인 0aa91ca 커밋 개체를 동시에 가리키고 있는 것을 볼 수 있다. 즉, branch는 커밋 개체를 가리키는 포인터이고 branch를 생성한다는 것은 이런 포인터를 하나 생성하는 것이다.

 

 

 

HEAD

Git은 branch를 쉽게 생성할 수 있고 언제든지 branch를 이동할 수 있다고 하였다. 그렇다면 Git은 현재 내가 작업하고 있는 branch를 어떻게 알아낼까? 이에 대한 답은 우리는 이미 본 적이 있다. git log를 통해 git history를 보게 되면 아래와 같은 결과가 나오는 것을 이전에 알아보았다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/example (master)
$ git log
commit 0aa91caa5c0df5947982b199202c6495c8d0aa59 (HEAD -> master, ralro)
Author: yusanggon <yusang5159@naver.com>
Date:   Tue Jan 2 21:00:46 2024 +0900

    Add three files

 

해당 결과에서 커밋 개체 옆에 HEAD -> master, ralro 라고 적혀있는 것을 볼 수 있는데, 여기서 HEAD가 바로 현재 내가 작업하고 있는 로컬 브랜치를 가리키는 포인터이다. 해당 메세지는 master, ralro branch 모두 해당 커밋 개체를 가리키고 있고 작업 브랜치는 master임을 알려주는 것이다.

 

이렇게 현재 작업하는 branch를 가리키는 HEAD에 대한 정보는 .git directory의 HEAD 파일에 담기게 된다.

user@DESKTOP-UCJOAKJ MINGW64 /d/git/example (master)
$ cd .git

user@DESKTOP-UCJOAKJ MINGW64 /d/git/example/.git (GIT_DIR!)
$ ls
COMMIT_EDITMSG  config       hooks/  info/  objects/     refs/
HEAD            description  index   logs/  packed-refs

 

 

 

 

 

 

reference : pro git

728x90

'기타 > Git' 카테고리의 다른 글

[Git] Merge 기초  (0) 2024.01.04
[Git] checkout  (1) 2024.01.03
[Git] remote  (1) 2023.12.31
[Git] 되돌리기  (0) 2023.12.27
[Git] log  (1) 2023.12.20