Git 특강 - Pull requests&merge&rebase&fork
저번 특강에서는 로컬(내 컴퓨터)에서만 Git을 이용하여 commit들을 남기고 합치기를 진행하였다. 그런데 문제는 프로젝트를 진행하면 나만 하는게 아닌 팀원들과 함께 협업을 하면서 진행하는 것이기에 github에도 내가 만든 코드들을 업로드를 해주어야 한다
Pull requests
1. 아주 아주 천사적인 상황
- 해당 상황은 내가 기능을 개발을 끝나기전까지 아무도 branch를 생성하지 않고 오로지 난만 개발을 하고 내가 개발이 끝나면 다음 팀원이 branch를 생성하여 기능개발을 시작하는 릴레이 방식을 말한다(이렇게 되면 충돌은 발생하지 않음)
- 그러나 현실적인것을 떠나 아주 아주 비효율적이다.
- 왜냐하면 기능이 한두개면 상관없고 프로젝트 중요도 낮은 상태라면 문제가 없지만 그런 경우를 현업에서 만날 수 있을까?
2. 우리가 자주 경험할 현실적인 상황
- 우리가 자주 아니 당연히 만나는 상황은 어떤 시점을 기준으로 branch들이 생성이 되었고 나보다 먼저 기능 구현이 끝난 사람도 있을 수 있고, 아니면 나보다 늦게 끝난 사람들도 있을 수 있다.
- 이 상태일 때 먼저 작업이 끝난 사람은 간단히 본인 작업한 내용을 git push를 통하여 github repository를 올린 뒤 Pull requests를 생성하여 팀원or팀장에게 해당 코드를 컴토(코드리뷰) 받고 통과가 되면 해당 기능을 dev or main에 적용을 할 것이다(fast forward)
- 그럼 main or dev 브랜치는 해당 위치를 가르키고 있는 상태인데 이후 내가 만약 작업이 끝나고 git push 후 해당 부분을 Pull requests를 요청을 생성하려면 생성이 되지 않는다
- 이유는 당연히 내가 기억하고 있는 main or dev가 가르키고 있는(commit) 상태와 다르기 때문이다.
- 이럴때에는 먼저 내 코드에 main or dev의 내용을 merge를 하여 충돌을 해결 한 후에(push 까지 진행 완료)야만 Pull requests 요청을 할 수 있다.
- 즉, Pull requests가 안되면 main or dev의 상태가 변경된 상태이니 로컬쪽에서 충돌을 다 해결하고 add & commit & push 까지 진행하고 요청하면 된다
사실 설명만으로는 이해가 잘 안되었다. 작동 방식은 이해가 가지만 실전에는 바로 적용하기 힘들지 않을까라는 생각이 든다
특히, 로컬쪽에서 merge를 하여 충돌을 직접 격는건데 강의에서는 해당 branch 위치에서 merge를 하였는데 어떻게 pull 없이 main or dev의 최신 내용을 가져왔는지 잘 모르겠다....
이해가 안되어 검색을 활요하니
git pull origin main or dev를 이용하여 현재 내 브랜치에 main or dev의 최신 내용을 merge하는 부분이 확인 할 수 있었다...
즉 switch main or dev로 가서 pull을 하는게 아닌 원격저장소인 github에서 main or dev의 내용을 가져와 충돌을 해결하는 것이었다.
rebase
rebase는 내일배움캠프를 진행하는 동안 사용하지 않는다고 하는데 현업에서는 주로 사용한다고 설명을 하였다.
rebase는 현재 Branch의 분기 시작시점(Base)를 옮기는 것 으로 프로젝트가 진행하는 동안 수많은 브랜치가 생성되고 해당 브랜치에서 만들어지는 커밋들이 있는데 이것을 조금 이쁘게 꾸면 줄 때 사용하는 git의 기능이다
그런데 보기에는 편하지만 해당 부분으로 만들기 위해서는 시간 순에 맞게 commit 들의 내용도 옮겨주어야 하면 다양한 충돌들도 해결을 해주어야 하기에 캠프가 진행하는 동안에는 진행을 하지 않으나 따로 공부는 해놓을 필요가 있을거 같다
fork
fork는 오픈소스같은 다름 사람이 public으로 올려 둔 repository에 collaborators의 권한이 없는 상태에서 해당 코드의 오류 및 개선방안등을 찾아서 해당 repository의 주인에게 건의 할 때 사용하는 깃의 기능이다
fork를 사용하는 이유는 오픈소스같이 다양하고 수많은 사람들의 힘으로 만드는 경우 그 많은 사람들을 전부 등록을 할 수 없을 뿐더러 인증되지 않은 사람으로 인하여 보안이슈같은 사건이 벌어 질 수도 있기에 fork를 이용하여 해당 repository의 코드를 일단 본인의 것으로 만들고 이후 수정사항을을 적용한 후에 Pull requests를 원 주인에 건의 하는 방식으로 하여 필요하면 코드를 리뷰한 후 적용할 것이고 아니라면 거절을 할 수 있게 된다.
즉 좀 더 안전한 오픈소스가 되는 것이다