브랜치를 병합하는 과정에서 충돌이 발생할 수 있습니다.
충돌이란 병합하려는 두 브랜치가 서로 같은 내용을 다르게 수정한 상황을 의미합니다.
충돌이 발생하면 브랜치가 한 번에 병합되지 않습니다.
충돌이 발생하면 최종적으로 어떤 브랜치의 내용을 반영할지 사용자가 직접
선택해야 합니다. 충돌 발생과 해결을 실습해 보겠습니다.
브랜치 충돌시키기
임의의 로컬 저장소를 만들고 master 브랜치에 'A'가 저장된 a.txt 파일을 만들고
first를 커밋 메시지로 하고 커밋합니다.
foo 라는 브랜치를 생성합니다.
foo 브랜치로 체크아웃하고 a.txt 파일에 'A'를 'foo'로 변경하고 커밋합니다.
커밋 메시지는 foo로 적습니다.
master 브랜치로 체크아웃하고 a.txt 파일에 적힌 'A'를 'master'로 변경하고 커밋합니다.
커밋 메시지는 master로 적습니다.
현재 두 브랜치는 a.txt라는 같은 파일을 서로 다르게 수정하였습니다.
이 때 두 브랜치를 병합해보겠습니다.
master 브랜치로 체크아웃하고 foo 브랜치를 병합시켜 보겠습니다.
다음과 같이 오류가 발생합니다.
다음과 같이 커밋하지 않은 변경사항이 생기고,
스테이지에 올라가지 않은 파일과 스테이지에 올라간 파일 항목에 충돌이 발생한 파일이 추가됩니다.
충돌 해결하기
브랜치 병합 과정에서 충돌이 발생하면 충돌을 해결하고 커밋해야 브랜치가 올바르게 병합됩니다.
충돌을 해결하기 위해서는 같은 내용을 다르게 수정한 브랜치 중
어느 브랜치 내용을 반영할지를 직접 선택해야 합니다.
스테이지에 올라가지 않은 파일 속 a.txt 파일을 클릭합니다.
우측 하단에 다음과 같습니다.
======기호를 기준으로 윗 부분은 HEAD가 가리키는 브랜치 내용이,
아랫부분은 병합하려는 브랜치 내용이 적혀있습니다.
이 두 부분 중 반영할 부분을 직접 선택해서 충돌을 해결해야 합니다.
master 브랜치의 내용을 반영해 보겠습니다.
스테이지에 올라가지 않은 파일 항목에 있는 a.txt 파일에서 마우스 우클릭을하고 충돌 해결을 클릭합니다.
'내것'을 이용해 해결 항목과 '저장소' 것을 사용하여 해결 항목이 있습니다.
전자는 현재 체크아웃된 브랜치인 master 브랜치의 내용을 반영하겠다는 것이고
후자는 병합하려는 브랜치인 foo 브랜치의 내용을 반영하겠다는 의미입니다.
master 브랜치의 내용을 반영시키기 위해서는 '내것'을 이용해 해결을 클릭합니다.
다음과 같이 충돌이 해결된 것을 볼 수 있습니다.
충돌을 해결했다고 해서 브랜치 병합이 끝난 것은 아닙니다.
브랜치를 병합하기 위해서 충돌 해결을 하고 다시 커밋을 해야합니다.
파일 상태로 들어갑니다.
다음과 같이 이미 커밋 메시지가 자동으로 기입되어 있습니다.
커밋을 클릭합니다.
다음과 같이 성공적으로 병합된 것을 확인할 수 있고
a.txt 파일 내용을 클릭하면 master 브랜치의 내용으로 업데이트 되어 있습니다.
브랜치 재배치하기
브랜치의 재배치는 rebase라고 합니다.
브랜치의 재배치란 브랜치가 뻗어나온 기준점을 변경하는 것을 말합니다.
예를 들어서 master 브랜치의 두 번째 커밋에서 foo 브랜치가 뻗어져 나왔는데
foo 브랜치를 네 번째 커밋에서 뻗어나오도록 변경하는 것을 말합니다.
새로운 로컬 저장소를 만들고 master 브랜치에 'A'가 저장된 a.txt 파일을 만들고 커밋합니다.
또, 'B'가 저장된 b.txt 파일을 만들고 커밋합니다.
커밋 메시지는 각각 1과 2로 합니다.
foo라는 새로운 브랜치를 만들고 체크아웃 합니다.
'C'가 저장된 c.txt 파일을 만들고 커밋합니다.
'D'가 저장된 d.txt 파일을 만들고 커밋합니다.
커밋 메시지는 각각 3과 4로 합니다.
master 브랜치로 체크아웃합니다.
'C'가 저장된 c.txt 파일을 만들고 커밋합니다.
'D'가 저장된 d.txt 파일을 만들고 커밋합니다.
커밋 메시지는 각각 3과 4로 합니다.
앞서 재배치를 얘기하면서 든 예시와 똑같은 상황이 되었습니다.
브랜치를 재배치하기 위해서는 재배치하려는 브랜치로 체크아웃해야 합니다.
foo 브랜치로 체크아웃합니다.
재배치하려는 브랜치의 커밋에 마우스 우클릭을 합니다.
master 네 번째 커밋으로 브랜치를 재배치할 예정이기 때문에
master 네 번째 커밋에서 마우스 우클릭 후 재배치를 클릭합니다.
다음과 같이 브랜치가 재배치된 것을 확인할 수 있습니다.
'GIT' 카테고리의 다른 글
[GIT]#12 원격 저장소와 네 가지 상호 작용1 (0) | 2024.04.03 |
---|---|
[GIT]#11 깃허브 소개 (0) | 2024.04.02 |
[GIT]#9 브랜치 병합하기 (0) | 2024.03.14 |
[GIT]#8 브랜치 나누기 (0) | 2024.03.11 |
[GIT]#7 버전을 나누어 관리하는 이유 (0) | 2024.03.10 |