충돌이 뭐요?
버전관리 시스템에서 충돌이란 무엇이고 언제 발생할까?
충돌은 부딪히는 걸 말하는데,
깃에서는 로컬 리포지토리 => 리모트 리포지토리로 Push 하는 내용이 겹치는 것을 말한다.
두 개발자가 같은 파일에 대해서, 같은 버전에 대해 다른 작업을 해서 둘 다 서버에 Push 하려고 할 때 충돌이 발생한다.
깃 서버는 늦게 보낸 쪽의 Push를 거절한다. (reject)
혼자서도 의도적으로 충돌을 일으켜서 해결 실습을 해볼 수 있다.
리모트 리포지토리를 로컬에 두 개를 clone 한다.
그리고 같은 파일에 대해서 수정한 후 add >> commit >> push 해보면 된다.
그러면 늦게 한 쪽의 push가 reject 된다.
충돌은 어떻게 해결하는가? 방식은 한가지가 아니나 Merge 방식을 가장 많이 사용한다.
우선 거절당한 클라이언트에서 git pull로 서버 최신 변경기록을 가져온다.
(이 때 로컬 리포를 덮어쓰지 않으므로 걱정하지 마라)
충돌났을 때 pull 하면 merge 상태로 가져올 수 있다. 머지상태가 되면 이렇게 내용이 문법에 따라 변경이 된다.
*참고로 git config pull.rebase false 로 pull.rebase에 대한 값이 false로 설정이 되어있어야 머지가 된다.
저 HEAD 부터 Test까지가 머지된 내용이다. 이 머지된 부분을 사람이 해결해줘야지만 push할 수 있다.
VSCode에서 머지된 영역이 초록, 파랑으로 화려하게 칠해져 있다. 표현만 그렇게 된 것이고 당연히 저 부분도 플레인 텍스트다.
깃의 머지를 보면, 문제가 발생했을 때 사람이 해결하는 방법과 유사한데 그것을 아주 편하게 해주는 걸로 보인다.
버전관리는 더 좋은 방법으로 개선되겠지만, 지금만 봐도 정말 개발자를 지옥에서 구해준 소프트웨어가 아닐까 싶다.
굳이 개발자가 아니어도 작가들이나 계약, 법에서는 이런 버전관리 소프트웨어가 도움이 될 것 같다.
법률도 그렇고, 그림도 그렇고, 소설도 그렇고..
문서의 버전관리가 필요한 경우가 많은데 깃을 쓸 수 있으면 도움이 될 것 같다. 찾아보니 이미 유명 솔루션이 있는 경우도 있더라.
*참고..
터미널 cd 관련하여 응용
cd .. 이전 경로로
cd ../abc 하면 이전경로로 간 다음에 거기 있는 abc 경로로 이동할 수 있다.