[git 기초] 브랜치 branch 흐름 정리
$ git branch : 브랜치 목록 보기. 목록에서 *이 붙은 건 현재의 브랜치
$ git branch —merged / $ git branch —no-merged : merge된 브랜치인지 아닌지 목록
merge되지 않은 브랜치는 아직 merge하지 않은 커밋을 담고 있기 때문에 git branch -d 명령으로 삭제할 수 없다.
강제 삭제는 -D
브랜치와 merge 기초
아래 상황에 따라 알아보자!
나는 현재 hotfix 만들고 merge하는게 서툴러서 <상황2>의 3번 과정 부터 자세히 다룰 것이다!
<상황1>
1. 웹사이트가 있고 뭔가 작업을 진행하고 있다.
2. 새로운 이슈를 처리할 새 Branch를 하나 생성한다.
3 새로 만든 Branch에서 작업을 진행한다.
<상황2>
이때 중요한 문제가 생겨서 그것을 해결하는 Hotfix를 먼저 만들어야 한다.
그러면 아래와 같이 할 수 있다.
1. 새로운 이슈를 처리하기 이전의 운영(Production) 브랜치로 이동한다.
2. Hotfix 브랜치를 새로 하나 생성한다.
3. 수정한 Hotfix 테스트를 마치고 운영 브랜치로 Merge 한다.
4. 다시 작업하던 브랜치로 옮겨가서 하던 일 진행한다.
중간에 버그를 수정하기 위해 만든 hotfix 브랜치에서 작업을 완료하고 master에 합쳐야 할 때
$ git checkout master : 우선 master 브랜치로 이동한다.
$ git merge hotfix : hotfix가 가리키는 C4커밋이 master의 C2커밋에서 기반한 것이기 때문에 merge과정 없이 그저 최신 커밋으로 이동한다. 이 과정을 Fast-forward라고 한다.
merge 후 같은 커밋을 가리키는 master와 hotfix
$ git branch -d hotfix 버그를 해결하여 더이상 쓸모 없어진 hotfix브랜치는 삭제한다. (선택)
이제 다시 iss53을 처리하러 가보자.
master와 별개로 작업중인 iss53 53번 이슈를 다 구현하고 master브랜치에 merge하는 과정
$ git checkout master : 마찬가지로 master 브랜치로 이동한다.
$ git merge iss53 : 합치고자 하는 브랜치 iss53을 merge한다.
이때는 iss53과 master가 각각 다른 커밋에서 기반하기 때문에 3-way merge가 일어난다.
각 브랜치(master, iss53)들이 가리키는 커밋 두개를 합친 공통 커밋 하나를 생성하여 merge한다.
따라서 별도로 생성된 C6 커밋을 가리키게 된다.
$ git branch -d iss53 마찬가지로 issue를 해결하여 쓸모없어진 iss53 브랜치는 삭제하면 된다.
충돌 (conflict)
merge를 할 때 실패하는 경우가 있다. 바로 충돌(conflict)이 나는 경우이다.
충돌은 두 브랜치에서 공통된 부분을 수정했을 때 발생한다. 충돌이 나면 conflict 메세지가 출력되고, merge되지 않는다.
즉 3-way merge가 실패한다.
$ git status : 어떤 파일에서 충돌이 일어났는지 볼 수 있다.
충돌이 일어난 파일은 unmerged 상태로 표시된다.
충돌난 부분은 수동으로 해결한다. 해당 파일에 가보면 git이 친절하게 충돌난 부분을 눈에 띄게 /////// 등의 표시로 표시해준다.
해결하고 나서 $ git status 명령을 통해 충돌이 잘 해결됐는지 다시 한번 확인할 수 있다.
충돌을 해결했으면
$ git add .
$ git commit 을 통해 merge한 것을 커밋한다.
이 글은 아래 git 공식 페이지를 참고하면서 공부해본 내용을 정리한 것이다. 더 상세한 설명과 예시를 보고 싶으면 아래 참고 사이트를 참고하길 바란다!
<참고사이트>
Git - 브랜치와 Merge 의 기초
Merge 시에 발생한 충돌을 다루는 더 어렵고 요상한 내용은 뒤에 고급 Merge 에서 다루기로 한다.
git-scm.com