사람들과 협업하며, 프로젝트를 진행하다 보면 다음과 같은 에러를 자주 마주하곤 합니다.
저는 주로 개발 작업이 좀 오래 걸렸을때, 혹은 변경사항에 있어 커밋을 몇번 하고 나서 push를 진행했을때 저런 에러를 마주하곤 했었습니다.
한두번 마주한게 아닌, 종종 모습을 나타내는 이자식... 그래서 어떤 에러인지? 해결방법은 무슨 차이가 있는지?
자세히 에러에 대해서 알아보고, git에서 제시하는 3가지 방법 중 필요한 방법을 선택해서 진행하려고 합니다.
발생 원인
해당 에러가 발생하는 이유는 다음과 같습니다.
1. Pull 방식을 명시적으로 정하지 않음
2. 그로 인한 분기 차이가 발생
3. 로컬 브랜치와 remote 원격 브랜치 사이에 변경 사항 충돌이 발생
발생 원인 예시
가령 로컬 브랜치에서 커밋 A, B, C, D가 생성했다고 가정해보겠습니다.
다른 개발자가 원격 브랜치에 커밋 E, F를 추가했고, 그 상황에서 사용자가 git pull을 실행했습니다.
그렇게 되면 로컬 브랜치와 원격 브랜치의 커밋 내역이 서로 다르기 때문에 "divergent branches" 라는 문구와 함께 에러가 발생하게 됩니다.(push 자체도 reject 당합니다!!)
힌트로 제공된 해결방안 차이점
그럼 이러한 에러를 마주했을때, git에서는 3가지 방법을 제시합니다.
1. git config pull.rebase false -> merge
2. git config pull.rebase true -> rebase
3. git config pull.ff only -> fast-forward only
이 세가지에는 어떤 차이점이 있는지 알아보겠습니다.
git config pull.rebase false(merge)
로컬 브랜치와 원격 브랜치에 다른 부분이 있을 때, 둘을 비교하여 수정한 뒤 merge 하는 방식입니다.
그림과 같은 방식으로 진행이 되는데, 코드를 수정 후에 커밋을 하면, 로컬 브랜치에서의 수정 내용과, conflict 해결 내용 이렇게 2개의 커밋이 올라가게 됩니다.
빨간색 원이 새롭게 생긴 merge 과정에서 발생한 커밋입니다.
git config pull.rebase true(rebase)
로컬 브랜치에 추가적인 merge 커밋 생성 없이 원격 브랜치에 로컬 브랜치를 연결하여 해결하는 방식입니다.
rebase false 방식과 달리 merge 커밋이 생성되지 않으므로, 커밋 내역을 좀 더 깔끔하게 관리할 수 있다는 장점이 있습니다.
git config pull.ff only(fast-forward only)
해당 방식은 로컬 브랜치와 병합할 브랜치가 fast-forward 관계일때만 pull이 가능한 방식입니다.
1. fast-forward 관계인 경우
Main으로 부터 분기된 Branch를 기준으로 보면, Branch의 히스토리는 기존 Main의 히스토리를 포함하고 있는걸 알 수 있습니다. 결국 이는 fast-forward 관계라고 말할 수 있습니다.
fast-forward가 성립할때, merge에 대한 새로운 commit이 생기지 않고 HEAD의 위치만 결국 변하게 됩니다.
2. fast-forward 관계가 아닌 경우
반면 관계가 아닌 경우를 살펴보면, Branch의 히스토리가 Main의 히스토리를 완전히 포함하고 있지 않은걸 알 수 있습니다. 이런 경우에는 git config pull.ff only 방식을 사용할 수 없습니다.
3가지 방식 이외에 해결방안
git에서 제공하는 3가지 방안으로도 충분히 해결할 수 있지만, 그래도 좀 더 간단한 방법을 하나 소개해드리려고 합니다.
git stash
git stash는 작업 중인 변경 사항을 임시로 저장하고, 나중에 복원할 수 있는 기능입니다.
1. git stash
현재 작업 중인 변경 사항을 임시로 저장합니다.
2. git pull
원격과 로컬의 분기 차이를 해결합니다.
3. git stash pop
가장 최근에 저장된 변경 사항을 적용하고, 스택에 쌓였던 stash를 제거합니다. 즉, 변경 사항을 되돌립니다.
이렇게 stash를 활용해서도 분기 차이로 발생한 에러를 해결할 수 있습니다!!
'Daily' 카테고리의 다른 글
Spring Boot - 이메일(SMTP)비동기 전송 (0) | 2024.09.29 |
---|---|
VMware Ubuntu가상환경 Jenkins 설치 (3) | 2024.09.02 |
Mac M1 VMware + Ubuntu 설치 (0) | 2024.08.14 |
Github Actions로 배포 자동화 (0) | 2024.08.12 |
VMware 포트포워딩 - 외부접속(2) (0) | 2024.08.05 |