상황
팀 Github : organization repository 사용
나 : 팀 Github에서 Fork를 따서 개인 repository에서 작업 후, 팀 Github으로 PR을 날림
팀원 : 팀 Github repository를 clone해 작업 후, 팀 Github으로 PR을 날림
상황 발생 원인 순서
요약
내가 {작업 branch}에서 작업한 내용을 {팀 develop branch}에 merge하고 해당 작업 branch에서 작업하고 있었음.
팀원이 내가 작업 중이던 파일의 패키지 경로를 변경해 같은 파일이 수정후 {팀 develop branch}에 merge
내가 {작업 branch}에서 작업한 내용을 마치고 {팀 develop branch}에 merge하려고 했음 -> 충돌 발생
1. 나의 {작업branch}에서 'a.java' 수정 ---PR merge---> {팀 develop branch}
2. 팀원 {작업branch}에서 'a.java' 수정 ---PR merge---> {팀 develop branch}
3. 나의 {작업branch}에서 'a.java' 수정 ---PR merge--->충돌<--- {팀 develop branch}
1. 내가 {작업 branch}에서 작업하고 팀 Github에 PR을 merge한 것이 {팀 develop branch}반영됨. -> 이후 {작업 branch}에서 계속 작업하고 있었음.
2. 팀원이 refactoring목적으로 파일의 패키지 경로를 변경뒤 PR을 merge해 {팀 develop branch}에 반영됨
[변경 전] domain>service>ProductService.java -> [변경 후] application>service>ProductService.java
3. 나는 작업을 완료하고 {작업 branch}의 변경사항을 PR을 날린뒤 {팀 develop branch}에 merge하려고 함.
-> 상황 발생
해결 방법
1. [view command line instructions] -> click
2. 'step1'에서 제시한 git 명령 차례대로 수행
git checkout -b {새로운 branch} develop
develop을 {새로운 branch}에 복사한 후, {새로운 branch}로 checkout
git pull {저장소 주소} {작업 branch}
{작업 branch} 최신 변경사항을 가져와서 현재 로컬 브랜치(앞서서 checkout을 했으니, 여기선 {새로운 branch} )에 merge하는 명령어
= {작업 branch} 최신 변경사항을 {새로운 branch}에 merge
3. 충돌 해결
오류 코드 수정
파일을 IDE로 열어서 패키지 경로를 수정하고, 없어진 파일을 복구.
-> 우리는 작업하던 파일의 패키지 경로를 옮겨서 생긴 충돌이었음.
-> 각자 충돌 원인에 맞게 해결하면 됩니다.
Server 실행 후 API 테스트
팀원이 QueryDsl 사용중 QEntity를 못 찾는 오류가 있었지만 merge해 테스트 API가 작동하지 않는 문제 해결
변경 사항 commit
이때 당시 내가 작업한 commit message
'bug: Git conflict'
4. 'step2'에서 제시한 git 명령 차례대로 수행
git checkout {작업 branch}
{작업 branch} : '충돌이 발생한 PR에서 출발 branch'로 이동
git merge --no-ff {새로운 branch}
{작업 branch} & {새로운 branch}, 두 브랜치를 병합(Merge)할 때 Fast-forward 병합을 방지하고,
병합 커밋(Merge Commit)을 강제로 생성하는 명령어
병합 커밋 내용을 작성하는 화면이 나오면 -> ':q'를 입력하고 빠져나오면 됨.
이때 당시 병합 커밋 내용
'Merge branch 'Hany-Kim-feat/trial-kafka' into feat/trial-kafka'
git push origin {작업 branch}
작업 branch에 변경사항 push -> 충돌이 발생한 PR을 확인하면 commit 후 merge한 내용 반영되어 있음.
회고
당시에 우리팀은 PR을 3명이상 승인해야 merge할 수 있는 Rule이 있었는데,
덕분에 review를 꼼꼼히 하다가 원인을 미리 인지하고 있을 수 있었다.
PR 리뷰당시 conflict가 나타날 것을 미리 인지하고 있어서 원인을 분석하는데 오랜 시간을 들이지 않을 수 있었다.
당시에는 web에서 수동 conflict정도만 수정하면 되겠지 했지만,
처음 command line에서 해결해야 하는 것에 당황스러웠다.
이것 저것 시도하면서 git commit 내용을 삭제해 원상복구를 반복하면서
git에서 제시한 해결방법 흐름을 파악할 수 있었다.
오늘도 성장했다!
- 유용하지만 조심해야할 git 명령
git reset --hard HEAD~1
# 가장 최근 커밋 1개 삭제
# git reset --hard HEAD~{삭제할 갯수}
# merge한 내역은 commit이 아니다. = 삭제할 갯수에 포함하면 안된다.
# 하나씩 조심히 주의하면서 지우자. 지우고 확인하고 반복하자
# 백업 branch를 하나 파두자
git push origin {반영할 branch} --force
# 삭제 후 반영
참고한 블로그
git conflict - command line으로 해결하기
다른 팀원이 공동 저장소에 올린 작업물을 내 저장소로 가져오려고 fetch를 했더니 충돌이 발생했다.
velog.io