Antilog의 개발로 쓰다
article thumbnail
반응형

이전강의 이후에 해당 내용이 진행됩니다.

2019/11/09 - [Git] - [Git] 자세히 알아보기, branch, tag

 

[Git] 자세히 알아보기, branch, tag

이전 강의 내용에 이어서 진행합니다. HEAD와 master라는 기본이 되는 branch가 가진 값이 무엇인지 알고있다는 가정하에 내용을 진행합니다 2019/11/09 - [분류 전체보기] - [Git]Git 과정 자세히 알아보기, HEA..

antilog.tistory.com

merge 란?

깃에서 서로 다르게 만든 부분을 병합하기 위해서 사용합니다.

merge에는 fast-forward merge, 3way merge, 2way merge 등 다양한 merge의 개념이 있지만

자주 쓰이는 3way merge와 rebase를 위해서 fast-forward merge 를 알아보도록 하겠습니다.

3way merge

3way merge는 주로 사용하는 개념이면서 git이 주로 처리하는 merge 방법입니다.

base와 head가 가리키는 commit, merge할 branch의 commit이 상호작용하기 때문에 3way merge라고 합니다.

+ base?

base는 merge할 두가지 commit의 공통 내용을 가지고 있는 공통 조상 commit이라 생각하시면 됩니다.

 

실습으로 자세히 알아보기 위해서

2019/11/18 - [Git] - [Git] merge, rebase 를 위한 실습환경 만들기

 

[Git] merge, rebase 를 위한 실습환경 만들기

이전 포스팅까지 brach를 만들면 아래와 같은 상황입니다. 해당 과정을 실습으로 바로바로 볼 수 있도록 실습 파일을 만들어 확인해 봅시다. 저번 시간 히스토리 처럼 실습 파일을 만들기 위해서 아래 과정을 그..

antilog.tistory.com

해당 상태에서 run을 master에 병합하기 위해서 run branch에서 master branch로 이동합시다.

$git checkout master

그리고 run branch를 merge 하기 위해서 아래와 같은 명령어를 사용해봅시다.

$git merge run

해당 과정을 진행하면 아래와 같은 메시지가 올라옵니다.

testcode 파일을 merge 했지만 conflict가 발생하였고 자동적인 merge에 실패하였으니 해당 파일 충돌을 해결하고 커밋하라는 내용입니다.

removing stale_outputs_checked는 무시하셔도 됩니다. 본래는 나오지 않는 부분입니다. 제가 파일 삭제했습니다. 

그리고 브랜치를 나타내는 부분의 상태를 보면 master에서 merge가 진행되고 있다고 알려줍니다.

그리고 여기서 충돌이 발생한 testcode.txt 파일로 가보면

다음과 같이 추가된 것을 확인 할 수 있습니다.

<<<<<<<HEAD 의 부분은

지금 현재 HEAD가 가리키는 커밋의 내용이 ======= 위에 있고

그 아래에는 >>>>>>> run에 run branch 내용이 있다는 내용입니다.

즉 master에서 master code라고 쓴 부분과 run에서 run code라 쓴 부분이 충돌이 일어났습니다.

충돌은 아래 포스트에서 다루고 있습니다.

2019/11/18 - [Git] - [Git] merge, rebase 충돌(conflict)이란?

 

[Git] merge, rebase 충돌(conflict)이란?

이후 merge와 rebase 개념을 위해서 충돌이라는 개념부터 알아보고 들어가겠습니다. Conflict (충돌)이란? 충돌은 두 개의 파일을 병합(merge혹은 rebase) 하는 과정에서 생기는 문제입니다. 예를 들면 우리가 이..

antilog.tistory.com

 

상황에 따라서 master의 내용이나 run의 내용을 선택하여 사용할 수 있고 둘다 사용하거나 둘다 지워버릴 수 있습니다.

이 포스트에서는 둘다 사용하여 봅시다.

다음과 같이 문서를 수정하고 add하고 commit하면서 commit 내용은 merge 1이라고 적어주었습니다.

그러면 위 그림과 같이 merging이 사라지고 git client fork를 확인하면 두가지 branch가 합병된 것을 볼 수 있습니다.

 

지금 우리가 사용한 것이 3way merge 입니다.

이제 어떤 원리로 동작하는지 자세히 알아보도록 하겠습니다

해당 과정에서 merge를 하면 conflict가 발생했습니다.

처음에도 설명하였듯 이는 3가지 commit들에서 상호작용을 하기 때문에 나온 충돌입니다.

위 그림과 같이 734ba79가 base이고 나머지 2개와 비교하였을때 깃의 입장에서

base에는 없는내용, master에는 master code, run에는 run code

즉, 상호작용하는 3가지 부분에서 모두 다른 내용을 가지고 있기에 깃은 3가지를 보았음에도 무엇이 맞는지 알 수 없기 때문에 사용자에게 맞는 코드를 직접 쓸 수 있도록 하는 것입니다.

그리고 해당 충돌을 해결하고 add, commit함으로 3way merge의 결과는 두가지 branch가 합쳐진 새로운 커밋이 됩니다.

그런데 다른 부분이 있을때 마다 충돌이 나면 3 way merge가 주로 사용되지 않을 것입니다.

3 way merge는 base와 두 가지 다른 부분을 보고 자동으로 내용을 판별합니다.

만약 아래와 같은 상황이 있다면

base master branch
test test  
code  code 1 code
  add code  

처음 test 부분부터 살펴보면 깃은 base에 test가 있고 master에 test가 있으며 branch에 삭제된 것을 확인합니다.

base의 내용은 master와 branch가 모두 가지고 시작하기 때문에

이전에도 test가 있었고 master는 그대로인데 branch에서 삭제된것이면 master에는 아무런 수정이 없었다는 이야기 이므로 수정이 있는 branch의 내용을 따라갑니다.

 

code 부분을 보면 base와 branch를 비교하면 수정이 없고 master에서 수정이 있으므로 master의 내용을 따라갑니다.

그후 master에 base에 없고 branch에 없는 내용이면 해당 사항은 master에서 추가적으로 개발한 사항이므로 해당 사항도 추가하여

결과적으로 merge의 결과는 아래와 같이 나옵니다.

merge
 
code 1
add code

 

fast forward merge 란?

이번엔 특수하게 아래와 같은 상황이 있다고 가정합니다.

만약 여기서 master와 hotfix를 합병하고 싶은 경우 어떻게 해야할까요?

 

정답은 아주 간단합니다 branch는 commit을 가리키는 포인터이므로 해당 포인터가 hotfix와 동일한 것을 가리키도록 하면 됩니다.

base는 master이고 해당 내용에서 추가되거나 삭제된 내역을 hotfix에서 가지고 있기 때문에 두가지가 합병되면 hotfix와 동일한 모습입니다.

따라서 이렇게 하면 이것이 fast-forward merge 입니다.

간단하죠?

 

주로 master로 개발을 진행하다 어떤 내용을 수정해야하는데 master에서 수정하면서 테스트하고 에러 수정이 힘든 경우 다른 branch로 해당 내용을 수정하고 후에 합병할 때 사용합니다.

반응형
profile

Antilog의 개발로 쓰다

@Parker_J_S

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...