깃허브 레포지토리에는 이슈라는 탭이 있는데 여기에는 프로젝트의 버그나, 논의사항, 해야할 일등을 기록해놓습니다. 이슈를 기록하면 이슈 번호가 생깁니다. → #53 (git에서 태그 가능)
위와 같이 이슈를 기록하고 새로운 이슈를 처리하기 위해 브랜치를 하나 만들어서 그 이슈에 대한 작업을 수행합니다. 만약 어떤 사람이 이슈를 남겼고 그 이슈 번호가 53이라면 브랜치를 아래와 같이 만들 수 있습니다. (브랜치 네이밍은 자유)
위 명령은 아래 두 명령을 줄여놓은 것 입니다.
iss53 브랜치로 체크아웃 했기 때문에 HEAD는 iss53 브랜치를 가리키게되고 작업을 한 후에 커밋을 하면 iss53 브랜치가 앞으로 나아갑니다.
index.html 파일을 만들고 커밋을 한번 진행하겠습니다.
이 상황에서 iss53 브랜치의 변경사항이 기록되었으므로 다시 master로 돌아가면 iss53에서 만든 index.html 파일이 없는 master 브랜치의 워킹 디렉토리로 이동할 수 있습니다.(53번 이슈를 시작하기 전의 모습으로 이동할 수 있습니다.)
이 상황에서 갑자기 해결해야할 문제가 생겨서 hotfix 라는 브랜치를 만들고 문제를 해결했다고 가정한 후 커밋을 해보도록 하겠습니다.
이제 hotfix를 완료했으니 master 브랜치에 합쳐야 합니다. 브랜치를 합칠 때는 merge 명령어를 사용합니다.
Merge 메시지에 “fast-forwrad”를 볼 수 있습니다. hotfix 브랜치가 가리키는 C4 커밋이 C2 커밋에 기반한 브랜치이기 때문에 브랜치 포인터는 Merge 과정 없이 그저 최신 커밋으로 이동합니다. 이런 Merge 방식을 “fast forward”라고 부릅니다.
다시 말해서 A 브랜치에서 다른 B 브랜치를 Merge 할 때 B 브랜치가 A 브랜치 이후 커밋을 가리키고 있으면 그저 A 브랜치가 B 브랜치와 동일한 커밋을 가리키도록 이동시킬 뿐입니다.
아래와 같은 상태가 됩니다.
이제 hotfix를 완료했으니 hotfix 브랜치를 삭제합니다.
이제 급한 hotfix를 해결했으니 이슈 53번을 처리하던 환경으로 되돌아가서 계속 진행해봅시다.
iss53 브랜치로 이동한 후 커밋을 한번 더 해보겠습니다.
이제 53번 이슈를 다 구현했으니 master 브랜치에 Merge 해봅시다.
hotfix 브랜츠를 merge 할 때와 message가 다릅니다. 현재 브랜치가 가리키는 커밋이 merge할 브랜치의 조상이 아니므로 Git은 fast-forward로 머지하지 않습니다. 이 경우에는 Git은 각 브랜치가 가리키는 커밋 두 개와 공통 조상 하나를 사용하여 3-way-Merge를 합니다.
단순히 브랜치 포인터를 최신 커밋으로 옮기는게 아니라 3-way Merge의 결과를 별도의 커밋으로 만들고 나서 해당 브랜치가 그 커밋을 가리키도록 이동시킵니다. 그래서 이런 커밋은 부모가 여러개고 Merge 커밋이라고 부릅니다.
iss53 브랜치를 master에 Merge 하고 나면 더는 iss53 브랜치가 필요없습니다. 다음 명령으로 브랜치를 삭제하고 이슈의 상태를 처리 완료로 표시합니다.