▩ 목 차 ▩
1. 내가 선택한 Git 전략(Git Flow)
2. 내가 선택한 Git 전략(Git Flow) 사용 방법(feat. sourcetree)
3. Git을 통한 형상관리 및 협업을 할 때 햇갈렸던 개념
나는 country-explorer 프로젝트를 진행하면서 Git Branch를 사용하여 버전관리 및 PR 기능으로 멘토님께 코드리뷰를 받으면서 진행하기로 했다.
이번글은 내가 어떻게 Git을 이용하여 어떻게 진행하는지 구체적으로 설명해보겠다.
■ 1. 내가 선택한 Git 전략(Git Flow) ■
내가 사용할 Git 형상관리 전략은 Git-Flow이다. [ Git Branch 및 Git-Flow 전략에 대해 모른다면 참고해라 : https://bj-turtle.tistory.com/96?category=1077257 ]
Git Flow 전략의 브랜치에 대해 간략히 말하자면,
- Master : 배포 이력을 관리하기 위한 브랜치
- Hotfix : 제품을 배포한 후 발견된 버그 등을 수정하기 위해 임시로 사용하는 브랜치
- Release : 제품을 배포하기 위해 준비를 하는데에 사용하는 브랜치
- Develop : 개발이 완성된 기능(Feature)들을 병합하기 위한 브랜치
- Feature : 기능을 개발하기 위해 사용하는 브랜치(개발자가 각자 작업을 하는데에 사용, 완성 후 Develop 브랜치에 Merge)
나는 우선 혼자 진행을 하고, 간단한 프로젝트 이기 때문에 Master 브랜치, Feature 브랜치, Develop 브랜치 정도를 사용할 것 같다.
[ 만약 다른 사람들과 하는 대규모 프로젝트를 할 때에는 위에서 말한 Master,Hotfix,Release,Develop,Feature 브랜치 전부를 사용할 것이다. ]
■ 2. 내가 선택한 Git 전략(Git Flow) 사용 방법(feat. sourcetree) ■
[ 우선 나는 sourcetree라는 Git 형상관리 GUI 툴을 사용하며 진행하기 때문에 터미널(쉘)환경에서 사용하는 명령어를 사용하는 사람들은 참고 정도만 하면 좋겠다. 또한 sourcetree는 깔려 있다고 가정하고 진행하겠다.
그리고 안드로이드 스튜디오 프로젝트는 미리 있다고 가정한다.(다른 사람들은 다른 프로젝트를 미리 생성해두란 말이다.)
==> 왜냐하면 추후에 master 브랜치에 가장 기본만의 파일을 넣기 commit을 하기 위함이다. 왜냐하면 브랜치를 만들기 위해서는 최소 한번의 commit이 필요하기 때문에 마스터 브랜치에 안드로이드 스튜디오 프로젝트의 가장 기본 상태를 넣어 커밋을 해주기 위함이다. ]
1. sourcetree를 이용해 레포지토리를 로컬저장소에 복사하기
[ 나는 관리자(멘토님)가 직접 나를 기여자(Contribute)로 등록을 해주었기 때문에 Fork를 하지 않고 바로 Clone을 진행하였다.
또한 Git hub에 있는 레파지토리 저장소 url을 미리 복사해 두고 추후에 sourcetree에 입력해준다. ]
Fork : 레포지토리를 원격저장소에 복사
Clone : 레포지토리를 로컬저장소에 복사
2. master 브랜치로부터 분기 브랜치를 만들기 전 최소 한번의 commit이 필요하기 때문에 가장 기본의 프로젝트(안드로이드 스튜디오 프로젝트)를 넣어 커밋을 한다.
스테이지에 올라가지 않은 파일들을 스테이지에 올린다. 그 후에 커밋을 진행한다.
==> 왜냐하면 해당 파일의 영역이 "스테이지"영역에 있어야지만 커밋을 할 수 있기 때문이다.
3. master 브랜치를 베이스로 개발용 develop 브랜치를 생성한다.
[ 아무것도 건들지 않았다면 현재 브랜치는 master이다. 또한 모든 브랜치는 master 브랜치로부터 분기가 될 수 있다. 그러므로 master 브랜치를 통해 develop 브랜치를 생성한다.
devel 브랜치를 Github(원격 저장소)에 올리려면 push 하여 올리면 된다. push를 할때 username과 password를 쳐야하는데 나는 여기서 애를 먹었다. 정확히 말하자면 username에는 github의 닉네임을 쓰는게 아니라 이메일 아이디를 쓰는것이고 password에는 github로그인에 쓰이는 token을 적어주면 된다.(*토큰:git hub에서 2021년 8월부터 ID와 password를 이용해 로그인 하는게 아닌 ID와 토큰을 가지고 로그인을 함)
토큰에 설정에 대해 잘 모르겠다면, 이것을 참고해라 https://bj-turtle.tistory.com/34?category=1062417 ]
*Develop : 개발이 완성된 기능(Feature)들을 병합하기 위한 브랜치
4. develop 브랜치를 베이스로 feature 브랜치를 생성한다.
[ develop 브랜치를 기준으로 feature 브랜치를 딴다.
feature 브랜치를 Github(원격 저장소)에 올리려면 push 하여 올리면 된다. push를 할때 username과 password를 쳐야하는데 나는 여기서 애를 먹었다. 정확히 말하자면 username에는 github의 닉네임을 쓰는게 아니라 이메일 아이디를 쓰는것이고 password에는 github로그인에 쓰이는 token을 적어주면 된다.(*토큰:git hub에서 2021년 8월부터 ID와 password를 이용해 로그인 하는게 아닌 ID와 토큰을 가지고 로그인을 함)
토큰에 설정에 대해 잘 모르겠다면, 이것을 참고해라 https://bj-turtle.tistory.com/34?category=1062417 ]
5. feature 브랜치에서 기능을 완벽히 만들었으면 commit 및 push를 한다.
[ 작업 할 구체적인 기능이 있다면 feature 브랜치로 이동 후, 개발 작업을 한다. 개발 작업이 끝나면 commint 및 push를 한다. ]
내가 이 부분에서 많이 햇갈렸다. 내가 어떻게 안드로이드 스튜디오를 통해서 작업을 하는데 각 브랜치와 연동해서(github 저장소와 연동) feature 브랜치로 checkout 하여 feature 브랜치에서 작업을 할 수 있는가였다. 소스트리를 통해 clone해서 만든 폴더에 직접 넣는다고 한들 master 브랜치에 넣어지는 것이지 내가 원하는 feature브랜치에 들어가지 않기 때문이다.
==> 해결 방법은 이것이다. 안드로이드 스튜디오내에서 github 계정과 연동을 한 후 내가 작업하는 프로젝트와 연동하고 싶은 repository(저장소)를 연결하고, 안드로이드 스튜디오 내에 있는 브랜치 변경(checkout)기능을 하여 feature 브랜치로 가서 작업을 하면 되는것이였다.[ 안드로이드 스튜디오 내에서 브랜치 변경이 가능한 이유는 소스트리를 통해 미리 브랜치를 만들었기 때문에 로컬과 origin 둘 다 브랜치가 적용이 된 것이다. ]
추후에 feature 브랜치에서 작업한 내용이 있으면 소스트리에서 feature 브랜치의 파일 상태에 들어가게 되면 작업한 내용들이 올라와 있고 이것을 stage에 올릴 것인가 말 것인가를 요청한다.
[ 아래의 글은 안드로이드 스튜디오에서 git hub 계정 연동 및 repository(저장소) 연동을 자세히 설명해주시는 블로그님 참고해라 ]
https://velog.io/@kiyoog02/Android-Studio%EC%99%80-GitHub-%EC%97%B0%EB%8F%99
6. Pull Requset 송신
feature 브랜치에서 개발작업이 성공적으로 push 되었다면, GitHub에 들어가서 해당 Repository를 확인한다.
해당 Repository의 내부를 보면, 노란색 블록으로 feature 브랜치가 push되었다고 알려준다.
그 후, 오른쪽에 "Compare & pull request" 버튼을 눌러 "Open a pull request" 화면을 표시한다.
1. base를 develop 브랜치로 변경한다.
2. [Write] : 변경된 내용을 기입한다.
3. [Reviewers] : 톱니바퀴 버튼을 눌러, 리뷰를 받을 상대를 선택한다.
4. [Assignees] : 톱니바퀴 버튼을 눌러, 본인을 선택한다.
[ *필요하다면 다른 항목도 추가로 입력해준다. ]
위의 입력을 해줬다면, "Create pull request"버튼을 눌러 Pull Requset를 요청해준다.
[ *상황에 따라, "Create pull request"가 아닌, 화살표 버튼을 눌러 "Create draft pull request"를 우선적으로 사용하는 경우가 있다. ]
create pull request : 작업이 끝나고 코드리뷰 요청, 끝나고 병합(Merge)이 된다.
create draft pull request : 작업이 아직 안끝났지만, 코드리뷰를 요청할 때 쓴다. 그렇기 때문에 병합이 되진 않는다.
7. 승인 후 병합(Merge)
상대방으로부터 Pull Request의 승인을 받았다면, feature 브랜치에서 수정한 내용을 develop 브랜치에 병합한다.
위 화면에서, "Merge pull request"버튼을 눌러준다.
그 다음에 표시되는 하면에서 "Confirm merge" 버튼을 눌러 develop 브랜치에 병합한다.
병합이 완료되면, 필요가 없어진 feature_merge를 삭제해준다.
[ *경우에 따라, 수정 이력을 남기기 위해 feature 브랜치를 삭제하지 않고 남기는 경우도 있다. ]
■ 3. Git을 통한 형상관리 및 협업을 할 때 햇갈렸던 개념 ■
1. 나는 Contribute로 등록이 되어 있기 때문에 직접 바로 Clone을 진행하였다. 만약에 권한을 받지 않은 사람은 fork를 진행 후 Clone을
해야 할 것이다. 내가 여기서 무진장 햇갈린점은 fork는 왜 하고 안하고 였다. 이때 나는 Pull Request의 여부라고 생각했다.
즉, 나는 fork를 이용하여 clone을 했을때만 Pull Request가 가능한 줄 알았다. 당연히 아니였고, 직접 clone 및 fork 후 clone 둘 다 Pull Request가 가능한 것이였다. 이때 둘 다 Pull Requset의 목적이 다른데, 내가 이해한 것을 쉽게 말로 풀어보겠다.
- fork를 사용할때는 저장소에 대한 권한 승인을 받지 못해서 지나가던 사람이 '어? 이 사람 코드가 이상하네? 내가 권한은 없지만 말해줘야지 할 때 Pull Requset를 사용하는 것이다.
- fork를 사용하지 않을때 즉, 권한(Contribute로 등록)이 있을때는 내가 개발에 직접 참여한다. 예를 들어 feature 브랜치에서 내가 기능을 완성을 했을때 이것을 통합하는 develop 브랜치에 merge(병합)해야한다고 할때 팀원들의 의견을 물어봐야 하고 피드백을 주고 받으며 코드 리뷰를 해야할 때 Pull Requeset를 사용하는 것이다.
2. 나는 브랜치를 만들고 푸시를 한 상황(origin 원격 저장소에도 올라가 있는 상황)이다. 이때 나는 브랜치를 잘못 만들어서 삭제를 하고 싶은 상황이였다. 그래서 소스트리를 이용해 삭제를 하려고 했지만 삭제가 되지 않았다.
==> 해결 방안은 직접 터미널을 이용해 명령어를 입력해 브랜치를 삭제를 하는것이였다. 명령어를 이용하여 브랜치를 삭제하는데 2가지를 삭제해야했다. (로컬, 원격 저장소)
- 로컬 저장소의 브랜치 : git branch -d localBranchName(로컬의 브랜치 이름)
- 원격 저장소의 브랜치 : git push origin --delete remoteBranchName(원격 브랜치 이름)
소스트리를 이용해서 브랜치가 삭제가 안되는 경우는 명령어를 통해 삭제하면 마음이 후련하다..
'프로젝트 > country-explorer 프로젝트' 카테고리의 다른 글
Rest API을 통하여 Retrofit2을 사용해 특정 데이터 가져오기 미해결 (0) | 2023.02.03 |
---|---|
소스트리란 ?( git / git lab/ git hub에 관리되는 소스들을 쉽게 활용하기 위한 GUI 툴) (0) | 2022.10.21 |
Git Branch란 ? (0) | 2022.10.20 |
country-explorer 프로젝트 개요 (0) | 2022.10.19 |