이전 파트에서 git push와 git pull 커맨드를 배웠다.
(기억안난다면 커멘드 클릭해서 되풀이하기)
이번에는 git push를 쓸 때 자주 만나게 되는 상황을 설명해보겠다.
우선 premium 브랜치에서 시작해보자 (git checkout premium)
premium 브랜치에서 내용을 좀 더 추가해보자면
다음프로젝트 일정에 관한 내용을 추가하고 저장 한다음
git add 하고 커밋을 해줬다.
이렇게 로컬 레포지토리의 premium 브랜치에서 커밋을 해줬다.
이제 리모트 레포지토리의 premium 브랜치로 이동하기위해 깃허브 페이지의 premium 브랜치에 접속해보자
깃허브의 premium 브랜치에서도 README파일을 수정해보자
이렇게 로컬 레포지토리와 다른 내용을 넣었다.
상황을 정리해보자면..
로컬 레포지토리의 premium 브랜치와 리모트 레포지토리의 premium 브랜치가 가리키는 최신 커밋이 서로 다르다.
즉 하나의 프로그램에서 각각 다른 개발자가 다른 방식으로 개발 했다고 가정 해볼 수있다.
이런 일이 실무에서 매우 자주 일어나는 일이라고 한다.
방금 깃허브에서 직접 리모트 레포지토리를 수정한 건
사실 다른 개발자가 리모트 레포지토리를 수정한 상황을 가정한 것이다.
이런식으로 팀 동료가 본인 컴퓨터에서 premium branch에 해당 내용을 추가하고 커밋하고
그대로 리모트 레포지토리의 premium 브랜치로 git bush를 하면
자신의 로컬 레포지토리에 있는 premium 브랜치와 내용이 당연히 달라진다.
리모트 레포지토리를 중심으로 협업을 하다보면 자연스럽게 일허나는 현상이다.
만약 이 상태에서 로컬 레포지토리에서 push를 하면 어떻게 될까?
당연히 오류가 날 것이다.
이미 다른 개발자가 추가한 내용이 있는데 자신의 코드를 그냥 반영해버리면 덮어지기 때문에 오류가 나는 것.
이렇게 로컬 레포지토리를 수정하는 동안 이미 리모트 레포지토리에 변화가 생겼다면 'git push'를 할 수없다.
이때 일단 git pull을 해서 다른 개발자가 작업했던 내용이 현재 본인의 premium 브랜치에도 반영된다.
마찬가지로 에러메시지가 났는데 ' CONFLICT (content): Merge conflict in README.md ' 라고
예전에 머지를 할때 충돌(conflict)이 발생하는 경우에서 봤었다.
근데 왜 하필 지금 머지충돌이 발생했을까?
git pull을 하면 리모트 레포지토리의 premium 브랜치에 있는 최신 커밋들을
로컬 레포지토리의 premium 브랜치로 가져오고 그것을 그대로 marge 하는데,
이렇게 리모트 레포지토리의 최신 커밋들을 가져와서 merge 하는 과정까지가 git pull이다.
그래서 git pull을 할 때도 충돌이 발생할 수있는 것이다.
문제 해결 방법은 merge conflict 해결법이랑 같다 (= git merge --abort )
또는 해당 파일에 들어가면 필요없는 부분 지우고 저장해준다.
협업자가 변경해서 올려둔 파일에 문제가 있거나 로컬레포지토리에서 변경된 사항과 비교했을때
문제가 있는 코드일수도 있지만 일단 이 부분은 넘어가고 저장해준다.
그 다음 터미널에서 git add 와 커밋(git commit 만) 을 실행해주면
맨위에 "Merge branch 'premium' of https://github.com/SeopE9611/LayoutStudy into premium" 라고
커밋 메시지가 준비되어있는데 해석해보면
리모트 레포지토리의 premium branch를 로컬 레포지토리의 premium branch로 merge 한다는 뜻이다.
사실 git pull은 결국 리모트 레포지토리의 branch를 가져와서 merge하는 동작이다
그래서 방금처럼 충돌 난것이다. 이 merge를 마무리하면 git pull이 잘 완료 되는 것.
한번 해보자
저 메시지를 그대로 써도되고 새로운 내용을 적어줘도된다. 필자는 그대로 써보겠다.
(git bash는 :wq 엔터 / vscode는 창닫기)
이렇게 새로운 커밋 메시지가 추가됨과 동시에 git pull이 완료 되었다.
결국 git pull은 " 리모트 레포지토리의 branch를 가져와서
현재 branch에 merge하는 커맨드이다" 이렇게 이해 할 수있다.
히스토리를 보면,방금 pull을 통해 merge한 커밋이 보인다.
확인이 됐으면 이대로 git push를 해주자
push를 하고 깃허브에 premium 브랜치에서도 잘 적용 된 것을 볼 수있다.
정리
A라는 개발자와 B라는 개발자는 둘 다 똑같은 리모트 가져와서 각각 새로운 커밋을 했다고 가정해보자
이때 개발자 B가 먼저 push하고나면 개발자 A는 바로 push를 할 수없다.
그래서 git pull을 이용해서 리모트의 그 branch에 있는 다른 개발자가 한 커밋을
자신의 로컬 레포지토리에 있는 branch에도 반영 시켜야한다.
이 과정은 결국 리모트의 branch를 가져와서 내 로컬에 merge 하는것과 같다.
그런데 이때 git pull이 바로 성공하는 경우도 있지만 대부분 conflict가 발생한다.
그렇기에 그냥 conflict를 해결해주고 다시 커밋을 하면된다.
그리고 나서 다시 git push를 해주면 정상적으로 실행된다.
다시 말하지만 현실에서 여러 개발자가 하나의 프로젝트에서 협업할 떄가 많다.
그래서 git push가 바로 잘 안되는 경우가 오히려 일반적이므로 이러한 설명으로 git pull을 해보자.
'Git' 카테고리의 다른 글
(실무_3) Git Part2 - git blame / 코드 작성자 찾기 (0) | 2024.09.10 |
---|---|
(실무_2) Git Part2 - git pull 와 git fetch (0) | 2024.09.10 |
Git (17)~(22) 커맨드 정리 (0) | 2024.09.10 |
(22) Git -merge [심화] (0) | 2024.09.10 |
(21) Git -reset / checkout [심화] (0) | 2024.09.10 |