git merge

 

 

나뉘어진 브랜치를 다시 하나의 브랜치로 합치는 것을 말한다.가장 오류가 많이 발생하는 과정이니 주의해야 합니다.

 

 

 

 

merge의 기본적인 사용방법

  1. 현재 브랜치를 메인이 되는 브랜치로 전환합니다.
  2. 수정된 브랜치를 Merge해야 오류가 발생하지 않습니다.
  3. 여러 개의 브랜치들을 한꺼번에 Merge할 때도 마찬가지로 차례차례 기존 브랜치 상태에서 Merge를 진행합니다.
#merge 하는 방법 

git checkout <메인이되는branch> 
git merge <합쳐질branch>//현재 branch의 내용과 합칠 브랜치이름

 

 

 

 

 

 merge의 종류

 

머지는 두가지 종류로 나눌 수 있습니다.(아래의 그림들에서 C0가 가장 오래된 commit입니다. )

 

 

1. fast-forward

 

패스트 포워드란 뿌리가 되는 브랜치에 변화가 주어지지 않은 채 다른 변화가 생긴 브랜치로 머지를 하게 되는 것 그러면 새로운 커밋이 생성되지 않고 머지를 한 대상 브랜치의 마지막 커밋에 뿌리가 되는 브랜치가 자리잡게 됩니다.

 

서로 다른 상태를 병합하는 것이 아니고 master를 hotfix 위치로 이동만 해도 되는 상태이기 때문에 별도의 머지를 위한 커밋이 발생하지 않습니다.

 

 

 

2. non-fast-forward

 

패스트 포워드가 아니므로 새로운 커밋을 생성해 그곳에 머지를 하게됩니다.

 

 

iss53을 master에 병합해보려고 합니다. 아예 다른 결과물을 갖고있는 master와 iss53은 merge되어 C6이라는 commit을 만들게 됩니다.

이렇게 병합할 때 새로운 commit을 생성할 경우를 merge commit 이라고 합니다.

->위의 merge의 기본적인 사용방법이 non-fast-forward방식의 merge입니다.

 

 

다시 정리하자면 merge commit은 서로 다른 상태의 브랜치를 병합해서 새로운 commit을 만드는 경우이고

fast forward는 동일 내용이 포함되는 브랜치일 경우 브랜치 이동만으로 병합해서 따로 commit을 생성하지 않는 경우입니다.

 

 

 

 

 

 

충돌(Conflict) 발생 → merge실패

 

머지를 할 경우 충돌의 위험이 있을 수 있습니다.

충돌은 다음과 같은 경우에 생기게 됩니다.

  • 각 브랜치에서 같은 파일의 이름으로 그 내용이 다른데 머지를 시도할 경우 -> 충돌발생!

충돌이 발생하게 되면 index 파일에는 그 둘 브랜치 사이의 base 커밋의 파일 내용과 각 브랜치의 커밋의 서로 다른 파일의 내용을 참조해서 총 세개의 파일 내용을 참조하게 됩니다.

 

여기서 깃은 이 문제를 3way merge(automatic merge) 방법을 통해 이 충돌을 해결하려고 시도합니다.

하지만 같은 파일인데 내용이 서로 상이하게 바뀌었을 경우는 깃에서 해결을 하지 못하고 충돌 에러를 발생시킵니다.

그러면 이때 해당 충돌 기록을 살피며 해당 파일의 내용을 살펴보며 직접 수정을 해야합니다.

 

 

 

 

 

3way merge

서로 다른 브랜치의 커밋을 머지할 경우 발생하는 충돌에 대해서 깃은 3way merge라는 방법을 통해 충돌을 해결합니다.

 

이를 조금 더 자세히 살펴보면

  1. 3way merge는 base의 내용을 참고한다. (base에서 해당 파일이 어떤 내용을 담고 있었는지를 파악한다.)

  2. 한 브랜치의 파일만 바뀐 경우 바뀐 쪽으로 변경이 된다. (바뀐 쪽이 더 진보된것이므로..?)

  3. 두개 다 바뀌지 않았을 때는 base의 내용을 그대로 따른다.

  4. 이름이 같은 두 파일의 내용이 서로 다르게 바뀌었을 때는 사용자가 직접 수정을 해야 한다.

 

 

 

 

 

 

 

 

 

 

참조:

 

yuja-kong.tistory.com/51

 

sublivan.tistory.com/29?category=905894

 

mafams.tistory.com/40

 

반응형

'git(분산 버전 관리 시스템)' 카테고리의 다른 글

[git] git branch  (0) 2021.03.10
[git] git snapshot  (4) 2021.03.10
[git] git clone  (0) 2021.03.09
[git] git pull  (0) 2021.03.08
[git] git push  (0) 2021.03.06

+ Recent posts