[Git]Github으로 협업(clone, pr, merge, 충돌 해결)
1. 프로젝트 복제
참여할 프로젝트를 복사한다.
git clone ${원격 저장소 url}
// git clone <https://github.com/example/example.git>
git clone 명령어를 사용하면 자동으로 원격 저장소와 로컬 저장소가 연결된다.
이후에는 git pull 명령어로 원격 저장소의 최신 변경 사항을 가져올 수 있다.
fork vs clone
- Fork (포크):
- 포크는 다른 사람의 원격 저장소를 자신의 GitHub 계정으로 복사
- 포크한 프로젝트는 원본 프로젝트와 완전히 독립적으로 유지된다. 즉, 포크한 프로젝트의 변경 사항은 원본에 반영되지 않는다.
- 주로 오픈 소스 프로젝트에 기여하고자 할 때 사용된다. 포크한 프로젝트에서 변경 사항을 만들고, 이를 원본 프로젝트에 Pull Request를 보내어 기여할 수 있다.
- Clone (클론):
- 클론은 Git 저장소를 로컬 컴퓨터로 복사
- 주로 개발자가 자신의 로컬 환경에서 작업하고 싶을 때 사용된다. 클론한 프로젝트는 원격 저장소와 연결되어 있으며, 변경 사항을 원격 저장소에 푸시하여 공유할 수 있다.
- 포크와 달리, 클론한 프로젝트는 원본 저장소와의 관계가 유지된다. 따라서 원본 저장소의 변경 사항을 가져오거나 병합할 수 있다.
2. git branch
협업 시 주로 다음과 같은 형태로 브랜치를 생성한다.
효율적인 작업을 위한 브랜치 전략
✔️ main > dev > feat > 개발할 기능 별명
- main(또는 master) : 배포 이력을 관리하기 위한 브랜치
- dev(또는 develop) : 개발이 완성된 기능(feature)들을 병합하기 위한 브랜치
- feat(또는 feature) : 기능을 개발하기 위해 사용하는 브랜치(개발자가 각자 작업을 하는데에 사용)
2.1. 새 dev 브랜치 생성
git branch dev
2.2. dev 브랜치를 원격 저장소에 push
git push -u origin dev
2.3. dev 브랜치를 default 브랜치로 지정
2.4. feat 브랜치 생성
git branch feat/login
2.5. feat 브랜치로 이동
git switch feat/login
3. git fetch / pull
항상 작업 시작하기 전, push 전에 feat, pull을 진행하여 저장소를 최신 상태로 유지한다.
3.1. 원격 저장소에서 변경 사항이 있는지 확인
(fetch는 선택 사항)
git fetch
3.2. git pull 명령으로 리모트 저장소 브랜치에서 데이터를 가져올 뿐만 아니라 자동으로 로컬 브랜치와 Merge 시킬 수 있다.
git pull origin dev
개발 작업 진행 후,
git add .
git commit
git push origin ${작업 완료된 브랜치}
// git push origin fetch
github 페이지로 이동
4. Pull request & Merge
4.1. Pull request
4.2. dev 브랜치로 이동
git switch dev
4.3. feat 브랜치 삭제
기능 개발이 끝난 feat 브랜치를 삭제하면 저장소의 브랜치 목록이 깔끔해지고 관리가 더 쉬워진다.
git branch -d feat/login
5. 원격 저장소의 변경된 사항을 로컬 브랜치에 병합
git pull origin dev
6. 다시 2.4번 feat 브랜치 생성에서 시작
🤯 Git 머지 충돌 발생
A와 B가 각 각 login, logout 브랜치에서 작업을 진행한다.
login 브랜치에서 작업하는 A가 user_info 파일에서 새로운 작업을 한 후, 커밋을 진행하였다.
git add .
git commit -m "feat: user_info 파일 생성"
git push origin login
평소처럼 PR 후 merge까지 진행하였다.
그리고 B도 동시에 logout 브랜치에서 user_info 파일에 작업을 진행하고 있었다.
그리고 역시 커밋 후 머지를 진행했다.
그러자 머지 충돌이 발생하였다.
원격 저장소에 변경된 사항이 있는지 모르고
원격 저장소의 새로운 사항이 반영안 된 파일을 합치려고 했기 때문이다.
🙌🏻 해결하기
// dev 브랜치로 이동
git switch dev
// dev 브랜치로 원격 저장소의 최신 내용들을 가져온다.
git pull origin dev
git switch logout
// 업데이트된 dev 브랜치의 내용을 logout 브랜치에 병합한다.
git merge dev
그럼 logout 브랜치의 user_info 파일이 충돌된 부분을 보여준다.
충돌이 난 코드와 충돌 지점을 보여주는 기호들(<<<<<<<, =======, >>>>>>>)을 제거하고 다시 커밋을 진행한다.
그리고 다시 github 페이지로 돌아가보면 다시 merge를 진행할 수 있게 돌아와 있다.