Git sourceTree 4

양진영·2023년 1월 30일
2

Git

목록 보기
5/5

이전번 포스팅까지는 사실 어느정도 가벼운 마음으로 했다면 오늘할 포스팅은 살짝 긴장이 되는 마음으로 공부했다. 사실 충돌과 충돌해결 이야 말로 깃헙을 이용하여 협업하는 목적이자 깃헙의 꽃이라고 생각된다. 그럼 시작해 보겠다.

충돌

충돌은 왜 나는것일까? 충돌이 왜 나는지 부터 설명을 하고 가겠다. 깃헙을 이용한 협업은 합집합이라고 생각하면 쉬울것같다. a U ab = ab가 될것이다. 서로 다른 부분에서 합쳐진다. 마찬가지로 a U a = a 가 되는것처럼 같은부분이 일관적으로 다르지 않다면 충돌없이 그냥 기존의 것으로 합쳐질것이다. 하지만 충돌은 언제 일어나냐면 같은 부분이 달랐을때 이다. 사실 말로 풀어내면 어느정도 읽다가 집중력 떨어지니 예제를 들어보자면

a의 코드

나는 brad야!

b의 코드

나는 jin이야!

두명의 개발자가 첫번째 줄에 한명은 "나는 brad야!"를 남겼지만 다른 한명은 첫번쨰 줄에 "나는 jin이야!"라고 남겨 서로 같은 첫번째줄에 개발을 했지만 내용이다르다. 이럴때 충돌이 나게 되는것이다. 같은 부분에 다른 내용이 담겨졌으면 충돌! 이라고 이제는 이해하기 쉬울것이다.

코드가 합쳐지는 흐름

사실 소스트리로 충돌 해결을 보여주는것도 중요하지만 코드가 합쳐지는 흐름을 한번 쭉 다시 이해하고 가는것이 충돌해결에도 도움이 될거라고 생각한다. 왜냐? 흐름을 모르면 누가 무엇을 어디로 푸시 하고 어디서 풀을 받고 에러가났을땐 왜 났는지 이해하는편이 이쪽이 자연스럽기 때문에...

상황적인 예시로 풀어보겠다. 개발자 A,B,C가 있고 base branch는 develop이다. 이때 a,b,c는 업무를 시작하기전 자신의 로컬 저장소 develop branch에 최신 원격 base branch를 pull받는다 (물론 pull받기전 fetch로 최신본을 받아오는걸 잊지 말자). 이후 a,b,c 모두 같은 코드로 시작을 하게되지만 각자 맡은 기능이나 버그 수정을 위하여 로컬 저장소 develop 브랜치로 부터 새로운 브랜치로 파고 나간다. a는 댓글기능, b는 메인페이지 기능 그리고 c는 좋아요 기능을 개발하기 위하여 각자에 맞는 브랜치를 생성하고 거기서 작업을 한다. 시간이 지나 모두 작업이 종료 되었다. 이상태에서는 모두가 같은 코드로 시작했으나 처음과 비교해 수정,추가 삭제가 된 코드가 있을것이다. 그렇다면 다시 코드 동기화의 시간이 필요하다. 우선 a 부터 코드를 원격 저장소에 올리겠다. a는 자신이 작업한 브랜치와 base가 되는 브랜치를 로컬에서 병합한다. 이후 로컬의 base브랜치를 원격 저장소의 base 브랜치에 push 한다. 이제 b의 차례이다. b는 자신이 작업한 브랜치를 원격저장소에 올리되 base 브랜치에는 올리지 않는다. 이후 b는 자신의 로컬 base 브랜치로 돌아와 원격 저장소의 base branch와 동기화 작업을한다. 이때 b의 로컬 base branch의 내용은 a가 작업한 내용일 것이다. 그리고 자신이 업무했던 branch와 base branch(a의 작업 내용)과 병합을 한다. 이때 충돌이 안나면 좋겠지만 나게 된다면 서로의 협의 또는 선임자의 재량으로 코드를 수정한다. 이후 충돌이 해결되면 b의 작업브랜치와 base 브랜치가 병합이되고 이 병합된 base 브랜치를 원격 저장소 base 브랜치로 푸시해준다. 이때 원격 저장소 base branch의 내용은 a와b가 작업하고 병합했을때 충돌이 났던 코드를 수정한 코드가 올라가게 될것이다. 이제 마지막 c의 차례이다. c도 자신의 작업물을 원격 저장소에 올리고 자신의 로컬 base 브랜치와 원격 base브랜치를 병합시킨다. 그리고 자신이 작업했던 브랜치와 base 브랜치를 머지하고 이과정에서 충돌이 일어난다면 다시한번 위의 과정을 거치게 될것이다. 그리고 모두의 작업물이 원격 저장소의 base branch에 올라갔다면 하루를 마치기 전이든 업무를 시작하기 전이든 관련 업무를 하는 모든 개발자는 코드의 최신화를 위하여 모두의 작업물이 있는 원격 저장소 base 브랜치를 pull받고 업무를 시작해야할 것이다.(패치 까먹지 말아야한다)

흐름만 이해하면 나머진는 vscode와 같은 ide에서 깃과연동하여 ui적으로 충돌을 해결할수있을것이다.

profile
왜? 라는 질문을 중요시하는 서버 개발자입니다

1개의 댓글

comment-user-thumbnail
2023년 2월 5일

매주 열심히 글 올려주시네요! 화이팅입니다

답글 달기