문서로 알아보는 Git 2 - 브랜치와 Merge

LSM ·2022년 10월 25일
0

브랜치와 Merge


저번 시간, Git 브랜치가 무엇인지 알아보았었는데요!

이번 시간에는 브랜치를 Merge하는 과정을 예시를 통해서 살펴보도록 하겠습니다.

- 예시를 통해 알아보자 !!

평소 개발하면서 진행하는 브랜치 생성과 Merge의 예시입니다!

  1. 새로운 이슈를 처리할 새로운 Branch를 생성

  2. 새로 만든 Branch(iss53)에서 작업을 진행 & 새로운 Commit 개체 (C3)를 생성

  3. 새로운 이슈를 처리하기 이전의 운영(Master) 브랜치로 이동

이때 중요한 문제가 생겨서 그것을 해결하는 Hotfix를 먼저 만들어야 한다는 과정을 추가합니다.

  1. Hotfix 브랜치를 새로 하나 생성

  2. Hotfix 브랜치에서 새로운 Commit 개체 (C4)를 생성

  1. 긴급 수정을 위한 Hotfix를 마치고 운영 브랜치로 Merge 한다.
$ 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 브랜치와 동일한 커밋을 가리키도록 이동시킬 뿐이다.

  1. 수정작업이 끝난 Hotfix 브랜치를 삭제합니다
$ git branch -d hotfix
Deleted branch hotfix (3a0874c).
  • 위에서의 일련의 hotfix 작업이 iss53 브랜치에 영향을 끼치지 않는다는 점을 이해하는 것이 중요합니다!!

  1. 다시 작업하던 브랜치(issu53)로 옮겨가서 하던 일 진행한다 & 새로운 Commit 개체 (C5)를 생성.

  1. 기능 추가가 끝난 iss53 브랜치를 master 브랜치에 Merge
  • git merge 명령으로 합칠 브랜치에서 합쳐질 브랜치를 Merge 해야 합니다.
$ 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 메시지가 다르다는 것을 확인 가능합니다!!

현재 브랜치가 가리키는 커밋이 Merge 할 브랜치의 조상이 아니기 때문에, Git은 'Fast-forward’로 Merge 하지 않습니다!!

이 경우에는 Git은 각 브랜치가 가리키는 커밋 두 개와 공통 조상 하나를 사용하여 3-way Merge를 진행합니다🧐🧐

3-way Merge 방식은, 단순히 브랜치 포인터를 최신 커밋으로 옮기는 게 아니라 Merge의 결과를 별도의 커밋 개체로 만들고 나서 해당 브랜치가 Merge될 개체의 커밋을 가리키도록 이동시킵니다!

  1. 작업이 끝난, Feature 브랜치 (iss53) 삭제

iss53 브랜치를 master에 Merge 하고 나면 더는 iss53 브랜치가 필요 없다.

다음 명령으로 브랜치를 삭제하고 이슈의 상태를 처리 완료로 표시한다.

$ git branch -d iss53

- Merge 과정에서 Conflict !!

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 명령을 사용하면 됩니다!!

$ 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 add 명령으로 다시 Git에 저장하면 Merge 과정의 충돌을 해결 할 수 있습니다!!


- 정리

오늘은 Git Branch 를 사용하는 예시를 통해 그 과정을 좀 더 세세히 확인해 보았습니다. 또, 충돌이 발생하면 어떤식으로 해결하는 지 역시 알아보았습니다.

다음은 현업에서 사용하는 다양한 Branch의 종류를 보면 Git Flow를 한번 알아보겠습니다!!

고생하셨습니다👍👍👍☺️

- 출처

해당 게시글은 Git의 공식 tutorial 문서를 읽고 정리 한 게시글 입니다.

따라서 사진 및 글 내용 역시 좀 더 자세하게 확인하기 위해서 아래 링크를 확인하세요!

링크 : Git 공식문서 브랜치-브랜치와-Merge-의-기초

profile
개발 및 취준 일지

0개의 댓글