반응형
브랜치를 만들어서 기능추가/수정 또는 버그 수정을 완료했다면, 다시 기존 브랜치로 합쳐주는 과정이 필요합니다. 이번 포스트에서는 브랜치를 병합하는 명령어에 대해 알아보겠습니다.
↓ ↓ ↓ 브랜치에 대해 아직 잘 모르신다면 이전 포스트를 확인해주세요.
병합 방법
✨ 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
반응형
'버전관리 > GIT_HUB' 카테고리의 다른 글
GIT Stash, commit하지 않고 변경이력 임시 저장하기! (0) | 2023.12.04 |
---|---|
GIT 병합 시 충돌은 왜 발생하는걸까? (브랜치 병합 충돌과 해결) (1) | 2023.12.01 |
GIT 브랜치를 사용하는 이유와 생성/수정/삭제 (1) | 2023.11.25 |
GIT HUB 초기 푸시 프로세스 (0) | 2023.11.22 |
git commit 내역 복구 (0) | 2021.06.28 |
댓글