Git/트러블슈팅

[트러블슈팅] failed to push some refs to.. 와 Diverging branches can't be fast-forwarded 에러 해결하는 법

paintover23 2023. 8. 23. 20:12
728x90

(진행배경) 로컬 브랜치에 있는 내용을 원격 브랜치로 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 에러를 해결할 수 있었다. 어떤 방식을 사용할지는 상황과 개인의 선호에 따라 선택하면 된다. 그러나 작업을 진행하기 전에 현재 작업 내용을 백업하거나 별도의 브랜치를 생성하는 것이 좋겠다. 

728x90
반응형