
회사에 들어가거나 공동 프로젝트를 할 경우 보통 우리는 각각의 임무가 생긴다.
누군가는 로그인창을 만들고 누군가는 장바구니창을 만든다.
이 때 예를들어 하나의 메인파일에 여럿이 작업한다면 무엇이 변했고
누가 코드를 변경했는지 파악하기 어려울 것이다.
또한 마구잡이로 코드가 변경된다면 그 프로젝트는 결국 파국으로 이어질 것이다.
이런 상황을 해결하기 위한 git과 github의 조작방법에 대한 내용이당.
프로젝트의 리더가 github에 프로젝트의 뼈대를 만들고나면
우리들은 그 뼈대를 내 컴퓨터로 복사해온다.(clone)
❗️ clone할 때는 직접 github에 repository를 만들때와 달리
git이 관리하는 폴더라고 묵시적으로 정해지기 때문에 git init을 할 필요가 없다.
그리고 각자 그 뼈대로부터 추가적인 기능들을 만들기 위해
관련된 다른 작업임을 명시하는 공간을 생성한다.(branch)
내 컴퓨터에서 기존 뼈대 프로젝트와 내가 만든 코드가 조화롭게
에러 없이 기능하는 경우 github에 내 결과물을 올린다.(Pull Request)
❗️ 내가 PR요청을 하기 전에 뼈대 프로젝트에 다른 사람의 코드가 merge되는 등
어떤 이유로 인해 내가 clone을 받았던 시점과 코드가 달라진 경우
적절한 조치를 해줘여 한다.(pull, merge)
프로젝트 리더는 내가 올린 코드가 적절하다 판단되면
뼈대 프로젝트에 내 코드를 합친다.(merge)
github repository로부터 내 컴퓨터에 프로젝트를 다운로드 받는 것을 말한다.

clone하고 싶은 코드가 있는 github repo에서 주소를 복사한다.

터미널에서 clone받을 경로로 이동하여 아래와 같은 명령어를 입력하면
해당 repository의 현재시점의 모든 파일을 복사해온다.
git clone 복사한repository주소
이제 우리는 clone한 프로젝트에 새로운 기능을 추가하려고 한다.
이 때 주의할 점은 우선 git init을 하면 안된다는 점과
새로운 branch를 만들어야 한다는 것이다.
새로운 브랜치에서 작업하게 되면 clone받은 main브랜치를 망가뜨릴 걱정 없이
새로운 코드 추가, 기존 코드 수정 작업들을 할 수 있기 때문이다.

아래 명령어로 새로운 브랜치를 생성, 확인, 이동할 수 있다.
# 새로운 branch 생성
git branch 만들고싶은branch이름
# branch 목록 확인(나올때는 q)
git branch
# branch checkout(이동)
git checkout 이동할브랜치이름
# branch 만들면서 바로 checkout까지 하기
git checkout -b 만들고이동할브랜치이름
이제 새로운 브랜치에서 새로운 작업을 한다.
login.py라는 파일을 만들고(작업했다 치고) add와 commit을 한다.
git add .
git commit -m '커밋 메시지'
merge와 pull은 우선 세가지 시점으로 구분해야 한다.
일단 우리는 1번과 2번에 대한 내용을 알면 된다.
일단 1번은 아직 main브랜치에 PR요청을 하기 전이다.
내가 따로 작업을 하는 동안 main브랜치에는 여러가지 commit기록들이 쌓일것이고
이것은 내 local에 있는 main브랜치의 commit기록들과 다른 상태일 것이다.
이 둘을 맞춰주기 위해 local에서 main브랜치로 이동한 다음 변경된 내용을 pull로 github으로부터 받아서 local main브랜치를 최신화하고,
다시 local에서 새로 작업한 브랜치로 이동하여 또 한 번 local main브랜치를
merge해서 commit기록을 일치시켜 줘야 한다.
헷갈린다면 local의 새로운 브랜치는 local의 main브랜치를 그대로 복사한 것이고
그 local의 main브랜치는 github repo에서 그대로 복사한 것이란 것을 떠올려보자.
명령어 순서는 다음과 같다.
# main 브랜치로 이동한다
git chekout main
# github로부터 최신화된 main 브랜치의 내용을 local main에 업데이트한다
git pull origin main
# 내가 작업한 브랜치로 이동한다
git checkout 내가작업한브랜치이름
# 업데이트된 local main의 내용을 새로 작업한 브랜치에 병합한다.
git merge main
# 각각의 브랜치에서 commit 로그를 확인해보면 서로 일치하는 것을 확인할 수 있다.
git log
이제 우리는 commit 삼위일체를 끝내고 Pull Request를 요청할 준비가 끝났다.
PR은 원격저장소에 있는 main 브랜치에 내가 작업한 내용을 병합해달라고
프로젝트 리더에게 요청하는 것이다.
방금전까지의 과정이 끝났다면 아래 명령어로 원격저장소인 github에
다음과 같은 명령어로 내가 작업한 브랜치를 추가한다.
git push origin 내가작업한브랜치이름

그럼 해당 원격저장소에 Compare & pull request라는 버튼이 생긴다.
이 버튼을 클릭하면 제목과 작업내용을 적는 곳이 나오고
다 작성했다면 Create pull request버튼을 눌러주면 PR신청이 완료된다.

기타 labels 기능 등의 소개는 생략하겠으며 이후 프로젝트 리더가
코드를 검토하고 문제가 있으면 수정사항 요청을 명시하며 반려하게 되거나
이상이 없으면 merging하여 원격저장소 main 브랜치에 합칠 것이다.
상단에서도 설명했듯이 local과 remot repository는 서로 다른 시간대를 갖는다.
정확히는 commit기록이 다를 수 있고 그에 따라 내용도 서로 다르게 된다.
우리가 요청한 PR이 원격저장소 main 브랜치에 merge되어도
local 저장소의 main 브랜치 내용은 내 PR이 merge되기 이전이다.

따라서 다음과 같은 명령어로 원격저장소의 main 브랜치의 업데이트된 내용을
가져와 나의 local main 브랜치 또한 업데이트 시켜줘야 하며,
이후 해당 local main 브랜치에서 새로운 브랜치를 만들어 작업하면 된다.
git pull origin main
뜬금없이 신기하게도 내가 딱 모르던 부분을 짚어내어
모든것을 정리되게 만들어주신 유병민 멘토님께 너무나 감사드린다.
commit 기록 일치에 대한 개념이 전혀 없었는데
모르고 넘어갔으면 큰일이 날수도 있었겠다는 생각이 든다.
적어도 문제가 발생하고 원인을 알아내는데 많은 시간을 쏟았을 거라 확신한다.
항상 감사할일만 생긴다.
나도 언젠가 누군가에게 도움을 줄 수 있는 사람이 될 수 있겠지..!🥲