[Git 스터디 2-2] 브랜치 활용과 병합
브랜치와 merge는 실제 개발 중 아래 흐름으로 자주 사용된다.
- 웹사이트나 소프트웨어가 있고, 기존 작업을 진행하고 있다.
- 새로운 이슈를 처리할 브랜치를 만든다.
- 그 브랜치에서 작업을 진행한다.
- 중간에 긴급 문제가 생기면 hotfix 브랜치를 만들어 먼저 처리한다.
- hotfix를 운영 브랜치에 merge한다.
- 다시 원래 작업 브랜치로 돌아와 하던 일을 계속한다.
작업 브랜치 만들기
예제 저장소를 clone하고 이슈 처리를 위한 브랜치를 만든다.
$ git clone https://github.com/jeong-han-kim/start_git
$ git checkout -b iss53
git checkout -b iss53은 브랜치를 만들고 바로 그 브랜치로 이동한다.
$ echo 'hello' > iss53_project
$ git add .
$ git commit -m "edit issue 1"
Hotfix 브랜치
작업 중 급한 문제가 생기면 다시 운영 브랜치로 돌아가 hotfix 브랜치를 만든다.
$ git checkout master
$ git checkout -b hotfix
$ echo 'problem' > speed_problem
$ git add .
$ git commit -m "fixed problem"
hotfix를 master에 merge한다.
$ git checkout master
$ git merge hotfix
현재 master가 hotfix의 조상 커밋이면 Git은 fast-forward merge를 수행한다. 이 경우 별도의 merge commit 없이 master 포인터만 앞으로 이동한다.
처리가 끝난 hotfix 브랜치는 삭제할 수 있다.
$ git branch -d hotfix
Conflict 처리
서로 다른 브랜치에서 같은 파일의 같은 부분을 수정하면 merge conflict가 날 수 있다.
$ git clone https://github.com/Kim-JeongHan/merge_start
$ git checkout issue1
$ git log --graph
master에서 issue1을 merge해본다.
$ git checkout master
$ git merge issue1
자동 병합: motorB
충돌! (내용): motorB에 병합 충돌
자동 병합이 실패했습니다. 충돌을 바로잡고 결과물을 커밋하십시오.
충돌이 나면 git status로 어떤 파일을 고쳐야 하는지 확인한다.
$ git status
충돌 파일 안에는 다음과 같은 표시가 생긴다.
<<<<<<< HEAD
editing
## 고생많아요 다들
=======
editing 2
>>>>>>> issue1
<<<<<<<, =======, >>>>>>> 사이의 내용을 보고 최종으로 남길 내용을 직접 정리한다. 수정이 끝나면 다시 add와 commit으로 merge를 마무리한다.
$ git add .
$ git commit -m "finish issue1"
작업 브랜치가 더 필요 없으면 삭제한다.
$ git branch -d issue1
브랜치 상태 확인
이미 현재 브랜치에 merge된 브랜치는 다음으로 확인할 수 있다.
$ git branch --merged
iss53
* master
아직 merge되지 않은 브랜치는 다음으로 확인한다.
$ git branch --no-merged
merge된 브랜치는 보통 삭제해도 된다. 반대로 merge되지 않은 브랜치를 -d로 삭제하려 하면 Git이 막는다.
$ git branch -d issue1
정말 버려도 되는 브랜치라면 강제 삭제 옵션을 쓴다.
$ git branch -D issue1
강제 삭제는 커밋을 잃을 수 있으므로, 실습용이 아닌 실제 프로젝트에서는 삭제 전에 로그와 merge 여부를 확인해야 한다.