← Git을 활용한 협업
notion image

머지(Merge)

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

충돌(Conflict)

 
 

Reference