알고리즘 초급 스터디, 기업코테 스터디에서 github을 이용하여 코드를 커밋하고 코드리뷰하고 있다. 이 때 나는 스터디원들이 PR을 보낼 때, main 브랜치가 아닌 다른 브랜치를 생성시킨 후, 그 브랜치에서 PR을 보낼 것을 권장하고 있다.
브랜치를 확인해보면 main에서 바로 올리신 것 같아요.
이 경우에, squash and merge가 이루어진 후, 다음 주차 과제를 진행하기 위한 fetch 또는 rebase 과정 중에 충돌이 발생할 수 있을 것 같아요. week9와 같이 브랜치를 새로 생성해서 만드는 건 어떤가요?
물론 로컬 폴더 삭제 후, git clone을 하는 방법이라든지, 별도의 default branch를 생성해두었다면 위 충돌은 겪지 않을 것 같아서 더 좋다고 생각하는 방법으로 진행해주세요!한번 확인해주시고, 댓글이나 카톡으로 알려주세요 :)
그런데 왜 PR을 보낼 때, main에서 PR을 날리게 하지 않고 새로운 브랜치를 생성시켜 PR을 날리게 할 지 의문일 수 있다. 이번 포스팅에선 그 의문을 해결시키기 위해, 우리 스터디원들에게 보여주기 위해 작성해본다.
(참고로 혼자 진행하는 개인 repository의 PR에는 크게 상관 없는 얘기이다.)
commit 이력이 서로 다름
결론부터 말하자면 commit 이력이 달라지기 때문이다.
과제를 다 끝내서 스터디원의 main branch에서 PR을 보낸 후, 스터디장 레포의 main (kth990303:main)에 머지됐다고 해보자.
스터디장의 kth990303:main 브랜치에는 자신의 PR뿐만 아니라, 다른 스터디원들의 PR 이력까지 squash and merge 돼있음을 확인할 수 있다. 하지만 스터디원의 main 브랜치에는 자신이 commit한 이력들만 존재한다.
kth990303:main -> 스터디원1 merge 이력, 스터디원2 merge 이력, 스터디원3 머지 이력, ...
스터디원2:main -> 스터디원2 commit 이력1, 스터디원2 commit 이력2, ...
아예 history가 다르다. 스터디장의 main 브랜치가 변경될 때마다 실시간마다 git pull을 하지 않은 이상 history가 다를 수밖에 없다.
따라서 다음 주차 과제를 진행하려고 git fetch로 kth990303:main 브랜치의 폴더와 코드들을 가져오려고 하면 충돌이 발생한다. 커밋 이력이 다르기 때문이다.
참고로 git fetch로 저장소 코드를 가져오는 방법은 아래 글을 참고하자.
https://kth990303.tistory.com/260
따로 브랜치를 생성해준다면?
과제를 다 끝내서 스터디원의 hello branch에서 PR을 보낸 후, 스터디장 레포의 main (kth990303:main)에 머지됐다고 해보자.
스터디원:hello 브랜치는 history가 존재하지만, 스터디원:main 브랜치는 기존과 같이 별도의 history가 존재하지 않는다.
따라서 다음 주차가 되어 과제를 진행하기 위해 스터디장:main (kth990303:main) 브랜치를 fetch할 때, 커밋 이력이 발생하지 않는다.
다른 방법은 없을까?
있다. 원래 존재했던 .git 폴더를 삭제하거나, repository 관련 로컬 폴더를 아예 삭제한 후, 다시 git clone을 해주면 된다.
이 경우 kth990303:main의 최신 폴더/코드들을 clone할 수 있다. (단, 주의할 점은 remote의 origin이 스터디원의 repository가 아닌 스터디장(kth990303)의 repository가 됨에 주의하자. 별도로 git remote add를 해주어야 한다.)
별도의 그림이 없어 이해가 조금 힘들 수도 있다고 생각한다.
만약 이해가 너무 어려웠다면 이후에 PowerPoint로 그림을 그려서 이미지를 추가하는 방법도 생각 중이다~
결론부터 말하자면 여러 명이 함께 작업하는 프로젝트에서 PR 보낼 때엔 브랜치를 생성해서 보내주자!
'Infra > Git' 카테고리의 다른 글
[Github] 커밋, PR 공동 작업자로 세팅하기_ Co-authored-by (0) | 2022.07.18 |
---|---|
[Git] PR merge 조건을 Git Branch Protection Rule으로 적용해보자 (0) | 2022.05.06 |
[220216][Git] 왕초보 특강_ upstream과 remote, commit, fork, clone에 대하여 (0) | 2022.02.16 |
[220215][Git] 다른 저장소로 PR시, 충돌이 발생한다면? Git rebase와 cherry-pick을 이용해보자 (0) | 2022.02.16 |
[220210][Git] fetch, merge를 통한 상대 저장소 브랜치 커밋 이력을 내 저장소로 가져오기 (0) | 2022.02.10 |