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. 충돌난 블럭 수정
- 2가지의 변경사항 중 (======의 앞과 뒤) 내가 원하는 변경사항을 선택
- 내가 필요없는 변경사항은 지운다
- <<<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
'개념공부 > Github | Gitlab' 카테고리의 다른 글
Git 디렉토리 올리는 법, Git 디렉토리 안에 파일 올리는 법(vscode 이용) (0) | 2021.12.21 |
---|---|
[Github / Gitlab] 이클립스와 git 연동하기 (0) | 2021.11.03 |
댓글