포크 한 리포지토리로 풀리퀘를 보내는걸 처음에 잠깐 헤매어서 이게 맞는 방법인지는 모르겠지만
내가 사용하고 있는 방법을 써보기로 했다. (나중에 까먹을 나를 위해서)
세팅해야 하는 상황
팀프젝을 개인 리파짓 토리로 포크 했다.
개인 리포지토리(repository)로 포크(fork) 하는 방법은?
copy the main branch only를 클릭하면 main만 카피된다. 다른 브랜치까지 카피하고 싶다면 체크하지 말아야 한다.
위와 같이 개인 repository가 생성된다.
해야 할 일은 개인 리포지 토리로 푸시 후에 팀 리파짓으로 풀리퀘를 보내야 해야 한다.
추가로 우리 팀은 develop 브랜치에서 따서 개발을 진행하기로 하였다.
처음 도전
개인 repository로 작업 후에 github 사이트에서 push 하기
이 방법은 단순 깃허브 사용방법과 동일하게 나의 개인 리포지토리에 올린 후에 직접 풀리퀘스트를 보내는 방법이다.
해당 방법을 사용했을 때의 단점은 원격 브랜치로부터 pull을 받기가 너무 힘들다.
즉 실제 내가 싱크를 맞춰야 하는 원본 repository와 버전을 맞추기가 업려다. 직접 들어가서 sync를 맞춰야 하기 때문이다.
두 번째 도전(지금 사용하는 방법)
팀원분의 도움으로 다른 방법을 적용해 보았다.
나는 브랜치 관리를 인텔리제이 내의 도구로 하고 있어 해당 방법을 사용하여 예시를 들지만
소스 트리와 깃 크라켄 같은 도구를 사용해도 된다. (팀원분이 사용하는 것을 보니 거의 유사했다. remote설정을 잘해주면 된다)
아래의 내용을 모두 요약하면
나 같은 경우는 origin은 실제 팀 리파짓토리의 것을 root에는 나의 개인 리파짓 토리를 원격으로 지정해 두었다.
이후에 푸시를 하는 경우 root로 푸시한다.
push후에는 깃 허브에 들어가서 팀 리포지토리에 풀리퀘를 생성한다. (푸시할 브랜치 설정을 해주어야 한다. - develop으로 하는 경우 주의)
pull을 하는 경우에는 origin의 develop/main 브랜치를 checkout 하여 풀 받는 형식으로 작업한다.
intelli J에서 원격 세팅하는 법
Git-> Manage Remotes
다음과 같이 저장하고자 하는 원격 저장소를 세팅한다.
나의 경우 개인 리파짓을 root로 팀의 리파짓을 origin으로 끌어왔다.
이렇게 하면 원격 저장소 세팅은 완료했다.
팀 저장소 pull 받기
만약 팀 저장소에 있는 것을 받아와야 하는 경우라면
1. fetch를 받아 pull 받을 것이 있는지 확인하기
fetch all remotes를 클릭하면 모든 원격 저장소에 있는 최신변경 사항을 가지고 온다.
클릭 후에 현재 develop브랜치에 pull 받아야 할 것이 있음을 알려준다.
이후에 아래와 같이 pull을 받는다.
2. pull 받기
checkout 후에 pull을 받으면 실제 팀의 develop브랜치와 버전을 맞출 수 있다.
그냥 바로 pull만 받아도 되는 것 같다.
(git pull = git fetch + git merge)
만약 현재 다른 브랜치에서 작업하고 있는데 develop에서 pull 받아와야 하는 경우
이런 경우 현재까지 작업한 상황을 git stash 하는 방법과 commit을 먼저 하고 다른 브랜치로 움직이는 것이 안전하다.
만약 현재 수정한 브랜치를 그냥 들고 develop로 이동하는 경우 conflict가 나면 git smart checkout과 같은 도움을 주는 경우도 있지만 날아갈 수도 있다. 가능하다면 git stash를 이용하거나 커밋을 해두고 이동하자. (귀찮아하고 그냥 이동하는 사람 중 한 명이긴 하다..)
1. fetch all remots를 한 결과 pull 받을 것이 있음을 알 수 있다.
2. develop(origin) 브랜치로 체크아웃한 후에 pull을 받는다.
여기에는 두 가지 방법이 있다.
1 ) git rebase
2 ) git merge
-- 추후에 글 작성 할 예정 git rebase와 git merge --
나는 개인적으로 git rebase를 하는 것을 선호하는데 git merge시에는 merge 커밋이 남지만 rebase는 커밋이 남지 않고 깃이 하나처럼 합쳐져서 깃의 그래프가 단순해진다(선형적으로 유지된다, 그리고 커밋 히스토리가 깔끔하게 유지된다). 하지만 git rebase를 사용하는 경우에 충돌이 발생한 각 커밋에 대해 컨플릭트를 수정해줘야 한다는 단점이 있다.
rebase를 사용하는 예시
3. 기존의 브랜치로 돌아온다.
4. develop브랜치로부터 rebase를 받는다.
6. 컨플릭트가 없는 경우 rebase 잘 됐음 을 확인할 수 있다.
rebase시에 충돌이 발생한 경우
1. 현재 나의 커밋이 있는 상태에서 rebase 시도
2. confilct 발생이 났다고 알려주고 solve를 클리한후에 나의 코드 추가와 다른 사람의 코드를 추가해 주면 된다.(같은 로직을 수정한 경우에는 팀원에게 확인하기)
3. rebase가 잘 된 것을 확인할 수 있다.
아니면 당장 풀 받아 작업해야 하는 아니라면 그냥 pull request후에 컨플릭트가 발생했다면 깃허브에서 수정하는 방법도 있다.
현재 작업한 것을 내가 포크 한 나의 리포지토리에 푸시하는 법
나의 리파짓 토리에서 원격으로 풀리퀘스트 보내는 법
푸시를 클릭한후에 remote를 root(나의 개인 리파짓 토리)로 설정한 후에 푸시한다.
push를 하면 위에 깃허브 화면처럼 확인할 수 있고 pull reqeust를 생성하면 된다.
참고로 인텔리제이에서도 풀리퀘스트를 생성할 수 있지만 나는 깃허브 UI가 편해서 깃허브에서 작성해서 올린다.
+) 앞에서 origin에서 브랜치로 머지하고 개인 리파짓 토리에 푸시하려 하는 경우 내가 한 커밋이 아닌 팀워의 커밋이 엄청 따라 올라간다. 근데 어차피 팀 리파짓에 올릴 때는 문제없다. 내가 수정한 커밋부터 풀리퀘에 변경 커밋사항으로 올라가서 신경 쓰지 않아도 된다.
나 같은 경우는 매번 싱크를 맞추지 않고 나의 포크 깃 허브를 잠시 걸처가는 용도로 사용해서 이렇게 된다.
어차피 이렇게 푸시하고 풀리퀘를 작성하면 내가 작성한 커밋만 올라간다.
이런 게 싫다면? -> 패치받고 나의 리파짓토리 develop브랜치로 이동후 푸시 or 깃허브 들어가서 sync fork 한다.
이후에 나의 root develop브랜치에서 새로운 브랜치를 만들어서 작업하면 된다.
다 귀찮아 ~ 나는 그냥 포크 한 리파짓 토리 안 거치고 바로 원격으로 푸시하겠다고 생각하면?
현재 작업한 것을 remote설정 시에 origin으로 설정하고 push 하면 원래 리포지토리에 브랜치가 생성되는 것을 확인할 수 있고 거기서 풀리퀘스트를 생성하면 된다.
+ ) 우리 팀을 git flow 전략을 사용 중이어서 develop 브랜치에서 브랜치를 따서 작업하는데 갠 리파짓과 싱크 맞추기가 어려웠다. 그래서 나는 개인 리파짓토리의 메인 브랜치를 develop로 설정하여 사용하고 있다.
댓글