[Git 완전정복] 원격저장소(Github)에 pull, push할 때 발생할 수 있는 문제

Yellowtoast·2023년 2월 20일
0

Git 완전정복

목록 보기
3/3
post-thumbnail

Github에 있는 코드를 pull 하지 않고 push 하였을 때

내가 코드를 수정하고, 커밋하고, github에 push 할때까지 모두가 기다려준다면 좋겠지만 현실은 그렇지 않죠. 협업시에는 다른 개발자들이 코드를 수정하고 github에 push하는 일이 당연히 발생할 수 밖에 없습니다.

작업을 시작할 때,연결된 github에 있는 코드로 내 코드를 최신화 하지 않고(즉, pull 하지 않고) 작업을 한다면, commit 후 push를 한다면 실패할 수 밖에 없을 겁니다.

위의 에러는, Github에서 직접 코드를 수정한 후 pull 하지 않고, 로컬에서 수정된 코드를 push하려고 했을 때 발생하는 오류입니다.

Git의 입장에서는 당연한 일입니다. 최신화되지 않은 로컬의 코드를 모든 개발자가 공유하고 있는 Github의 코드에 push해서 덮어씌운다면 모두가 열심히 작업한 코드가 없어져버리는 최악의 상황이 발생할 수도 있기 때문이죠.

그렇다면 이런 상황이 발생했을 때 취할 수 있는 방법이 어떤 것들이 있을까요?

우선 원격 저장소에 있는 코드들을 pull 해야합니다.

push하기 전 원격저장소에서 pull 하기

1. git pull --no-base

nobase는 뜻은 rebase가 아니라는 뜻이므로 merge 한다는 뜻이 됩니다. 로컬의 main 브랜치와, 원격의 main브랜치가 갈라진 다음, merge 됩니다.

다시 말하면, 이 방식은 로컬과 원격 저장소의 어긋난 시간선을 한군데로 모아서 붙여서 pull 작업을 하게 됩니다.

2. git pull --rebase

해당 코드는 commit 시점에 따라서 로컬의 코드를 origin원격저장소)의 기본 타임라인에 딱 붙이게 됩니다.

다시 말하면, 이 방식은 원격에 맞춰서 타임라인에 원격을 먼저 붙인 다음 내 프로젝트 코드들을 잘라서 붙이게 되는 것입니다.

pull 했을때 충돌이 발생한다면?

이런 상황을 생각해봅시다. 다른 동료가 특정 코드를 수정해서 원격 저장소에 push를 하고, 저는 동일한 부분의 코드를 수정했다면 어떻게 될까요?

당연히 원격 저장소의 코드를 pull 한다면 충돌이 발생하고 말 겁니다.

이런 상태에서 pull no rebase와 pull rebase코드를 둘다 한번 실행해 보겠습니다.

1. git pull --no-base

발생한 충돌에서 어떤 코드를 남길 것인지 선택합니다. 둘다 남길 수도 있고 충돌 부분에 아예 새로운 코드를 추가할 수도 있겠죠?

충돌을 해결한 후 git add.git commit 을 실행하면 충돌이 정상적으로 해결되고 pull을 통한 로컬저장소와 원격저장소의 merge가 정상적으로 수행됩니다.

1. git pull --rebase

이번에는 rebase를 수행해 봅시다. 하지만 이번에는 충돌 부분에서 local의 변화가 아닌 원격 저장소의 변화를 받아들여본다면 어떻게 될까요?

동일한 충돌이 발생했습니다.
이전에 설명했듯이, pull rebase의 경우 원격저장소의 변화를 먼저 받아들인 다음, 로컬의 변화를 위에 가져다가 붙인다고 했었죠?

그렇다면 이미 원격 저장소의 변화가 붙여진 상태에서, 발생한 충돌 코드 부분의 원격저장소의 것으로 바꾸어 계속 진행하면 어떻게 될까요?

git add .git rebase --continue를 실행해봅시다.

이 경우 커밋이 2개가 아닌 하나만 추가되게 됩니다.

원격에서 최신화 한 코드에서 변화가 없는 방식으로 충돌을 해결했기 때문에 변화가 없다고 감지하여 새로운 커밋이 추가되지 않고 원격의 커밋이 그대로 남아있게 됩니다.

local의 내역을 원격저장소로 강제 push 하기

git push --force

로컬에 있는 상태로 remote강제로 push 하여 덮어씌웁니다.

profile
Flutter App Developer

0개의 댓글