HyunJun 기술 블로그

Git Branch, Switch 본문

Git

Git Branch, Switch

공부 좋아 2024. 7. 5. 14:24
728x90

Git Branch

  • 프로젝트의 다양한 버전, 기능들을 나누기 위한 분기점을 만들 수 있다.
  • 협업 시, git을 통해 작업을 할 때 팀원들끼리의 작업에 영향을 주지 않게 도와준다.
  • 각각의 Branch는 독립적인 작업 공간이므로, 다른 Branch에게 영향을 주지 않는다.
  • Branch는 특정 Commit을 가리키는 포인터일 뿐이다.

 

git init

연습할 git 프로젝트 생성하기.

cd ~
mkdir gitBranch
cd gitBranch 
git init

 

a 파일 생성 후, 저장한다.

vi a #:wq

# working directory -> staging area
git add a

# staging area -> repository
git commit -m "feat: a 파일 생성"

 

💡 현재 nothing to commit, working tree clean 상태이다.

 

git branch

  • Git에서 브랜치는 특정 커밋을 가리키는 포인터로 동작한다. 따라서 첫 번째 커밋이 없는 상태에서는 브랜치를 생성하거나 사용하는 것이 불가능하다.
  • Git 저장소를 처음 초기화 (git init)할 때는 아무런 커밋도 존재하지 않기 때문에 HEAD 포인터는 어떤 커밋도 가리키지 않는다. 첫 번째 커밋을 만들 때 (git commit) master (또는 기본 브랜치 이름이 변경된 경우 main) 브랜치가 자동으로 생성되며, 이 브랜치는 첫 번째 커밋을 가리키게 된다.
  • 이후에 추가적인 브랜치를 생성하려면 (git branch [브랜치 이름]) 이미 존재하는 커밋을 기반으로 새로운 브랜치 포인터가 생성된다.
  • git init 시 기본으로 생성되는 Branch는 main 또는 master이다.
  • git은 default branch가 master로 사용되고, github는 default branch가 main으로 사용된다.
  • 그렇다면 github는 왜 main으로 사용하는가? master라는 단어의 뜻에서 오는 어감 때문이다. (주종 관계, 인종차별 등)
  • 이번 예시에서는 default branch를 master로 사용하겠지만, 평상시 default branch는 main으로 사용하는 것을 추천한다. (추세)

 

아래의 명령어는 기본적으로 Branch 목록을 나열하게 된다.

git branch

* 표시는 현재 선택된 브랜치를 의미한다.

 

branch 생성

아래의 명령어로 Branch를 생성할 수 있다.

git branch develop
git branch

 

 

아래의 명령어는 원격 저장소의 Branch를 확인한다.

git branch -r

 

아래의 명령어는 Branch의 마지막 Commit Message를 확인한다.

git branch -v

 

 

 

git switch

아래의 명령어는 Branch를 변경할 때 사용한다.

git switch develop
git branch

 

Branch 생성 시, 현재 HEAD를 기준으로 만들어진다.

 

git log --graph

Branch에 대해서 더 알아보기 전에 CLI 환경에서도 아래의 명령어를 통해 Git Branch를 편하게 Graph로 확인할 수 있다.

git log --oneline --graph --all --decorate

현재 HEAD는 develop, master branch를 가리키고 있다. (즉 변경사항이 없다.)

 

develop branch에서 a 파일의 내용을 수정해 보자.

vi a

# vi
test
~                                                                               
~

 

HEAD가 같은 곳(develop, master)을 바라보고 있어 수정 사항이 develop, master 두 곳에 모두 저장된 걸 확인할 수 있다.

 

develop 브랜치에서 a 파일을 add, commit 해보자.

git add a
git commit -m "feat: a 파일 수정"
git log --oneline --graph --all --decorate

 

—oneline  옵션을 사용했기 때문에 같은 가지로 뻗은 경우 라인 표시가 나오지 않는다.

 

 

즉,

  • a 파일을 생성한 Commit 내역을 가지고 있는 master branch에서 develop branch를 생성했다.
  • 이제 develop branch에서 a 파일을 수정하고, commit 하면
  • master branch는 a 파일을 생성한 commit만을 가리키고 있고,
  • develop branch는 a 파일을 생성한 commit을 이어받아 a 파일을 수정한 commit 내역도 가지고 있다.

즉 아래의 사진에서 볼 수 있듯이 develop branch에서 열어본 a 파일은 test라는 문구가 나오고, master branch에서 열어본 a 파일은 나오지 않는다.

 

 

그렇다면 다시 master branch로 HEAD를 돌리고 b 파일을 생성해 보자.

git switch master
vi b #:wq

 

 

master branch에서 생성한 b 파일은 아직 Untrakced File이고, Untracked File은 git에 의해 아직 추적되지 않는 파일이다. 아직 commit 및 아무런 작업도 하지 않았다 해서 Working Directory에 남아 있게 되고 어느 branch에서나 보인다.

 

그러면 다시 master branch로 변경하고 파일을 commit 해보자.

git switch master
git add b
git commit -m "feat: b 파일 생성"

다시 한번 그래프를 확인해 보자.

git log --oneline --graph --all --decorate

2가지의 가지(방향)이 생겼다.

 

 

분석을 해보자면 아래와 같다.

  • a 파일을 생성한 시점의 branch는 master branch이다. (단순한 포인터 개념이다.)
  • b 파일을 생성한 것도 master branch이다. 해서 한 줄로 가지가 뻗어 나간다.
  • 처음에 a 파일을 생성한 곳을 master branch가 가리키고 있었는데, 이 branch를 통해 develop branch를 생성했다.
  • 고로 develop branch는 a 파일을 생성한 시점의 commit을 가리키고 있고, develop branch에서 a 파일을 수정했으니 또 다른 한 가지로 뻗어나가는 것이다.

그리고 이제, develop branch에서는 b 파일이 보이지 않을 것이다. 또한 이때 충돌(Conflict)이 일어날 수 있는 경우에는 branch 변경이 되지 않는다.

 

 

option

git switch -c

-c를 사용하게 되면 해당 branch를 생성 후, 해당 branch로 변경한다.

git switch -c

실제로 특정 기능을 구현할 때 많이 쓰는 형태의 branch 이름으로 생성해 보았다. 여기서 feature/는 단순히 표기법으로 구분하는 것 일뿐 슬래시(”/”) 자체가 무슨 기능이 있는 것은 아니다.

git switch -c feature/board

 

 

git switch -c hotfix/board

 

 

git branch -d

-d를 사용하게 되면 branch를 삭제해 준다.

git switch feature/board
git branch -d hotfix/board

 

 

 

 

git branch를 삭제해도 Commit History는 변경되지 않는다.

Branch 이름 변경, -m (move)

-m을 사용하면 branch의 이름을 변경할 수 있다. 여기서의 m은 move이며 리눅스에서 move가 파일 이동 및 파일 이름 변경(파일을 이동하면서 이름 변경)과 같은 원리이다.

git branch -m feature/board feature/comment

 

 

branch에 대해서 연습하는 방법들은 아래와 같다.

  • Git Graph를 보지 않고, Branch를 예상해 보기.
  • 파일 생성과 파일 수정에 따른 Branch 변화 알아보기.
728x90
Comments