본문 바로가기
개념공부/Github | Gitlab

Gitlab Merge conflicts 해결방법 (+Merge locally만 보일 때 해결하는 방법)

by 29살아저씨 2022. 3. 18.
반응형

Gitlab을 사용하며 협업을 하게되면 꼼꼼하게 확인하고 merge 시키지만 어쩔 수 없이 충돌이 한번씩은 발생하게 된다ㅠ

Gitlab내에서 아래처럼 Resolve conflicts라도 나오면 충돌난 부분을 바로 확인하고 수정할 수 있는데, 만약 Merge locally만 뜬다면 저기에서 주어지는 코드만으로 local에서 충돌을 해결하기에는 어려움이 있었다. 이를 해결하기 위해 많은 자료를 찾던 중 깃랩 공식문서에 있는 방식대로 해결을 해서 이를 정리해두려고 한다.

 

충돌 해결 방법

Gitlab은 사용자 인터페이스에서 해결할 수 있는 방법과, local에서 명령어를 이용하여 해결할 수 있는 방법이 있다.

1. Resolve conflicts - Interactive mode를 사용하여 해결하기

- Gitlab 내에서 그나마 덜 복잡한 충돌을 해결할 수 있는 방법

1. merge request로 간다.

2. 충돌 난 merge request를 선택한 뒤 아래 화면에서 Resolve conflicts를 선택한다.

3. GilLab은 충돌난 파일들을 리스트로 보여주며, 충돌난 부분은 아래와 같이 하이라이트로 표시해준다.

4. 각각의 충돌에 대해 왼쪽 Use this 또는 오른쪽 Use this를 선택하여 충돌난 것 중 어느것을 사용할지 선택한다. 이처럼 선택하는 것을 '충돌해결과정' 이라고 한다.

5. 모든 충돌에 대해 선택한 후 커밋 메시지를 남기고

6. 소스 브랜치를 커밋한다.

 

2. Resolve conflicts - Editor Inline을 사용하여 해결하기

1. merge request로 간다.

2. 충돌 난 merge request를 선택한 뒤 아래 화면에서 Resolve conflicts를 선택한다.

3. Interactive mode 대신 Edit inline을 선택한다.

4. 충돌난 부분의 코드가 아래와 같이 >>> 이런식으로 되어 있을것이다. 이 중 내가 사용할 코드만 남겨주고 필요없는 코드는 지워준다.

5. 모든 충돌에 대해 4번 과정을 해준 후 커밋 메시지를 남기고

6. 소스 브랜치를 커밋한다.

 

3. Merge locally - Command line을 사용하여 해결하기

이 방법이 내가 에러를 해결한 방법이다.

대부분의 충돌은 1,2번 방법을 통해 해결할 수 있지만 일부는 너무 복잡할 수도 있다. 또는 나처럼 1,2번 방법을 사용 못할 수도 있다. 이럴때에 복잡한 충돌은 각 변경 사항을 최대한 제어할 수 있도록 Command line에서 local로 수정하는 것이 가장 좋다. 그럼 해결방법을 알아보자!

나는 feature/FE/UI -> develop 으로 merge 하는데 충돌이 발생했다. 이를 기반으로 해결을 작성해보겠다. 이 글을 보는 사람들은 개인의 feature브랜치 이름과 tagert브랜치 이름을 넣어서 실행해주면 된다. 

 

1. 먼저 코드 에디터에서 터미널을 열고(나는 vscode에서 터미널을 열어서 사용했다.) git checkout feature/FE/UI 를 하여 feature브랜치로 이동한다.

예시 : git checkout [feature브랜치 이름]

적용 : git checkout feature/FE/UI

2. git fetch를 한 후 target branch(여기서는 develop)에 대해 Rebase를 수행하여 충돌메시지를 볼 수 있도록 한다.

예시 : git fetch

        git rebase origin/[target브랜치]

적용 : git fetch

        git rebase origin/develop

3. 충돌난 블럭을 찾는다.

  • <<<<<<HEAD. 라고 시작하는 부분이 충돌이 시작된 부분이다.
  • 다음으로 feature브랜치에서 merge request한 변경사항을 보여주고
  • ======로 되어있는 부분은 merge request한 변경사항의 끝 부분이다.
  • 다음으로 현재 target 브랜치에서 충돌난 최신 변경사항을 보여주고
  • >>>>>>로 되어있는 부분이 충돌이 끝나는 부분이다.

4. 충돌난 블럭 수정

  1. 2가지의 변경사항 중 (======의 앞과 뒤) 내가 원하는 변경사항을 선택
  2. 내가 필요없는 변경사항은 지운다
  3. <<<HEAD. ==== >>>>도 마찬가지로 지운다.

5. 파일을 저장한다. Ctrl+s

6. 모든 충돌난 파일에 대해 3-5번의 과정을 반복한다.

7. Git에 변경사항을 stage한다.

git add .

8. 변경사항을 커밋한다. (커밋 메시지는 자유롭게 수정)

git commit -m "Fix merge conflicts"

9. rebase를 계속한다.

git rebase --continue

이 모든 과정이 feature브랜치에서 이루어진다.

10. feature 브랜치의 변경 사항을 강제로 push 한다.

git push --force origin my-feature-branch

공유 브랜치에서 작업할 때는 업데이트를 강제 실행 하지 않는 것이 좋다고 한다.. 하지만 나는 충돌을 수정하고 강제로 push했을 때 작업한 내용이 잘 반영되어 있었다.

 

11. 위 과정을 모두 수행하고 나서 다시 GitLab에서 merge request를 확인해봤을 때 아래처럼 Merge버튼이 활성화 되어있는 것을 볼 수 있다.

 

업데이트 강제 실행 과정이 걱정된다면 여기를 참고해서 문제를 해결하길 바란다.

 

 

++ 추가

rebase시 에러가 떠서 이전 브랜치로 돌아가고 싶다면 하단 링크 참고

git reset --hard ORIG_HEAD

https://backlog.com/git-tutorial/kr/stepup/stepup7_6.html

반응형

댓글