Github 관련

[yongggg's] GitLab: Merge blocked: fast-forward merge is not possible. To merge this request, first rebase locally.

Yonggg 2022. 5. 19. 09:19

안녕하세요 이번에는 회사에서 팀원 분들과 gitlab으로 함께 Cowork할 때, 생긴 오류에 대해서 다뤄보겠습니다.

이 문제는 각 팀원들이 각각 branch를 생성하고, 같은 main branch를 git clone 한 뒤, 각자 작업한 코드 들을 merge request할 때, 다른 사람의 수정 내역이 내 코드에 반영되지 않아서 생긴 문제였습니다. 이 논리에 의하면, 처음 사람의 수정 내용이 반영된 코드를 다음 사람이 git clone 하고 다시 수정하고 그 것을 merge해야 합니다. (하지만! Git이 그렇게 멍청할리 없다고 생각하여 여러 blog를 찾아보고 정리했습니다.)

1. Work steps

필자의 경우, gitlab 협업은 본인의 device에서 다음의 단계로 작업했다.

  1. git clone
  2. git checkout 본인 브랜치명 (여기서 바로 만들 경우, git checkout -b 본인 브랜치명)
  3. 코드 수정
  4. 수정된 파일들 git add (git status로 올릴 파일들 확인)
  5. git commit -m "commit message (대체로 반영 내용 적기)"
  6. git push origin 본인 브랜치명

git push origin 본인 브랜치명으로 (origin 이라는 것이 명령어에 붙으면 원격 repository에서 작업됨.) 원격 repository의 본인 브랜치에 수정된 코드 파일과 해당 commit을 반영할 수 있다.

그리고 본인의 gitlab url에서 본인 branch를 클릭하여 들어가면, 다음과 같이 해당 사항이 반영된 commit과 내가 올린 수정된 파일을 호확인할 수 있다.

 

[그림 1] git push origin 본인 브랜치 명령 후, 원격 repository 본인 브랜치

 

그리고 왼쪽 편에 Merge requests 라는 곳에서 본인 브랜치의 반영 내역을 다른 branch에 merge requests 할 수 있다.

 

[그림 2] merge requests

 

여기서 승인을 받을 사람들을 고를 수 있으며, 승인자(검토자)와 타겟 브랜치를 적절히 선택한 뒤, merge 요청을 할 수 있다.

 

승인을 모두 받았을 때, [그림 2]의 merge requests를 다시 클릭하고 들어가면, 아래와 같이 merge 버튼이 활성화 되는 것을 확인할 수 있다. (나 또는 승인자들이 merge하면 문제가 없음)

 

[그림 3] merge button

2. Error Message

이 때, 처음 소개 글에 문제를 언급했듯이 각자 작업한 코드 들을 merge requests할 때, 다른 사람의 수정 내역이 내 코드에 반영되지 않으면, 승인을 받더라도 다음의 merge conflicts 오류를 접할 수 있다. 

최근에 반영된 코드들을 다시 git clone 해서 최신 상태의 코드에 다시 수정하면 좋겠지만, 병렬적으로 함께 일을 할 경우에 내가 시간과 공을 들여 수정한 코드들을 다시 작성하는 것은 너무 치명적이다.

 

[그림 4] merge conflicts error message

3. Solution

다음과 같은 step을 통해 이 문제를 해결할 수 있다.

먼저, 내 작업환경에 들어온다.

cd myworkspace

이후에, 최신 변경 사항이 담긴 branch에 접근한 뒤, 이를 반영한다.

git checkout '내가 따올 branch'
git pull origin '내가 따올 branch'

 

다음 단계로 다시 내가 작업한 branch로 이동하여 최신 코드가 반영된 branch를 바탕으로 rebase 한다.

git checkout '본인 브랜치명'
git rebase '내가 따올 브랜치'

이 때, 필자는 Vscode를 사용하기 때문에 왼쪽 메뉴바의 소스제어를 클릭하면, 최신 코드에 merge된 사항들(다른 사람들이 수정한 사항들이 merge된 내역)을 가져오며, 내 코드에 반영되는 것을 확인할 수 있다. (나는 이미 문제를 해결했고, 블로그 때문에 다시 pull request를 요청할 수 없어서 참고한 블로그의 그림을 가져왔다.)

https://medium.com/devops-with-valentine/gitlab-merge-blocked-fast-forward-merge-is-not-possible-7f86bf79e58b

[그림 5] adjusted and highlighted contents on my file

 

[그림 4]와 비슷하게 변경된 사항들은 'Changes'에, merge되어 반영되어 수정된 사항은 'Merge Changes'에 기록이 남는 것을 확인할 수 있었다. 

 

이제 여기에서 내 원격 repository branch에 push할 파일들을 추가한다.

git add * (모든 파일)
# git add *.py(py 파일)

이 단계에서도 우리는 계속 rebase 중이기 때문에 다음 명령을 실행한다.

git rebase --continue

이제 다시 원격 저장소에 push를 하면 된다. 이 때, git push origin 본인 브랜치명으로 push를 진행하면, 다음과 같은 에러가 나온다.

! [rejected] feature/changeTemplate -> feature/changeTemplate (non-fast-forward)
error: failed to push some refs to ‘git@gitlab.com:some-group/my-project.git’
Updates were rejected because the tip of your current branch is behind its remote counterpart. Integrate the remote changes (e.g.
‘git pull …’) before pushing again.
See the ‘Note about fast-forwards’ in ‘git push — help’ for details.

git 기록을 다시 작성하면, 더 이상 이전 브랜치로 push할 수 없기 때문에, --force 플래그를 통해 브랜치를 완전히 재정의 해야한다.

git push origin 본인 브랜치명 --force

이 명령어까지 실행한뒤, 다시 gitlab 원격 저장소에 접속하면,  [그림 2]와 같은 버튼을 볼 수 있을 것이다.

검토자 분들이 미리 승인을 했던 경우는 본인이 merge 버튼을 눌러서 반영하면 된다.

 

 

입사 2개월 차가 되면서 정말 배울 것이 많다고 느꼈습니다. 여러분들도 협업시 이런 문제가 발생한다면 많은 도움이 되었으면 좋겠습니다. 감사합니다! ^^