Git, Github 시작하기-3
간단하게 혼자서 github에 업드하는 방법과 브랜치를 만들어서 나누어지고 다시 합치는 과정에 대해서 살펴보았습니다.
이번에는 fork와 pull request를 알아보겠습니다.
fork는 원격저장소를 자신의 저장소에 똑같이 가져온 다음에 변경된 사항을 원본 원격저장소에 보내는 것입니다.
오픈소스를 위해서 누군가 만들어 놓은 코드를 가져와서 기능을 추가하거나 개선해서 원작자에게 제안하기 위해 만들어진 기능입니다. pull request를 보내서 원작자가 받아드리면 그 프로그램의 기여자 attributer가 될 수 있습니다.
github블로그 만들어 보신 분은 아시겠지만 다른사람은 원격 repo를 자신의 것으로 바꿔서 새로 만들 수도 있고 협업을 하는 과정에서 오류가 생길 것을 방지하여 자신의 것에서 한번 해보고 팀 repo에 합칠 수 있습니다. 이렇게 "합쳐주세요~" 하는 기능이 pull request입니다. pull을 요청하는 것이죠.
branch로 하면 되는 것이 아닌가 생각할 수 있을텐데 차이점이 정리된 것을 보겠습니다.
포크를 하면 자유롭게 편집하고 사고를 쳐도 큰 문제가 되지 않는 점 때문에 git에 능숙하지 않는 분들과 같이 프로젝트를 하면 큰 프로젝트가 아니여도 포크를 사용하는게 좋습니다.
이것으로 실습을 준비할 것이고요. 활동 중에 project를 진행할 때 pnp organization에 repo를 만들어서 진행해봅시다. 그럼 시작하겠습니다.
먼저 여태 진행하던 gitTraining repo를 자신의 repo로 가져옵니다. github에서 우측 상단에 fork라고 있죠 그것을 누르고 자신의 계정을 선택합니다.
그럼 이렇게 hufs-pnp계정이 아닌 SeongilHeo의 계정에 repo가 생깁니다. 이것을 자신의 로컬에 가져와서 작업을 할 것입니다. git clone을 하기 위해서 녹색 code버튼에서 link를 복사하세요.
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining
$ git clone https://github.com/SeongilHeo/gitTraining.git .
Cloning into '.'...
remote: Enumerating objects: 38, done.
remote: Counting objects: 100% (38/38), done.
remote: Compressing objects: 100% (24/24), done.
remote: Total 38 (delta 19), reused 21 (delta 9), pack-reused 0
Receiving objects: 100% (38/38), 4.71 KiB | 602.00 KiB/s, done.
Resolving deltas: 100% (19/19), done.
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (main)
git clone할 때 뒤에 경로를 적으면 해당 경로에 clone되고 아무것도 안적으면 현재 자신의 위치에 remote repo이름의 폴더를 만들어서 그 안에 clone됩니다. 저는 뒤에 . 를 붙여서 현재 위치에 파일을 가져온 것입니다. (이부분은 상대경로 절대경로의 개념이니 궁금하신 분은 추가로 질문하시기 바랍니다.)
똑같이 파일이 생겼습니다. 이제 remote를 확인해보면 origin으로 원본 remote repo가 아닌 자신의 계정으로 fork한 remote repo가 연결되어 있습니다.
보통 자신의 repo를 origin이라고 하고 원본을 upstream이라고 해서 두개를 다 연결해줍니다.
upstream 이름으로 원본 remote repo도 추가해주어서 업데이트 되는 상황을 파악하면서 진행해봅시다. git remote -v로 현재 연결되어 있는 remote를 확인할 수 있습니다.
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (main)
$ git remote add upstream https://github.com/hufs-pnp/gitTraining.git
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (main)
$ git remote -v
origin https://github.com/SeongilHeo/gitTraining.git (fetch)
origin https://github.com/SeongilHeo/gitTraining.git (push)
upstream https://github.com/hufs-pnp/gitTraining.git (fetch)
upstream https://github.com/hufs-pnp/gitTraining.git (push)
자 이제 연결을 했으니 원본의 상태도 확인해보겠습니다. 아래 그래프를 보면 fetch하기 전에는 upstream이 없었는데 생겼을 겁니다.
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (main)
$ git fetch upstream
From https://github.com/hufs-pnp/gitTraining
* [new branch] feature/goal -> upstream/feature/goal
* [new branch] main -> upstream/main
fetch가 무엇인지 설명하자면, 우리 이전에 remote repo의 내용을 가져오기 위해서 pull을 했습니다. 그래서 자동으로 우리의 현재 코드가 remote repo와 같아지게 되었죠. 사실 pull은 (fetch+merge)입니다.
fetch는 가져오기만 하는 겁니다. 일종의 새로고침 같은 역할이죠. vscode나 sourcetree, github gui같은 외부 툴을 사용하면 자동 fetch기능이 있습니다. 그래서 fetch를 하지 않아도 정해진 주기에 따라서 자동으로 fetch를 해서 remote repo의 상태를 확인하고 내가 저기에 merge하기 위해서 해야될 작업들을 생각하게 됩니다. 그래서 commit message를 잘 써줘야 다른 사람들이 볼 때 자신의 해야될 행동을 생갈 할 수 있습니다.
이제 또 다시 이전에 하던 것 처럼 branch만들어서 작업하고 자신의 remote repo에 올리고 팀원들이 다 같이 사용하는 원본 repo에 내용을 수정해보겠습니다.
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (main)
$ git branch featrue/activity
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (main)
$ git checkout featrue/activity
Switched to branch 'featrue/activity'
새롭게 파일 만들어서 내용 적당히 추가했습니다. 이제 커밋 만들고 main에 merge해서 자신의 repo로 push 해보겠습니다.
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (featrue/activity)
$ git add activity-page.txt
fatal: pathspec 'activity-page.txtt' did not match any files
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (featrue/activity)
$ git add activity-page.txt
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (featrue/activity)
$ git commit -m "activity 페이지 추가"
[featrue/activity 3ad4c36] activity 페이지 추가
1 file changed, 5 insertions(+)
create mode 100644 activity-page.txt
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (featrue/activity)
$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (main)
$ git merge featrue/activity
Updating aa3cb1d..3ad4c36
Fast-forward
activity-page.txt | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 activity-page.txt
tjddl@5I1SE1O-H16 MINGW64 ~/Workspace/gitTraining (main)
$ git push origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 339 bytes | 84.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/SeongilHeo/gitTraining.git
aa3cb1d..3ad4c36 main -> main
graph가 이해되시나요?
왼쪽이 push하기 이전 오른쪽이 push한 후 입니다.
왼쪽 먼저 보면 내 로컬의 main과 origin remote의 main이 분리되어 있죠? 그리고 origin/HEAD로 origin remote에서 가리키고 있는 상태가 이전 상태이고 로컬의 main은 feature와 병합되어 한단계 앞서 있습니다. 그리고 upstream도 현재 main보다 뒤에 있습니다.
오른쪽을 보면 push를 해줘서 나의 원격지 repo, origin이 upstream보다 한단계 앞서 있습니다. 이렇게 다른 브랜치 없이 한단계 앞서 있으면 upstream으로 pull request를 보내주면 됩니다.
pull request는 github에서 gui로 보내겠습니다.
github으로 이동해서 code옆에 pull request가 보일 것입니다. 여기서 new pull request를 만듭니다.
그럼 base repository의 어떤 브랜치로 갈 것인가 선택해야됩니다. 자동적으로 내가 포크한 곳이 base repo에 나옵니다. (참고로 여기서 자신의 repo안에서 branch들 사이에서도 pull request를 보낼 수 있습니다. ) 내용 확인하고 create pull request를 누르면 아래처럼 메시지를 입력하는 것이 나옵니다.
pull request요청은 우리끼리 작은 팀에서 한다면 commit 메시지 처럼 보내면 되지만 대형 프로젝트에 기여자로서 pull request로 보낸다면 원본 repo에서 정해놓은 규칙에 맞게 보내주어야합니다. 안그러면 받아주지 않습니다. 아래 사진을 보면 어떻게 확인해야되는지 알 수 있습니다.
다시 자세히 보면 여러가지 선택하고 입력해야 될 것이 많죠? 너무 많아서 이것은 책의 자료를 가져오겠습니다.
이렇게 다양한 내용들을 정해진 규칙에 따라서 원본 repo에 내용을 입력해서 보내줍니다.
그럼 이렇게 hufs-pnp계정에서 보면 activity 페이지 추가라는 pull request가 와있는 것을 확인할 수 있습니다. 이제 여기서 해당 repo의 owner가 받을것인지 말것인지 여기에 참여자들이 확인해서 코드 리뷰를 줄 수도 있고 branch를 새로 만들어서 넣을 수도 있습니다.
cofirm하고 merge하는 기능은 해당 repo에서 승인한 사람만 할 수 있으니 merge가 있어야 되는데 없다면 관리자에게 문의하세요
그래서 cofirm하고 merge하면 아래처럼 merged를 확인할 수 있습니다.
vscode에서 graph를 확인해보면 mrege 된 것을 확인할 수 있습니다. (없다면 fetch를 해보세요)
제가 여태 설명해드린 것을 다 이해했다면 어디가서 팀프로젝트할 때 "git쓰실 수 있죠?"
하면 뭐 조금은 압니다 라고 말하면서 프로젝트 진행할 수 있을거예요!
이젠 다음으로 실습 어떻게 할 것인지 설명하고 추가로 reset, cherry-pick, rebaes등등.. 기능 살펴볼게요!
'PnP > Git' 카테고리의 다른 글
Git, Github 시작하기-5 (0) | 2022.03.30 |
---|---|
Git, Github 시작하기-4 (1) | 2021.10.28 |
Git, GitHub 시작하기-2 (0) | 2021.10.19 |
Git, GitHub 시작하기-1 (0) | 2021.10.19 |
Github commit (0) | 2021.06.29 |