만약 나의 origin repository가 upstream과 동일하게 최신화 되어있는 상태에서, 내 로컬은 아직 이전 버전인 상태인데 파일을 push 하고자 한다면? 깃은 아마도 pull을 먼저 진행하고 push하라고 에러를 뿜어줄 것이다.
안전하게 merge하기 위해서는 여러 에러들을 거쳐가야 한다.
매번 같은 에러를 만날 때마다 머리를 싸맸는데 그중에 한가지 방법을 기록해두고자 한다.
현재 내 로컬에서 아직 git add나 git commit되지 않은 변경사항이 있다면, git pull upstream branch
나 git pull origin branch
둘 다 되지 않을 것이다. 이럴 땐 working tree에 남아있는 수정사항들이 있는지 먼저 확인해보고 있다면 전부 add 처리를 해줘야 한다. 그런 다음에 git pull을 시도했을 때, 순탄히 되지 않을 가능성이 높다.
따라서 이런 에러를 마주하고 싶지 않다면 반드시 로컬 저장 후 커밋 -> push -> 내 원격 레포 -> 내 원격 레포와 업스트림 레포를 fetch & merge로 최신화하기
이러한 순서로 진행하길 바란다.
나의 repository가 이미 업스트림에 맞게 최신화 되어있기 때문에 브랜치가 한단계 더 앞에 있어 현재 내 로컬브랜치와 출발점이 맞지 않아 push가 되지 않는 상황이 생긴다.
이럴 경우 뜨는 에러는
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
git config pull.rebase false # merge (the default strategy)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only
You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.
이러하다. 친절하게 깃에서 알려주는 대로 git config pull.rebase true
이런 명령문으로 에러를 해결해 볼수도 있겠지만, config 설정을 해두면 원치 않을 경우에도 위의 설정이 적용되어 나중에 불편한 상황이 올 수도 있다.
그렇다면 지금 할 수 있는 선택은 내 로컬에서 새로운 브랜치를 만들고,
그곳에서 rebase를 해준다음,
원래 머지하려했던 나의 로컬 브랜치로 merge하는 법이다.
이렇게 진행하면 새로운 브랜치에 최신화된 코드를 내 로컬로 가져와서 나의 다른 로컬 브랜치랑 합치는 작업을 해볼 수 있다.
다른 브랜치를 새로 만든 이유는 혹시 모를 손실을 막기 위해 따로 브랜치를 파서 진행한다.
git checkout -b 새로운브랜치 합치려는브랜치
: 새로운 브랜치를 만들고 해당 브랜치로 변경해준다.
git pull --rebase upstream 합치려는브랜치
: rebase처리해줌으로써 깃 브랜치 상태를 최신화 시켜줄 수 있다.
에러가 없었으면 좋겠지만 대부분 발생할 가능성이 크다. upstream에서 누군가가 내가 작업한 파일에서 변경을 했다면, 자동으로 merge될수 없기 때문이다. 이럴 때는 vscode에서 코드를 보고 살릴 부분을 확인하고 저장 후
git add .
한 후에 git rebase --continue
를 해준다.
위와 같은 과정이 한번에 해결되는 건 아니고 충돌이 나는 부분이 있을 때마다 발생한다.
따라서 발생할 때마다 수정사항 저장 git add .
(vscode source control에서 staged changes로 올라갔는지 한번 확인) 하고, git rebase --continue
를 진행해준다.
계속 진행하다 보면 rebase가 완료되었다는 메세지를 볼 수 있게 된다! 따라서 완료 메세지를 보기 전까지는 계속해서 위의 과정을 진행해줘야 한다.
rebase가 되었다면 이제 내가 원하는 브랜치와 merge하는 작업만 남았다.
git checkout 합치려던브랜치
로 브랜치를 바꿔주고,
git merge --no-ff 새로만들었던브랜치
를 하고
git push origin dev
를 해준다.
이제 무사히 나의 로컬에 있던 파일들이 업스트림 파일들과 잘 머지 되어 합쳐진 최신 버전으로 내 원격 레포지토리에 올라가는 것을 확인할 수 있다. 그리고 나서 upstream 브랜치도 최신화시켜야 한다면, pull request를 열어 머지 작업을 해주면 된다.
항상 같은 문제가 발생하고 같은 오류 메세지를 만나다가 이번에는 제대로 해결해보자 싶어 해결 후 기록해두었다. 물론 rebase하는 것 말고 다른 좋은 방법들이 있을테니 좀 더 깃 사용법에 대해 학습해봐야겠다. 우선은 rebase로 머지를 해주고 최신화를 시켜주는 방식을 하나 익혔다.
무엇보다도 내 원격 레포를 fetch upstream으로 아무 생각없이 하지 말고!!!!! 먼저 내 로컬의 변경사항들을 잘 저장하고 커밋해두고 push까지 한 후에!! 진행하는 것이 베스트인 것 같다. 깃으로 다시 한번 소중한 교훈을 얻어간다....ㅎ