Git & GitHub에 대한 개인적인 이해를 바탕으로 작성된 글입니다..
품격있는 지적은 대환영!!
📌 Git & GitHub란?
⚙️ Git
💡 개인 및 여러 사람들이 하나의 소프트웨어를 효율적으로 개발하기 위한 시스템으로,
버전을 관리하는데 사용된다.
여러 사람이 만든 코드 갈래(Branch)를 하나의 프로젝트로 통합하기 위함이 목적이다.
⚙️ GitHub
💡 Git을 조금 더 쉽게 관리하고, 프로젝트 상태를 쉽게 관리할 수 있는 저장소 툴이다.
📌 버전 관리의 필요성
- 중간에 프로젝트가 잘못되었을 때 되돌아가기 위해
- 대체 이 코드는 누가 작성했는지 알아내기 위해
- 코드가 어떻게 변경된 것이며, 어떻게 개발이 되었는지 추적하기 위해
📌 Git의 주요 키워드
✏️ Commit
- 버전을 생성한다.
- 코드 변경 후의 상태를 추가한다.
- Commit들을 이어서 하나의 개발 그래프가 만들어진다.
- Commit들이 모여서 누구에 의해, 어떤 개발이 이루어졌는지 추적 가능하다.
✏️ Branch
- 새로운 방향으로 개발을 시작한다.
- 다른 개발 그래프에 방해가 되지 않도록 기존에 개발된 위치에서 갈래를 구분해서 개발한다.
- Base가 되는 Branch에는 영향을 끼치지 않는다.
✏️ Fetch
- 혹시라도 누가 코드 업데이트를 하진 않았는지 원격 저장소를 확인한다.
✏️ Merge
- 내가 만든 Branch를 다른 Branch에 합쳐 하나로 만든다.
✏️ Rebase
- Branch 경로를 재배치한다.
- Pull Request 생성시, Merge대신 Rebase를 사용하여 Branch 경로를 깔끔하게 해줄 수 있다.
📌 Repository부터 Pull Request 까지 단계별 진행(with Sourcetree)
✅ Repository 생성
Repository는 GitHub 계정이 있다면 바로 생성이 가능하다.
프로필의 Repositories 탭에 들어가면 우측에 New 버튼이 있는데, 눌러주면 바로 진행된다.
Repository 이름과 설명을 작성해주고, 공개 여부에 따라 public & private 옵션을 선택해준다.
Add a README file 항목이 있는데, Repository에 대한 일종의 설명서 같은 느낌이라고 생각하면 될 것 같다.
Repository 생성을 마무리해주면, 위 사진과 같이 새로운 Repository가 만들어진다.
✅ Sourcetree 연결 & Repository 클론
Sourcetree라는 Git GUI를 사용해서 작업을 관리해 줄 예정이다.
Sourcetree는 무료 툴이기 때문에, 바로 다운로드 하면 된다.
Sourcetree | Free Git GUI for Mac and Windows
A Git GUI that offers a visual representation of your repositories. Sourcetree is a free Git client for Windows and Mac.
www.sourcetreeapp.com
다운로드 후, 계정을 추가해준다.
계정 -> 추가 -> 호스트 : GitHub 설정 후, GitHub에 로그인 되어있는 계정과 연결할 수 있다.
계정 연동 이후 원격 탭에 들어가보면, 내가 GitHub에서 생성해둔 Repository를 확인할 수 있다.
Repository 중 필요한 것을 선택해 클론하면, GitHub에 올라가 있는 Repository를 내 PC에 현 상태 그대로 복제해오게 된다.
클론이 완료되면, 지정된 경로에 저장소가 복제되어 폴더 상태로 저장되어 있다.
✅ Commit & Push
이제 저장소를 복사해왔으니, 내 PC에서 마음대로 작업이 가능하다.
VSCode로 복사된 저장소를 사용해서 작업을 몇 가지 수행한다.
조금은 식상하지만, "hello world!"를 출력하는 hello.py 파일을 새로 만들어주었다.
이 변경사항은 현재 나만 알고 있는 상태다.
따라서 작업을 마친 뒤에는 변경사항을 다시 GitHub에 있는 원본에 반영시켜줘야 한다.
Sourcetree에서 로컬로 복사해온 저장소를 열면, 귀신같이 변경사항을 알고 있다.
변경사항이 있는 hello.py라는 파일을 스테이지에 올려야 한다.
올린 뒤에 위의 메뉴바에 있는 커밋을 누르면 바로 커밋이 진행된다.
커밋을 올릴 땐, 어떤 사항에 대한 커밋인지 커멘트를 작성할 수 있다.
이쯤되면 아마 무수한 PC 비밀번호 요청을 받을지도 모른다..
조금 견뎌내고 커밋을 진행해주면 지금은 별도의 branch를 생성하지 않았기 때문에
main 브랜치에 커밋이 올라가 있는 것이 확인 가능하다.
커밋이 완료된 상태를 Push 해주려고 한다.
작업을 Push하게 되면, GitHub에 존재하는 Repository에 변경사항이 반영된다.
다만 지금까지는 별도의 Branch 생성 없이, 바로 main Branch에서 작업을 수행하여
Push를 진행하면 변경 상태가 바로 Repository에 반영되는 모습을 볼 수 있다.
✅ Branch 생성 & Merge
위에선 별도의 Branch를 생성하지 않고 main Branch에서 작업을 바로 수행했다면,
이번엔 별도의 Branch를 생성해서 작업을 수행할 예정이다.
Branch를 따로 만들어서 작업을 수행하는 이유로는
모두가 main Branch에서 작업을 하다보면 수시로 변경사항이 생기고 복잡하다는 것 정도가 있을 것 같다.
main Branch 위치에서 새로운 Branch를 만들게 되면,
main Branch의 내용을 가져온 새로운 작업공간이 생기게 된다.
해당 브랜치가 checkout된 상태에서 작업을 수행해본다.
이후 새로 진행된 작업 내용을 이전 과정처럼 Commit할 수 있다.
이번에 작업을 Push할 때는 원격 브랜치 위치를 main이 아닌,
동일한 이름의 원격 브랜치 pywork를 생성해서 Push해야 의미가 있다.
이렇게 작업을 Push하게 되면, 조금 다른 화면을 볼 수 있다.
이번엔 아까와 달리, 작업 내용이 바로 반영되지 않는 대신에
Compare & pull request라는 버튼이 새로 생겼다.
버튼을 눌러보면 위와 같은 화면이 등장한다.
이 작업이 무슨 작업인지, 변경사항이 어떤 내용인지에 대해 관리자가 체크를 마친 후에
Branch에서 별도로 작업된 내용을 main Branch에 적용할 수 있도록 요청하는 과정이라고 볼 수 있다.
적당한 제목과 설명을 덧붙여 Create pull request를 진행해주면 된다.
이 과정은 보통 프로젝트 관리자가 직접 진행하게 된다.
생성된 pr이 무엇인지 comment를 통해 확인하고, 어떤 변경사항이 있는지 모두 체크할 수 있다.
체크를 완료해서 문제가 없는 것이 확인되면, 별도 Branch에서 진행된 작업을 병합할 수 있다.
병합은 Merge pull request 버튼을 눌러서 진행할 수 있고,
병합이 완료되고 나서야 변경사항이 저장소에 반영된다.
이후 Sourcetree에서 main브랜치에 페치 & 풀을 진행해서, 병합된 이후의 상태를 가져와 체크해볼 수 있다.
pywork Branch가 main에 달라붙은 모습을 확인할 수 있다.
✅ Branch 생성 & Rebase
pull request를 Merge하는 방법 중, Rebase라는 옵션이 있다.
Rebase를 해보기 위해, pull request 생성까지의 과정을 새로운 Branch에서 진행했다.
이번엔 Merge pull request 버튼의 드롭다운 버튼을 눌러 Rebase and merge로 바꿔준다.
Rebase의 경우, Merge와 다르게 가지가 달라붙지 않고 별도로 진행되고 있는걸 확인할 수 있다.
Merge와 Rebase의 차이는 Branch를 삭제한 이후의 상태에서 확인이 쉽다.
Merge한 Branch의 경우 삭제 이후에도 병합된 상태가 찌꺼기처럼 남는 반면,
Rebase한 Branch의 경우, 작업 내용이 main으로 그대로 이사한 뒤에 찌꺼기가 사라진 모습이다.
물론 Rebase가 Branch 삭제 이후 작업 트리가 더 깔끔하다고 해서, 무조건 정답인 것은 아니다.
목적에 따라 Merge와 Rebase를 적절히 선택해서 진행하는 것이 좋을 것 같다.
또한, 당연히 Branch에서 진행한 작업들이 main에 병합되어 옮겨진 상태이므로,
Branch를 삭제한다고 해서 Merge하기 이전의 작업들이 모두 사라지거나 하진 않는다!
여기까지 간단히 Sourcetree를 사용하는 방법에 대해 알아보았다.