본문 바로가기
버전관리/GIT_HUB

GIT 브랜치 병합

by joa-yo 2023. 11. 29.
반응형

브랜치를 만들어서 기능추가/수정 또는 버그 수정을 완료했다면, 다시 기존 브랜치로 합쳐주는 과정이 필요합니다. 이번 포스트에서는 브랜치를 병합하는 명령어에 대해 알아보겠습니다.

 

↓ ↓ ↓  브랜치에 대해 아직 잘 모르신다면 이전 포스트를 확인해주세요.

 

GIT 브랜치를 사용하는 이유와 생성/수정/삭제

안녕하세요. 오늘은 깃을 브랜치 관리하는 방법에 대해 알아보고자 합니다. 브랜치를 사용하는 이유 1. 서비스의 안정적 유지 release 버전에 영향을 미치지 않고 여러가지 기능을 테스트 해 볼 수

joalog.tistory.com

 


 

병합 방법

fast-forward 병합

Fast-forward 병합은 서로 같은 브랜치에서 파생된 두 브랜치를 합칠 때 사용하는 병합 방식입니다. 이 방식은 보통 하나의 브랜치가 다른 브랜치보다 더 과거의 이력을 가지고 있을 때 사용됩니다. 여기서 'fast-forward'는 더 과거 이력의 브랜치를 현재 시점으로 빠르게 이동시키는 것을 의미합니다.

 

명령어

git merge bugfix

현재 브랜치와 bugfix 브랜치를 병합하는 명령어입니다. 아래의 병합전 준비와 fast-forward 부분을 보면서 스크립트를 직접 따라해보세요.

병합 전 준비

$ git init branchTest
$ cd branchTest
$ touch README
$ git add README.txt
aaa@DESKTOP-AAAAA MINGW64 /d/git/repositories/branch (master)
$ git commit -m readme
[master (root-commit) 149b39f] readme
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.txt

## bugfix 브랜치 생성
$ git branch bugfix
$ git switch bugfix
Switched to branch 'bugfix'

## 커밋할 파일 생성
echo 'HELLLO WORLD' >> index.html
echo 'MAIN PAGE' >> main.html

## bugfix브랜치에 두개의 커밋이력 생성
$ git add index.html
$ git commit -m 'commit index File'
$ git add main.html
$ git commit -m 'main file'

## 결과
$ git log --all --graph --oneline
* 9f6a941 (HEAD -> bugfix) main file
* f7a5d69 commit index File
* 149b39f (master) readme

 

fast-forward 병합

## 변경전
$ git log --all --graph --oneline
* 9f6a941 (HEAD -> bugfix) main file
* f7a5d69 commit index File
* 149b39f (master) readme

## 이전 커밋이력에 있는 master 브랜치로 이동
$ git switch master
Switched to branch 'master'

## 병합
$ git merge bugfix
Updating 149b39f..9f6a941
Fast-forward
 index.html | 1 +
 main.html  | 1 +
 2 files changed, 2 insertions(+)
 create mode 100644 index.html
 create mode 100644 main.html

## 결과
$ git log --all --graph --oneline
* 9f6a941 (HEAD -> master, bugfix) main file
* f7a5d69 commit index File
* 149b39f readme

 

✨ 3-way 병합

3-way 상태는 두 브랜치가 공통 커밋에서 갈라져 나온 상태를 나타냅니다. 이 상황에서 병합을 수행하는 것을 3-way 병합이라고 합니다. Fast-forward 병합과는 달리 새로운 커밋 히스토리가 생성됩니다.

 

명령어

$ git merge -e feature

 

현재브랜치와 feature 브랜치를 병합하는 명령어입니다. 아래 코드를 사용해서 fast-forward에 이어 계속해서 스크립트를 진행해보세요.

 

병합 전 준비

## 변경 전
$ git log --all --graph --oneline
* 9f6a941 (HEAD -> master, bugfix) main file
* f7a5d69 commit index File
* 149b39f readme

## feature 브랜치 생성 및 커밋 (기능추가를 의미함)
$ git branch feature
$ git switch feature
$ echo "NEW FEATURE" >> feature.html
$ git add feature.html
$ git commit -m 'feature file'

## master 브랜치에 커밋
$ git switch master
Switched to branch 'master'
$ echo EDIT >> index.html
$ git add index.html
$ git commit -m "change index"

## 병합 준비 완료 상태
$ git log --all --graph --oneline
* d1f7d43 (HEAD -> master) change index
| * e4e2fcc (feature) new feature
|/
* 9f6a941 (bugfix) main file
* f7a5d69 commit index File
* 149b39f readme

 

3-way 병합

## 병합 수행, vi창이 나타나면 주석 하단에 커밋 메시지 입력
$ git merge -e feature
Merge made by the 'ort' strategy.
 feature.html | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 feature.html

## 결과
$ git log --all --graph --oneline
*   bf75d52 (HEAD -> master) Merge branch 'feature' new function added on master branch
|\
| * e4e2fcc (feature) new feature
* | d1f7d43 change index
|/
* 9f6a941 (bugfix) main file
* f7a5d69 commit index File
* 149b39f readme

 

✨ squash 병합

 

3-way 상태에서 현재 브랜치와 다른 브랜치의 소스는 병합하지만, 분기는 그대로 유지하는 병합 방법입니다.

 

명령어

$ git merge feature --squash

 

병합 전 준비

## 변경 전
$ git log --all --graph --oneline
*   bf75d52 (HEAD -> master) Merge branch 'feature' new function added on master branch
|\
| * e4e2fcc (feature) new feature
* | d1f7d43 change index
|/
* 9f6a941 (bugfix) main file
* f7a5d69 commit index File
* 149b39f readme

## merge이전으로 되돌리기
$ git reset --hard HEAD~
HEAD is now at d1f7d43 change index

## 되돌려진 상태 확인(merge 테스트 하기 좋은 상태로 되돌린 것임)
$ git log --all --graph --oneline
* d1f7d43 (HEAD -> master) change index
| * e4e2fcc (feature) new feature
|/
* 9f6a941 (bugfix) main file
* f7a5d69 commit index File
* 149b39f readme

## 파일 리스트 확인 (feature 브랜치에서 생성한 feature.html 파일이 없음 확인)
$ ls
README.txt  index.html  main.html

 

Squash 병합

## 병합, 병합 할 파일들을 모두 staging 영역에 올려줌
$ git merge feature --squash
Automatic merge went well; stopped before committing as requested
Squash commit -- not updating HEAD

## 병합, 병합할 파일 리스트 확인
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   feature.html

## master 브랜치에 커밋
$ git commit -m 'squash merge'
[master 01a804d] squash merge
 1 file changed, 1 insertion(+)
 create mode 100644 feature.html

## 파일 리스트 확인 (feature 브랜치에서 생성한 feature.html 파일이 있음 확인)
$ ls
README.txt  feature.html  index.html  main.html

## 결과
$ git log --all --graph --oneline
* 01a804d (HEAD -> master) squash merge
* d1f7d43 change index
| * e4e2fcc (feature) new feature
|/
* 9f6a941 (bugfix) main file
* f7a5d69 commit index File
* 149b39f readme

 

반응형

댓글