Git과 GitHub를 더 정확히 이해하기 위해 프론트엔드 강의를 훔쳐보며 정리하였다...😂
Git과 GitHub를 이용하여 작업할 때에는 크게 두 가지 공간이 있다.
$ cd [원하는 폴더] # 내가 원하는 폴더로 이동
$ git clone [repository 주소] # 프로젝트를 리모트에서 로컬로 클론
$ cd [프로젝트 폴더] # 클론이 진행되고 나면 하위 폴더로 프로젝트 폴더가 생김. 작업을 위해 해당 폴더로 이동
위 과정을 진행하면 성공적으로 리모트의 코드를 내 로컬로 가져올 수 있게 된다. 이후 로컬에는 최초로 default branch에 위치해있게 되는데 이는 master
혹은 main
이라는 이름으로 지정되어 있다.
git을 이용해서 작업을 할 때는 default branch인 main
에서 바로 작업을 진행하면 안 된다. 항상 모든 작업은 해당 작업을 위한 별도의 브랜치를 생성한 뒤 그 브랜치에서 작업을 진행하여야 한다.
$ git branch [branch 이름] # 새로운 브랜치 생성
$ git checkout [branch 이름] # 해당 브랜치로 이동 후 코드 작성
$ git add .
$ git commit # 작업 이력 남기기
commit
을 통해 작업 이력을 남겼지만 아직 리모트에는 로컬에서 진행된 작업 이력을 모르고 있다. 따라서 로컬에서 작업된 진행 내역을 리모트로 올려야한다.
$ git push origin [branch 이름]
위 과정은 origin이라는 리모트의 [branch 이름]
이라는 브랜치에 내가 지금 한 작업을 올리겠다는 의미이다. 이렇게 되면 리모트에도 [branch 이름]
에 대한 작업 내용이 올라가게 된다. 이제, 리모트에는 해당 작업이 생성되었지만 아직 default branch인 main
에는 이 작업 내역이 없다.
따라서 main
에 [branch 이름]
의 작업 내용을 합쳐달라는 요청을 하기 위해서 Pull Request를 작성하여야 한다.
자신이 push한 commit의 메시지를 남기는 작업.
PR을 통해 브랜치의 작업 내역을 확인하고 관리자 또는 다른 팀원들이 의견을 남기고 확인한 후에 commit을 병합하는 과정.
Merge가 되고 나면 [branch 이름]
에 작성한 코드가 origin, 즉 리모트 상의 main
에 최신화되게 된다. 하지만 이는 github 상에서 PR을 등록하고 merge가 발생한 것이기 때문에 origin main은 최신화되어 있지만 로컬 상의 main은 이 내용을 모르고 있다. 따라서 origin main의 작업 내용을 내 로컬 main으로 가져오는 작업이 필요하다.
$ git checkout main # main으로 이동
$ git pull origin main # origin main의 내역을 내 로컬 main으로 가져오기
위 과정을 거치면 내 로컬 main의 코드가 최신화되게 된다.
이후 또 다른 작업을 진행하고 싶다면 main에서 새로운 브랜치를 생성해서 그 브랜치에서 현재까지 진행했던 과정을 계속 반복해주면 된다.
GitHub 상에 repository가 존재하기는 하지만, 비어있기 때문에 로컬에서 초기 세팅을 한 뒤에 리모트에 올려주어야 하는 상황이다.
위의 스크린샷은 프론트엔드 세션에서 뽀려온 것이라 2번의 내용은 내 상황(백엔드)과 맞지 않음을 기억해야 한다.!!!!
feature/[기능]
과 같이 브랜치를 생성한다.main
브랜치에 병합하는 방식으로 작업을 진행할 수 있게 된다.main
에 병합하는 과정에서 다른 브랜치와 작업 이력이 겹쳐서 발생하는 충돌(Conflict)이 대규모로 발생하게 된다.main
에 병합하는 Git을 활용한 작업 방식을 제대로 활용할 수 없게 만든다.main
에 병합되는 것이 목표기에 main
을 기준으로 새로운 브랜치를 생성하는 것이 좋다. main
에 있는 작업 내용이 기준이 아니라, 생성하는 시점에 위치했던 feature 브랜치가 기준이 되어서 새로운 브랜치가 생성되는 것이기에 의도하지 않은 작업 내역이 새로운 브랜치에 포함되어 있을 수 있다. 이는 브랜치마다 독립적인 기능을 작업하는 작업 방식에도 부합하지 않으며, 추후 main
에 병합하는 과정에서 충돌이 발생할 가능성이 커진다.main
을 기준으로 생성하여야 한다. (ex. feature/login 브랜치를 feature/nav에서 생성한 경우, 빨간 박스 때문에 충돌이 발생할 수 있다.)