3 Git & GitHub 다지기

source: categories/study/git-beginner2/git-beginner_2_3.md

3.1 Git의 원리

3.1.1 Git에서 커밋이란?

  1. 변경 사항의 모음(X), 하나의 최종 코드모음(O)
  2. 다만 기존 커밋과 비교해서 변경된 파일이 아니면 ‘변경되지 않았다'고만 저장해서 용량이 무겁지 않다.

    1. SVN은 바로 이전 커밋과의 변경사항만 저장
    2. 그래서 커밋당 용량은 더 가볍지만 한 버전을 보려면 맨 처음 커밋부터 계산해야한다. -> 속도 느림
    3. Git은 바로 이전 커밋만 보면 된다. -> 속도 빠름

흠.. git은 스냅샷으로 저장해서 SVN 보다 저장용량이 매우 적다고 알고있는데.. 아닌가?
SVN도 가볍고 Git도 가볍운데 속도는 Git이 훨씬 빠른.. 딱 그런 개념인건가 음..


3.1.2 상태

  1. Git으로 추적하는 파일의 4가지 상태 (추적안됨, 수정없음, 수정함, 스테이지됨)
  2. 작업 공간(Working directory)에 있는 수정함, 추적안됨 파일을 스테이지로 올려 스테이지됨으로 변경한다.
  3. 커밋을 하면 수정없음 상태로 돌아간다.

3.2 branch

  • 브랜치를 활용해 작업이 충돌날 경우를 대비합니다.
    똑같은 코드를 동시에 수정해도 충돌을 피할 수 있고 또 해결하기도 쉽습니다.
    합치는 시점에 명시적으로 충돌을 해결할 수 있습니다.

  • HEAD: 내가 지금 작업하는 로컬 브랜치를 가리키는 포인터.

3.2.1 브랜치 만들기

git branch <브랜치이름>

3.2.2 브랜치 이동하기

HEAD가 옮겨간다!

git checkout <브랜치이름>

3.3 merge

  1. fast-forward
  2. 3-way merge
git merge <합치려고하는 브랜치이름>

3.4 conflict

<<<<<<< HEAD
~~~
=======
~~~
>>>>>>> <합치려는 브랜치>

3.5 fork: 저장소 통째로 복제하기

  • 오픈소스에 기여하고싶을 때

    • 푸시 권한이 없는데 어떻게 기여하지?
    • 오픈소스에 기여를 하기 위해 커밋 전에 반드시 collaborator 등록을 부탁해야할까요?
    • 이럴때 포크(fork) 기능을 사용하면 됩니다.
  • 포크

    • 오픈소스의 저장소를 통째로 내 계정에 복제해와서
    • 내꺼에서 자유롭게 커밋, 푸시를하고
    • 내 저장소의 브랜치를 오픈소스의 저장소 브랜치에 머지해달라고 요청

3.5.1 브랜치 vs 포크

두 가지 모두 코드를 협업하기 위해 분기점을 나누는 방식이지만 특성이 다르므로 내 프로젝트에 맞게 사용

  의의 편리한 점 불편한 점
브랜치 하나의 원본저장소에서 분기를 나눈다 하나의 원본저장소에서 코드 커밋 이력을 편하게 볼 수 있다 다수의 사용자가 다수의 브랜치를 만들면 관리하기 힘들다
포크 여러 원격 저장소를 만들어 분기를 나눈다 원본저장소에 영향을 미치지 않으므로 마음껏 코드를 수정할 수 있다. 원본저장소의 이력을 보려면 따로 주소를 추가해줘야한다

3.5.2 실습

  1. 오픈소스 저장소 포크하기
  2. 포크한 저장소 내 컴퓨터에 클론하기
  3. 파일 수정
  4. 원본 저장소를 remote에 upstream이란 이름으로 추가

  • watch: 이 프로젝트에 좀 관심이 가. 이 프로젝트의 업데이트를 받아보고싶어
  • star: 이 프로젝트 마음에들어. 좋아요 표시.
  • fork: 해당 저장소 내 저장소로 복제

내 저장소로 복제된 것을 확인할 수 있다.
이제 클론받고 코드 수정한 후 커밋 & 푸시를 하면된다.

git remote add upstream https://github.com/원본저장소아이디/원본저장소이름.git

이렇게 추가해야 원본 저장소의 이력까지 같이 볼 수 있다.

3.6 pull request

포크한 저장소에서 기능 개발을 마쳤습니다.
이제 이 코드를 오픈소스 원본 저장소에 머지해달라고 하고 싶습니다.

그런데 원본 저장소엔 push할 권한이 없습니다.
어떻게해야할까요?

이때 사용하는 기능이 pull request입니다.

  1. 마지하고 싶은 두 브랜치를 선택하고
  2. 어떤 변경을 했는지 제목과 내용을 씁니다.
  3. 단일 저장소에서 보낼 수도 있고, 이렇게 포크한 저장소에서도 보낼 수 있습니다.

3.6.1 풀 리퀘스트로 머지 요청 보내기

  1. 코드를 함께 작성하는 팀원이 있다면, 최대한 직접 머지하는건 피하고 모든 머지를 풀 리퀘스트를 통해서 하세요.
  2. 동료가 내 풀 리퀘스트(PR)를 보고 코드를 리뷰할 수 있습니다.
  3. 동료의 PR에 수정이 필요하면 댓글을 달아 change request를 보낼 수 있습니다.
  4. 오픈소스에 PR을 보낼때는 ‘기여 안내문서(contribution guideline)'을 반드시 참고해야 합니다.

3.6.2 포크한 저장소에서 원본 저장소로 PR 보내기

pull request 버튼을 누릅니다.

오른쪽 저장소/브랜치에서 왼쪽 저장소/브랜치로 머지요청을 보내겠다는 뜻이다.
충돌이 없을 경우는 Able to merge라고 뜨고 충돌이 있는 경우는 Conflict가 뜬다.
충돌이 있는 경우엔 충돌을 해결하고 PR을 보내는 것이 좋다.
create pull request 버튼을 누르고 코멘트를 작성 후 PR을 보내면된다.