Tool/Git

깃(Git) 문법 - 브랜치와 머지

재은초 2023. 8. 21. 15:52
반응형

브랜치(Branch)란?

  • 브랜치란 저장소 내에 존재하는 독립적인 작업관리의 영역으로, 다른 공간에 영향을 받지 않고 커밋을 기록할 수 있는 관리 공간이다.
  • 각각의 브랜치는 다른 브랜치의 영향을 받지 않기에 여러 작업을 독립적으로 동시에 진행할 수 있으며, 이렇게 만들어진 브랜치는 다른 브랜치와 병합(Merge)함으로써 작업한 내용을 하나로 합칠 수 있다.
  • 브랜치는 당장 배포 가능한 최종본인 통합 브랜치(Integration Branch)와 기능 추가 같은 단위 작업을 위한 토픽 브랜치(Topic Branch)로 나뉜다.

브랜치 관련 용어 정리

https://www.studytonight.com/git-guide/git-origin-master

  • origin : 로컬 저장소를 복제(clone)한 원격 저장소를 의미한다.
  • master 브랜치 : 저장소를 생성할 때 기본으로 만들어지는 브랜치에 master라는 기본 이름이 부여되는데, 기본 이름이 master인 브랜치를 말한다.
  • master : 해당 브랜치의 끝, 즉 최신 커밋을 참조하는 개체를 말한다.
  • HEAD : 현재 사용 중인 브랜치의 선두 부분을 나타내는 이름으로, 쉽게 말해 브랜치의 작업 위치를 나타낸다. HEAD가 이전 커밋을 참조하면 Working directory의 내용이 이전 커밋의 내용으로 변경되며, HEAD는 master와 commit 같이 참조를 참조할 수 있다.
Origin과 Master 브랜치는 Git에서 일반적으로 사용되는 기본 이름으로, 둘 다 사용자가 이름을 변경할 수 있다.
Upstream과 Downstream란? : 두 저장소 간의 관계에 따라 정의되는 상대적인 개념이다. 영어 뜻 처럼 물줄기가 위에서 아래로 내려올 때, 위의 소스 원천을 Upstream이라고 하고 반대로 아래에서 받은 소스를 Downstream이라고 한다. 하나의 Upstream에 여러개의 Downstream이 있을 수 있다.

 

브랜치 병합의 종류들

3-way merge

  • 브랜치에 각각 신규 커밋이 1회 이상 있는 경우, merge를 하면 두 브랜치의 코드를 합쳐서 새로운 커밋을 자동으로 생성해주는데 이걸 3-way merge 라고 부른다. merge의 기본 동작 방식이다.

https://codingapple.com/

fast-forward merge

  • 새로운 브랜치에만 커밋이 있고 기준이 되는 브랜치에는 신규 커밋이 없는 경우, merge를 하면 따로 합치지 않고 신규 브랜치를 메인 브랜치라 칭하는데 이를 fast-forward merge 방식이다.
  • 기준이 되는 브랜치에 신규 커밋이 없으면 자동으로 fast-forward merge가 발동되는데, git merge --no-ff 브랜치명 명령어로 강제로 3-way merge 할 수도 있다.

https://codingapple.com/

 

1. 브랜치 생성 및 삭제

  • git branch 로 브랜치 내역을 확인할 수 있는데, * 표시가 있는 브랜치가 현재 브랜치이며 HEAD는 현재 브랜치를 가리키는 포인터다.
  • 브랜치를 병합해도 브랜치가 자동으로 삭제되지 않기에 따로 삭제해 주어야 한다.
git branch                           // 브랜치 목록 표시

git branch 브랜치명                    // 해당 브랜치명으로 브랜치 생성
git branch -m 브랜치명 새로운 브랜치명     // 브랜치명 변경

git branch -d 브랜치명                 // 해당 브랜치 삭제

 

2. 브랜치 이동하기

  • 예전에는 checkout 을 사용했으나 지금은 switch 를 사용한다.
  • 어떤 브랜치에 와있는지 확인할 때에는 git status 를 사용한다.
git checkout 브랜치명               // 해당 브랜치로 전환
git checkout –b 브랜치명            // 브랜치 생성과 동시에 전환
git switch 브랜치명
git switch main                 // 다시 메인 브랜치로 되돌아갈 때

 

3. 브랜치 병합하기

  • 충돌하는 변경이 없을 경우 자동적으로 병합되지만, 충돌이 있을 경우에는 충돌난 부분을 수동으로 해결한 다음 직접 커밋을 해야 한다.
  • 기록을 남겨야하는 중요한 브랜치를 병합할 땐 3-way merge를 쓰고, 기록을 남길 필요없는 쓸데없는 브랜치를 병합할 땐 squash, rebase 쓴다.

merge

  • main 또는 master 브랜치에서 git merge 합치려는브랜치명 입력하면, 메인 브랜치에 지정한 브랜치가 합쳐진다.
git merge 합치려는브랜치명          // 현재 브랜치에 해당 브랜치 내용 병합

// fast-forward 관계에 있으면 커밋 생성하지 않고 현재 브랜치 참조값만 변경(기본)
git merge --ff 브랜치명          

// fast-forward 관계여도 merged commit 생성
git merge --no-ff 브랜치명

// fast-forward 관계여도 merged commit 생성, merging 브랜치 정보 생략
git merge --squash 브랜치명

git merge --abort              // 머지 작업 종료

squash & merge

  • --squash 옵션을 지정하여 브랜치를 병합하면, 합쳐질 브랜치의 커밋 내역을 하나로 합쳐서 main 브랜치에 신규 커밋을 생성해준다.
git switch main
git merge --squash 브랜치명
git commit -m '메세지'

rebase & merge

  • rebase는 브랜치의 시작점을 다른 커밋으로 옮겨준다.
  • rebase 후 merge를 할 경우, 합쳐질 브랜치를 main 브랜치 최신 커밋으로 rebase하고나서 강제로 fast-forward merge 비슷하게 해준다.
git switch 새로운브랜치             // 새로운 브랜치로 이동
git rebase main                 // 브랜치가 main 브랜치 끝으로 이동

git switch main
git merge 새로운브랜치

 

Reference

반응형