3 Git & GitHub 다지기
source: categories/study/git-beginner2/git-beginner_2_3.md
3.1 Git의 원리
3.1.1 Git에서 커밋이란?
- 변경 사항의 모음(X), 하나의 최종 코드모음(O)
-
다만 기존 커밋과 비교해서 변경된 파일이 아니면 ‘변경되지 않았다'고만 저장해서 용량이 무겁지 않다.
- SVN은 바로 이전 커밋과의 변경사항만 저장
- 그래서 커밋당 용량은 더 가볍지만 한 버전을 보려면 맨 처음 커밋부터 계산해야한다. -> 속도 느림
- Git은 바로 이전 커밋만 보면 된다. -> 속도 빠름
흠.. git은 스냅샷으로 저장해서 SVN 보다 저장용량이 매우 적다고 알고있는데.. 아닌가?
SVN도 가볍고 Git도 가볍운데 속도는 Git이 훨씬 빠른.. 딱 그런 개념인건가 음..
3.1.2 상태
- Git으로 추적하는 파일의 4가지 상태 (
추적안됨
,수정없음
,수정함
,스테이지됨
) - 작업 공간(Working directory)에 있는
수정함
,추적안됨
파일을 스테이지로 올려스테이지됨
으로 변경한다. - 커밋을 하면
수정없음
상태로 돌아간다.
3.2 branch
-
브랜치를 활용해 작업이 충돌날 경우를 대비합니다.
똑같은 코드를 동시에 수정해도 충돌을 피할 수 있고 또 해결하기도 쉽습니다.
합치는 시점에 명시적으로 충돌을 해결할 수 있습니다. -
HEAD
: 내가 지금 작업하는 로컬 브랜치를 가리키는 포인터.
3.2.1 브랜치 만들기
git branch <브랜치이름>
3.2.2 브랜치 이동하기
HEAD
가 옮겨간다!
git checkout <브랜치이름>
3.3 merge
- fast-forward
- 3-way merge
git merge <합치려고하는 브랜치이름>
3.4 conflict
<<<<<<< HEAD
~~~
=======
~~~
>>>>>>> <합치려는 브랜치>
3.5 fork: 저장소 통째로 복제하기
-
오픈소스에 기여하고싶을 때
- 푸시 권한이 없는데 어떻게 기여하지?
- 오픈소스에 기여를 하기 위해 커밋 전에 반드시 collaborator 등록을 부탁해야할까요?
- 이럴때 포크(fork) 기능을 사용하면 됩니다.
-
포크
- 오픈소스의 저장소를 통째로 내 계정에 복제해와서
- 내꺼에서 자유롭게 커밋, 푸시를하고
- 내 저장소의 브랜치를 오픈소스의 저장소 브랜치에 머지해달라고 요청
3.5.1 브랜치 vs 포크
두 가지 모두 코드를 협업하기 위해 분기점을 나누는 방식이지만 특성이 다르므로 내 프로젝트에 맞게 사용
의의 | 편리한 점 | 불편한 점 | |
---|---|---|---|
브랜치 | 하나의 원본저장소에서 분기를 나눈다 | 하나의 원본저장소에서 코드 커밋 이력을 편하게 볼 수 있다 | 다수의 사용자가 다수의 브랜치를 만들면 관리하기 힘들다 |
포크 | 여러 원격 저장소를 만들어 분기를 나눈다 | 원본저장소에 영향을 미치지 않으므로 마음껏 코드를 수정할 수 있다. | 원본저장소의 이력을 보려면 따로 주소를 추가해줘야한다 |
3.5.2 실습
- 오픈소스 저장소 포크하기
- 포크한 저장소 내 컴퓨터에 클론하기
- 파일 수정
- 원본 저장소를 remote에 upstream이란 이름으로 추가
- watch: 이 프로젝트에 좀 관심이 가. 이 프로젝트의 업데이트를 받아보고싶어
- star: 이 프로젝트 마음에들어. 좋아요 표시.
- fork: 해당 저장소 내 저장소로 복제
내 저장소로 복제된 것을 확인할 수 있다.
이제 클론받고 코드 수정한 후 커밋 & 푸시를 하면된다.
git remote add upstream https://github.com/원본저장소아이디/원본저장소이름.git
이렇게 추가해야 원본 저장소의 이력까지 같이 볼 수 있다.
3.6 pull request
포크한 저장소에서 기능 개발을 마쳤습니다.
이제 이 코드를 오픈소스 원본 저장소에 머지해달라고 하고 싶습니다.
그런데 원본 저장소엔 push할 권한이 없습니다.
어떻게해야할까요?
이때 사용하는 기능이 pull request
입니다.
- 마지하고 싶은 두 브랜치를 선택하고
- 어떤 변경을 했는지 제목과 내용을 씁니다.
- 단일 저장소에서 보낼 수도 있고, 이렇게 포크한 저장소에서도 보낼 수 있습니다.
3.6.1 풀 리퀘스트로 머지 요청 보내기
- 코드를 함께 작성하는 팀원이 있다면, 최대한 직접 머지하는건 피하고 모든 머지를 풀 리퀘스트를 통해서 하세요.
- 동료가 내 풀 리퀘스트(PR)를 보고 코드를 리뷰할 수 있습니다.
- 동료의 PR에 수정이 필요하면 댓글을 달아 change request를 보낼 수 있습니다.
- 오픈소스에 PR을 보낼때는 ‘기여 안내문서(contribution guideline)'을 반드시 참고해야 합니다.
3.6.2 포크한 저장소에서 원본 저장소로 PR 보내기
위 pull request
버튼을 누릅니다.
오른쪽 저장소/브랜치에서 왼쪽 저장소/브랜치로 머지요청을 보내겠다는 뜻이다.
충돌이 없을 경우는 Able to merge
라고 뜨고 충돌이 있는 경우는 Conflict
가 뜬다.
충돌이 있는 경우엔 충돌을 해결하고 PR
을 보내는 것이 좋다.
create pull request
버튼을 누르고 코멘트를 작성 후 PR
을 보내면된다.