(진행배경) 로컬 브랜치에 있는 내용을 원격 브랜치로 commit 후 push 하려고 하자 다음과 같은 에러가 나타났다.
$ git push origin main
To https://github.com/user/documents
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/user/documents.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
[문제- failed to push some refs to.. 에러]
(문제원인) 이 메시지는 로컬의 main 브랜치가 원격 저장소의 main 브랜치보다 뒤떨어져 있어서 fast-forward 방식으로 푸시할 수 없음을 나타낸다. 즉 원격 브랜치에는 로컬에 없는 커밋이 존재하고, 이를 반영하지 않고는 새로운 커밋을 푸시할 수 없다.
(해결방법) 이 문제를 해결하기 위해서는 다음 단계를 수행해야 한다:
1. 원격의 변경 사항을 가져온다.
git pull origin main
2. 이후에 충돌이 발생할 경우 충돌을 해결해야 한다. 충돌이 발생하면 해당 파일을 열어서 충돌을 수동으로 해결하고, 충돌을 해결한 후 다시 커밋한다.
git add [충돌 해결한 파일]
git commit -m "Resolve merge conflicts"
3. 변경 사항을 원격 저장소에 푸시합니다.
git push origin main
[문제-Diverging branches can't be fast-forwarded 에러]
git pull origin main으로 원격 내용이 가져와지지 않는 경우
$ git pull origin main
From https://github.com/user/documents
* branch main -> FETCH_HEAD
hint: Diverging branches can't be fast-forwarded, you need to either:
hint:
hint: git merge --no-ff
hint:
hint: or:
hint:
hint: git rebase
hint:
hint: Disable this message with "git config advice.diverging false"
fatal: Not possible to fast-forward, aborting.
(진행배경) 앞선 문제를 git pull origin main 명령어를 실행하여 해결하려고 했으나, 이번에는 "Diverging branches can't be fast-forwarded" 오류가 발생하였다.
(문제원인) 이는 로컬의 main 브랜치와 원격의 main 브랜치가 각기 다른 방향으로 변경되었기 때문이다. 이 상황에서는 단순히 fast-forward로 변경사항을 병합할 수 없으며 추가적인 작업이 필요하다.
(해결방법) 두 가지 방법으로 이 문제를 해결할 수 있다:
1. git merge --no-ff origin/main:
이 명령어를 사용하면 원격의 변경 사항을 현재의 브랜치로 병합한다. 병합 과정에서 충돌이 발생할 수 있으므로, 해당 충돌을 해결한 후 커밋을 생성해야 한다.
git merge --no-ff origin/main
만약 병합 중 충돌이 발생한다면, 해당 충돌을 수동으로 수정한 후, 변경사항을 추가하고 병합 커밋을 생성한다.
git add [충돌 해결한 파일]
git commit
2. git rebase:
이 명령어는 현재 브랜치의 커밋들을 잠시 "백업"한 후 원격 브랜치의 변경 사항을 현재 브랜치에 적용하고, 이전에 "백업"했던 커밋들을 다시 적용한다. 이 방식은 커밋 히스토리를 깔끔하게 유지한다.
git rebase origin/main
리베이스 중에도 충돌이 발생할 수 있다. 만약 그렇다면 충돌을 해결한 후, 리베이스를 계속 진행해야 한다.
git add [충돌 해결한 파일]
git rebase --continue
git rebase를 진행하니 아래와 같이 뜨면서 정상적으로 작동하였다. 이후 pull로 원격 내용을 가져왔다.
Successfully rebased and updated refs/heads/main.
(배운점) 골칫거리였던 git 에러를 해결할 수 있었다. 어떤 방식을 사용할지는 상황과 개인의 선호에 따라 선택하면 된다. 그러나 작업을 진행하기 전에 현재 작업 내용을 백업하거나 별도의 브랜치를 생성하는 것이 좋겠다.