개발자

깃 merge 충돌이 나는 경우를 정의할 수 있나요?

2024년 10월 18일조회 49

서적에는 이렇게 나와있습니다. "병합하려는 두 브랜치가 서로 같은 내용을 다르게 수정한 상황에 충돌이 발생한다." "같은위치의 코드를 두 브랜치가 동시에 수정하면 충돌이 발생한다." 따라서 저는 같은 파일,같은 라인 코드를 서로 다르게 수정하면 충돌이 난다고 생각했습니다. 근데 첨부한 사진과 같은경우 충돌이 안더라구요;; 브랜치는 main, develop 2개가 있습니다. 그리고 2개의 브랜치 소스는 아래와 같습니다.(1번째 사진) 그리고 먼저 main 브랜치로 person 소스를 아래와 같이 수정하고 커밋, 푸시를 진행하였습니다.(2번째 사진) 그리고 develop 브랜치로 person 소스를 아래와 같이 수정하고 커밋, 푸시를 진행하였습니다.(3번째 사진) 그리고 person 브랜치를 main 브랜치에 merge 시켰습니다. 각 브랜치의 소스를 보면 main의 5번째 줄 함수명이 b 이고 9번째 줄 함수명은 c 입니다. 근데 develop 브랜치의 5번째 줄 함수명은 d 이고 9번째 줄 함수명은 b 입니다. 이렇게 되면 서적의 내용만 봤을땐 같은 위치의 코드를 각각의 브랜치에서 서로 다르게 수정을 했는데 왜 충돌이 발생하지않고 merge 가 진행되는건가요..? 일단 merge 를 하면 첨부사진과 같이 됩니다.(4번째 사진) 뭔가 충돌발생하는 경우를 정확히 정의하고 알고 넘어가고싶은데 어려운것 같습니다... 선배님들은 어떻게 이 부분을 이해하고 계신가요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 1

문정동개발자님의 프로필 사진

깃이 변경을 감지하는 알고리즘이 한줄한줄 비교하는게 아니라 이전 소스에서 뭐가 변경됐는지를 확인해서 그렇습니다. 예를들어 const a = 1 const b = 2 이런 소스가 있을 때 아래와 같이 수정을하면 const a = 1 const c = 3 const b =2 두번쨰줄이 변경되고 세번째줄이 추가되었다고 생각할 수 도 있지만, 두번쨰줄이 3번째줄로 내려가고 두번째줄이 추가되었다고 생각할 수도 있습니다. 여기서 깃은 두번째 전략을 사용합니다. "병합하려는 두 브랜치가 서로 같은 내용을 다르게 수정한 상황에 충돌이 발생한다." "같은위치의 코드를 두 브랜치가 동시에 수정하면 충돌이 발생한다." 따라서 여기서 같은내용,같은 위치라는게 같은 라인을 말하는게 아니고 실제로 같은 부분을 의미합니다. 원본 const a = 1 const b = 2 브랜치1 const a = 1 const b = 3 브랜치2 const a = 1 const b = 4 이렇게하면 충돌이 납니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2024년 10월 18일

Git Merge 충돌은 두 브랜치가 동일한 파일의 동일한 줄을 다르게 수정하고, 각각 커밋했을 때 발생합니다. 하지만 그것이 항상 충돌을 일으키는 것은 아닙니다. Git은 가능한 한 자동으로 병합 작업을 수행하려고 시도합니다. 사진에 대한 구체적인 내용이 없어서 정확한 상황 파악이 어렵지만, 보통 Git이 '충돌'을 판단하는 기준은 두 브랜치가 "동시에" 동일한 코드를 수정했느냐입니다. 즉, 한 브랜치에서 변경 사항을 커밋하고 나면 그 이후에 다른 브랜치에서 해당 부분의 코드를 수정하더라도 Git은 이를 순차적인 변경으로 인식하여 자동으로 병합해버립니다. 그 과정에서 함수명 등 중요하게 인식되어야 할 부분들까지 자동으로 병합되어 문제가 발생할 수 있습니다. 따라서 좀 더 안전한 작업을 위해선 코드 변경 사항을 잘 관리하고, 필요에 따라 병합 전 리베이스(rebase) 등의 방법으로 최신 상태를 유지하는 것이 좋습니다. 추가로, Git에서의 병합 충돌은 다음과 같이 이해할 수 있습니다: 1. '동시에' 수정된 경우: 두 브랜치가 동일한 시점에 동일한 코드를 수정하고 커밋했다면 Git은 이를 충돌로 판단합니다. 2. '순차적으로' 수정된 경우: 한 브랜치에서 코드를 수정하고 커밋하고, 그 후 다른 브랜치에서 해당 코드를 수정했다면 Git은 이를 순차적인 변경으로 인식하여 자동 병합을 진행합니다. 3. '병합 기준' : Git은 어떠한 변경 사항도 잃어버리지 않는 선에서 최대한 자동 병합을 시도합니다. 따라서 명확한 순서를 가진 변경사항이라면 충돌 없이 병합됩니다. 하지만 일부 중요한 부분(함수명 등)까지도 자동으로 변경되므로 주의가 필요합니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!