안녕하세요! 피피아노입니다🎵
이번 포스팅에서는 팀 프로젝트를 진행할 때 역할을 나눠서 진행하게 되는데 각각 맡은 파트를 main 브랜치에 Merge(병합)하는 과정을 정리해보려고 합니다.
(최근에 Merge에 대해서 경험을 해봤는데 잊지 않게 정리해보려고요!)
그럼 바로 시작하겠습니다!
Merge하기까지의 흐름 요약
우선 팀 프로젝트에서 Merge하기까지의 과정을 간단하게 요약해보자면
브랜치 생성:
- 각 팀원은 자신이 담당한 기능에 대해 main(또는 develop) 브랜치에서 새로운 feature 브랜치를 생성합니다.
- 예: feature/login, feature/profile, feature/notification 등
저희 팀은 이런 식으로 branch를 구성했습니다!
(memo branch도 feature/memo로 했는데 팀원이 확인해볼게 있다고 해서 잠시 memo로 이름을 변경했습니다..!)
기능 개발
- 각자의 feature 브랜치에서 기능을 개발합니다.
- 정기적으로 커밋하고, 필요시 원격 저장소에 푸시합니다.
최신 main 브랜치와 동기화
- 개발 중 주기적으로 main 브랜치의 변경사항을 자신의 feature 브랜치로 가져옵니다.
- git pull origin main 후 git merge main 또는 git rebase main을 사용합니다.
풀 리퀘스트(PR) 생성
- 기능 개발이 완료되면, GitHub나 GitLab 등에서 풀 리퀘스트를 생성합니다.
- PR에는 변경사항에 대한 설명, 테스트 결과 등을 포함합니다.
코드 리뷰
- 다른 팀원들이 PR의 코드를 리뷰합니다.
- 필요한 경우 수정사항을 요청하고, 개발자는 이를 반영합니다.
테스트
- 자동화된 테스트를 실행하고, 필요시 수동 테스트도 진행합니다.
- CI/CD 파이프라인이 있다면 이를 활용합니다.
- (저희 프로젝트는 CI/CD를 활용하기에는 간단한 프로젝트라 해당 부분은 스킵했습니다. 수동 테스트만 진행했어요!)
병합(Merge)
- 코드 리뷰와 테스트가 모두 통과하면, PR을 main 브랜치로 병합합니다.
- 충돌이 있다면 해결 후 병합합니다.
정리
- 병합된 feature 브랜치를 삭제합니다.
- 로컬 환경을 정리하고 main 브랜치를 최신 상태로 업데이트합니다.
배포
- 정해진 주기나 조건에 따라 main 브랜치의 내용을 배포합니다.
반복
- 새로운 기능 개발을 위해 1번부터 다시 시작합니다.
이렇게 진행이 됩니다.
하지만 저희 팀은 한명이 Merge하는 방향으로 진행을 했습니다.
(팀원 모두가 깃허브에 익숙하다면 PR하는 방향으로 가는 게 제일 베스트지만 저희 팀은 아직 깃허브 경험이 많이 부족하고 프로젝트 마감 기한이 얼마 남지 않아서 한명이 Merge하게 되었습니다. 다음에는 PR로 해봐야지...)
Merge 준비
자 이제 본격적으로 각각 맡은 부분들이 개발이 다 완료가 되었다면 Merge를 하기 위해서 main 브랜치를 받아옵니다.
main 브랜치를 받았다면 해당 프로젝트 파일의 Xcode 최상단 폴더에서 Fider로 터미널을 열고, (터미널에서 cd 명령어로 이동해도 되지만 경로가 복잡하면 Finder에서 바로 여는 방법이 간단하고 쉽습니다.)
그리고 원격(깃허브)에 있는 브랜치를 local(내 컴퓨터)에 불러와야 합니다.
먼저 현재 작업 중인 모든 변경 사항을 스테이징하고 커밋하기 위해 아래 명령어를 작성해줍니다.
git add .
git commit -m "Save work before merge"
그리고 원격 저장소에 브랜치들이 맞게 있는지 아래 명령어로 확인을 해줍니다.
git branch -r
이 명령어는 원격 저장소에 있는 브랜치를 확인하는 명령어 입니다.
브랜치들이 다 맞게 있다면 터미널에 아래 명령어를 입력해줍니다.
git fetch --all
이 명령어는 원격 저장소에 있는 모든 브랜치를 local로 가져오는 fetch 명령어 입니다.
그리고 아래 명령어를 입력해서 각각 원격 브랜치를 기반으로 로컬 브랜치를 생성하고, 해당 브랜치로 전환하는 작업을 수행해줍니다.
git checkout -b feature/voiceRecord origin/feature/voiceRecord
git checkout -b feature/todoList origin/feature/todoList
git checkout -b feature/onBoard origin/feature/onBoard
git checkout -b feature/Timer origin/feature/Timer
git checkout -b memo origin/memo
자 이렇게 해주면 원격 저장소처럼 로컬에도 똑같이 브랜치가 생성이 되었습니다.
이제 다시 checkout 명령어로 main으로 돌아가줍니다.
git checkout main
Merge 시작
이제 본격적으로 Merge를 해줄겁니다.
만약에 feature/voiceRecord 라는 브랜치를 main 브랜치에 병합하려면
git merge feature/voiceRecord
이렇게 명령어를 입력해줍니다.
다른 브랜치들도 마찬가지로 merge 뒤에 브랜치 이름을 넣어서 병합해줍니다.
git merge feature/todoList
git merge feature/memo
git merge feature/Timer
자 이렇게 병합이 완료 되었습니다!
라고 하면 좋겠지만....
git merge feature/voiceRecord
merge: feature/voiceRecord - 병합할 수 있는 항목이 아닙니다
저희가 작업할 때는 충돌이 발생하더라고요...
충돌 발생 및 해결
충돌이 발생하게 되면 충돌을 해결하고 Merge를 진행해줘야 하기 때문에 충돌을 먼저 해결해줘야 합니다.
저희 팀에서 발생한 충돌은 .DS_Store 파일에서 충돌이 발생했는데 .DS_Store 파일은 macOS 운영체제에서 폴더의 아이콘 위치, 배경 이미지와 같은 디렉토리의 메타데이터를 저장하는 데 사용되는 숨김파일로 자동으로 생성되는 파일입니다.
근데 문제는 .DS_Store 파일은 소스 코드와 관련이 없기 때문에 Git 저장소에 포함될 필요가 없습니다. 실수로 .DS_Store 파일을 저장소에 추가하면 협업 중 불필요한 충돌을 일으킬 수 있는데 이 부분을 생각을 못하고 같이 저장소에 추가를 했더라고요..
그래서 계속 이런 에러가 발생했던 거였습니다.
이러한 문제를 해결하기 위해 gitignore이란 명령어를 사용했습니다.
먼저 아래 명령어로 충돌 상태 확인을 해주고
git status
아래 명령어를 사용해서 .gitignore 파일을 열어서
nano .gitignore
.DS_Store
를 작성해줬습니다.
이렇게 하면 .DS_Store 파일은 Git의 추적에서 제외되게 됩니다.
Merge 마무리
충돌이 해결되면 다시 병합을 진행해주고
병합이 완료가 되면 다시 원격 main 브랜치에 올려주기 위해서
git commit -m "각 브랜치 Merge 완료"
이런 식으로 커밋 메세지를 입력해서 커밋해주고 push 해줍니다.
git push origin main
이렇게 해주면 Merge 과정이 끝나게 됩니다!
감사합니다.
잘못된 내용이 있거나 더 좋은 내용 피드백은 언제나 환영합니다!
궁금하신 부분은 댓글로 질문 부탁드립니다!