저번 시간, Git 브랜치가 무엇인지 알아보았었는데요!
이번 시간에는 브랜치를 Merge하는 과정을 예시를 통해서 살펴보도록 하겠습니다.
새로운 이슈를 처리할 새로운 Branch를 생성
새로 만든 Branch(iss53)에서 작업을 진행 & 새로운 Commit 개체 (C3)를 생성
새로운 이슈를 처리하기 이전의 운영(Master) 브랜치로 이동
이때 중요한 문제가 생겨서 그것을 해결하는 Hotfix를 먼저 만들어야 한다는 과정을 추가합니다.
Hotfix 브랜치를 새로 하나 생성
Hotfix 브랜치에서 새로운 Commit 개체 (C4)를 생성
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
여기서 잠깐! Fast-forward Merge 방식은 무엇일까요?!
hotfix 브랜치가 가리키는 C4 커밋 개채가 C2 커밋 개체에 기반한 브랜치이기 때문에 브랜치 포인터가 추가적인 Merge 과정 없이 그저 C4 커밋 개체의 포인터를 가르키도록 합니다.
이러한 Merge 방식을 “Fast forward” 라고 부릅니다.
즉!! 다시 말해 A 브랜치에서 다른 B 브랜치를 Merge 할 때 B 브랜치가 A 브랜치 이후의 커밋을 가리키고 있으면 그저 A 브랜치가 B 브랜치와 동일한 커밋을 가리키도록 이동시킬 뿐이다.
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
$ git checkout master
Switched to branch 'master'
$ git merge iss53
Merge made by the 'recursive' strategy.
index.html | 1 +
1 file changed, 1 insertion(+)
hotfix 를 Merge 했을 때와 Merge 메시지가 다르다는 것을 확인 가능합니다!!
iss53 브랜치를 master에 Merge 하고 나면 더는 iss53 브랜치가 필요 없다.
다음 명령으로 브랜치를 삭제하고 이슈의 상태를 처리 완료로 표시한다.
$ git branch -d iss53
3-way Merge 과정에서, 두 브랜치에서 같은 파일의 한 부분을 동시에 수정하고 Merge 하면 Git은 해당 부분을 Merge 하지 못합니다...
예를 들어, 53번 이슈와 hotfix 가 같은 부분을 수정했다면 Git은 Merge 하지 못하고 아래와 같은 충돌(Conflict) 메시지를 출력한다.
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
즉 이러한 에러 때문에, Git은 Merge 하지 못해서 새 커밋이 생기지 않고, 변경사항의 충돌을 개발자가 해결하지 않는 한 Merge 과정을 진행할 수 없습니다.
Merge 충돌이 일어났을 때 Git이 어떤 파일을 Merge 할 수 없었는지 살펴보려면,
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" and/or "git commit -a")
충돌이 일어난 파일은 unmerged 상태로 표시되며, Git은 충돌이 난 부분을 개발자가 해당 부분을 수동으로 해결할 수 있도록 충돌 난 부분은 아래와 같이 표시합니다!
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
이는 각 브랜치의 충돌 코드를 표시해주기에 개발자는 이를 기반으로 수정을 진행할 수 있습니다.
오늘은 Git Branch 를 사용하는 예시를 통해 그 과정을 좀 더 세세히 확인해 보았습니다. 또, 충돌이 발생하면 어떤식으로 해결하는 지 역시 알아보았습니다.
다음은 현업에서 사용하는 다양한 Branch의 종류를 보면 Git Flow를 한번 알아보겠습니다!!
고생하셨습니다👍👍👍☺️
해당 게시글은 Git의 공식 tutorial 문서를 읽고 정리 한 게시글 입니다.
따라서 사진 및 글 내용 역시 좀 더 자세하게 확인하기 위해서 아래 링크를 확인하세요!