엘리스 AI트랙 4기/프로젝트

[GitLab] merge locally 해결하기

남쪽마을밤송이 2022. 6. 27. 21:54

 [01 들어가기에 앞서 ] 

  • 엘리스에서는 git 협업을 위한 플랫폼으로 GitLab을 사용한다.
  • 1,2,3차 프로젝트 모두 GitLab을 사용했지만 항상 local에서 pull로 직접 conflict를 하나하나 해결하며 merge하거나, 충돌이 나지 않을만한 작업만 웹페이지에서 직접 Merge Request로 요청하고 merge 버튼을 눌렀었다.
  • 그런데 이번엔 그렇게 하지 못할 상황이 있었으니..!
  • 내가 작업한 back-webpush 브랜치는 front 코드 수정 부분도 포함되어 있어서 conflict가 날 것 같았는데 매주 코치님의 코드 리뷰를 위해 GitLab에서 직접 MR을 요청해야 했다.
  • 그리고 코치님께서 코드 리뷰를 잘 작성해주시고 merge를 하려고 보니 front분들이 먼저 dev로 merge하셔서 나의 MR은 conflict가 있다며 dev로의 merge 버튼이 비활성화되어 있었다.
  • 이 때 아래처럼 Resolve conflicts 버튼이 있다면 GitLab GUI로 해결 가능한데 VSC 환경보다 불편하기도 하고 conflicts가 많은 경우는 Merge locally 버튼만 있는 것 같았다.

  • 따라서 이번엔 Merge locally로 conflict를 해결하고 작성하는 포스팅이다.

 

 [02 Merge locally ] 

  • 먼저 위의 상황에서 Merge locally 버튼을 누르면 다음과 같이 안내해준다.

 (1) Fetch and check out the branch for this merge request 

  • 나는 아무것도 모르기 때문에(?) 일단 시키는대로 해보기로 했다.
    • 그런데 두 번째 명령어를 치자 다음과 같이 "back-webpush" 브랜치가 이미 존재한다는 에러 메세지가 떴다.
    • 당연하지, 내가 지금까지 써온 브랜치인걸? 하며 구글링을 해보니 merge용 브랜치를 따로 만들어서 진행하는게 좋다는 글을 봤다. (참고)
git fetch origin
git checkout -b "back-webpush" "origin/back-webpush"

  • 따라서 바로 브랜치명을 바꿔 다음과 같이 입력했다.
git checkout -b "back-webpush-merge" "origin/back-webpush"

 (2) Review the changes locally 

  • 나는 코치님의 코드 리뷰를 GUI를 통해 받았지만, 순서에 따르면 이 단계에서 local로도 코드 리뷰를 할 수 있나보다. 알아두고 나중에 써먹어봐야겠다.

 (3) Merge the branch and fix that any conflicts come up 

  • 그리고 다음으로 안내해 준 명령어 3가지를 실행했다.
git fetch origin
git checkout "dev"

git merge --no-ff "back-webpush-merge"

  • 그리고 이제 다음 명령어는 "충돌을 해결하고" 다시 dev에 push하는 것인데 문제는 conflict가 하나도 없이 말끔히 들어가버렸다?! GitLab에서는 분명 충돌이 있으니 local에서 해결하라고 했는데...!
  • 이게 무슨일인가 싶어 급하게 front분을 불렀다. 그리고 확인해보니 front가 최신 코드가 아니란다.
  • 어쩐지 소스 제어 탭에 dev에서 pull 해올게 70개쯤 있다고 알려주더라. 그제서야 의미를 깨닫고 dev 브랜치에서 git pull 명령어를 실행했다.
    • 그랬더니 와다다다 들어오면서 conflict가 세 군데에서 발생했다! conflict가 반가울줄이야
git pull // conflict가 발생하지 않았을 경우

  • 내가 수정한 front쪽 파일이 맞아서 아 뭔가 잘되고 있구나 하며 conflict를 해결했다.

 (4) Push the result of the merge to GitLab 

  • 그리고 떨리는 마음으로 156개의 commit을 push했더니..!
git push origin "dev"
  • 웹훅으로 연결해 둔 깃랩에서 다음과 같은 메시지가 왔고 GitLab MR 페이지에서도 merge가 잘 완료된 것을 확인했다.

 

 [03 명령어 의미 ] 

  • 일단 해결하고 명령어를 알아보는 게 웃기지만 포스팅 하는 김에 이제라도 알고 넘어가자.
    • 사실 저기에 무슨 commit 식별 번호처럼 MR 번호를 사용한 것도 아닌데 저 MR인줄 알고 닫힌게 신기했다.

  • git fetch origin : origin이라는 remote 저장소의 데이터로 로컬 저장소 내용을 업데이트 -> 나는 이걸 dev 브랜치에서 했어야 했는데 back-webpush 브랜치에서 실행했다.
  • git checkout -b "new branch name" "source branch" : 새로운 브랜치를 생성하고 그 브랜치로 체크아웃 (참고) -> 따라서 이미 존재하는 branch라는 오류가 난 것
  • git merge --no--ff :  ff는 fast-forward의 약자이고 --no--ff 옵션을 사용하면 fast-foward 관계인 경우에도 반드시 병합 커밋을 만듦(merge commit과 이력을 반드시 남기는 것) (참고)

 

  • 그런데 이상한 점은, 지금은 내가 만든 back-webpush-merge 브랜치가 보이지 않는다. 따라서 --no--ff 옵션과 함께 merge를 하면 병합된 branch는 삭제되나 했는데 그것도 아닌 것 같다. 그럼 back-webpush-merge는 어디간거야?
  • 이번 기회에 git과 한 발자국 가까워졌다고 생각했는데.. 글쎄....🤔

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