GitHub
깃허브(GitHub) 란 대표적인 Git 저장소다. Git 은 버전 관리 솔루션으로 commit, push, pull, merge 등의 기능을 포함하고 있다.
비용
원래는 공개 프로젝트만 무료였고 비공개 프로젝트는 결제를 해야 했으나, MS에 인수된 이후 2019년 1월 초부터 비공개 저장소를 무료로 제공하기 시작했다. 대신 무료 계정(개인 사용자)은 한 저장소당 최대 3명의 사용자까지만 무료로 등록할 수 있으며, 이 제한을 해제하려면 월 $7의 비용을 지불하는 유료 계정으로 전환해야 한다.
TIP
: 학생 계정 등록 시 별도의 비용 없이 유료 계정으로 업그레이드 가능하다.
대체제
깃허브의 대체제로 MS사의 Azure Devops(에이저 데브옵스) 가 대표적이다. 그 외에는 Bitbucket(비트버킷)과 GitLab(깃랩) 이라는 저장소도 있다. 이들 모두 git 솔루션의 저장소 역할을 하는 서비스들이다. 특히 BitBucket의 경우에는 Jira와 Confluence로 유명한 Atlassian에서 개발했기 때문에 신뢰도가 확실하다. 깃랩의 경우에는 비트버킷에 비하여 여러모로 강력한 기능을 제공하며 무료 계정에 대한 제한도 적지만 서버 운영이 불안정한 편이다.
특징
- 각 소스코드 저장소마다 Gollum이란 마크다운 기반(.md) 위키를 만들 수 있다. 위키를 클론하고 싶을 경우 https://github.com/(사용자 이름)/(저장소).wiki.git을 클론하면 된다.
- GitHub Pages라는 이름으로 웹 호스팅 서비스를 제공하고 있다. Jekyll(지킬)이라는 Ruby 기반 정적 CMS 툴을 내장하고 있다. Jekyll을 사용하지 않을 경우에도 평범한 HTML/CSS/JS를 업로드하면 홈페이지로 쓸 수 있다. (사용자 이름).github.io라는 이름으로 저장소를 만들면 된다. 만약 개인 도메인을 사용하고 싶다면, 저장소의 루트 경로에 CNAME 파일을 만들고 도메인을 입력한 뒤 DNS에 GitHub 서버 주소를 입력하면 된다.
- 각 저장소들을 해당 도메인의 하위 디렉토리 구조로 웹사이트 호스팅이 가능하다.(저장소 옵션에서 별도 설정 필요)
- 각 저장소마다 별도의 이슈 트래커를 무료로 지원한다.
- 2명 이상의 협력자(collaborators)를 등록하여 하나의 프로젝트(저장소)내에서 공동 작업할 수 있다.
- Gist 를 통해 단일 소스파일 및 간단한 메모를 저장 또는 공유하는 용도로 사용할 수 있다. 간단한 코드 조각을 공유하기 위함
설치
깃허브 설치 경로
설치파일 실행 후 모두 next 및 install 진행
설치 된 git bash
프로그램 == 깃 전용 bash 쉘 : 여기서 git 명령어를 통해 git 기능들을 사용할 수 있다.
깃허브 가입 및 저장소 생성
- Sign up for GitHub 클릭
- 유저네임 / 이메일 주소 / 비밀번호 입력 후 가입
- plan 설정에서 무료 플랜으로 설정함
- Finish sign up
- 입력한 이메일로 가서 이메일 인증을 진행함
- Start a project (신규 저장소 생성)
- 저장소 이름 입력 후 public or private 으로 저장소 생성
사용법
clone
- 해당 저장소를 통째로 복사하는 기능
git clone https://github.com/<계정이름>/<저장소이름>.git
- 해당 저장소를 통째로 복사하는 기능
add
- 현재 작업내용을 커밋하기 위해 추가하는 작업
- 변경 이력이 있는 파일만 해당 됨
- 옵션을 통해 수정된 파일 또는 디렉토리 단위로 추가 가능
git add . # 모든 수정된 파일을 추가 git add -p # 코드 블럭 단위 또는 파일 단위로 add 할 수 있는 옵션 # ----------------------------------- # git add -p 상호작용에서의 대화 명령어 # y : 해당 hunk 를 add # n : 해당 hunk 는 스킵 # q : 그만두기 # a : 해당 파일 전체를 add # d : 해당 파일 전체를 스킵 # -----------------------------------
commit
- add 된 내용을 commit 하는 기능
- 커밋 메시지와 함께 가능
- 커밋은 작업 단위
git commit -m "커밋 메시지" git commit -v # vi 에디터를 이용하여 커밋메시지를 정리 // 첫번째 줄은 제목 , 두번째 줄 부터 내용이 됨
push
- commit 된 내용들을 원격 저장소로 업로드하는 기능
pull
- 원격 저장소로부터 내려받는 기능
- 커밋과 파일 이력을 비교하여 로컬 저장소를 업데이트하는 기능
- 충돌 시 stash 발생, 이때 충돌 부분 제거 후 다시 pull 또는 merge
reset
- 소스코드를 특정 위치의 commit 내용으로 롤백 하기 위해 사용
--soft
옵션--mixed
옵션--hard
옵션- 출처 : git reset 정리
git reset --soft HEAD~ # 이전 커밋 단계(HEAD~) 로 reset git reset --soft 9e30761481b8018acf4023902de99715d4b201fe # 특정 커밋 단계(hash값) 로 reset git reset --mixed HEAD~ # mixed 는 default 값 git reset --hard HEAD~
revert
- 소스코드를 특정 위치의 commit 내용으로 돌아가고 이렇게 돌아간 내용을 새로운 이력으로 이어나가기 위해 사용
git revert --no-commit HEAD # Revert "현재 커밋" : 현재 커밋 직전으로 되돌리기 git revert --no-commit HEAD~ # Revert "직전 커밋" : 직전 커밋 직전으로 되돌리기
- 소스코드를 특정 위치의 commit 내용으로 돌아가고 이렇게 돌아간 내용을 새로운 이력으로 이어나가기 위해 사용
branch
[브랜치 이름]
: 신규 브랜치 생성-l
: 로컬 branch 정보 (리스트) 출력 (생략가능)-v
: 로컬 branch 정보 + 마지막 커밋 내용-r
: 리모트 저장소의 branch 정보 출력-a
: 로컬/리모트 저장소의 모든 branch 정보 출력-d
: 브랜치 삭제 (아직 merge하지 않은 커밋을 담고 있을 경우 삭제되지 않음)-D
: 브랜치 강제 삭제
checkout
-[브랜치 이름]
: 해당 브랜치로 이동하기git branch NewBranch # NewBranch 생성 git branch -l git branch -v git branch -r git branch -a git branch -d NewBranch git branch -D NewBranch git checkout NewBranch
merge
- 두 개의 서로 다른 이력을 합치는 기능
- 일반적으로는 두 branch 를 합칠 때 사용
- 두 이력을 바로 합치기
rebase
- 두 개의 서로 다른 이력을 합친다는 점에서
merge
와 같지만rebase
는 이력을 시간 순으로 재정렬 하는 기능이다. - 두 이력을 재정렬하기
- 출처 : git merge vs rebase
- 두 개의 서로 다른 이력을 합친다는 점에서
Pull Request (풀리퀘)
풀리퀘스트는 다른 사람이 만든 코드에 수정을 제안하는 기능이다.
시나리오
- 다른 사람의 코드를 변경하거나 해당 프로젝트에 기여하고자 함.
- 해당 저장소의 브랜치(Master branch)에서 포크해 독자적인 브랜치를 만듦
- 여기서 중요한 포인트는 브랜치를 작은 단위로 만드는 것이다. 브랜치를 길게 유지하게 되면 마스터 브렌치와 차이가 커져 나중에 코드를 합치기 쉽지 않다. 변경 단위를 짧고 세밀하게 만들어 풀리퀘스트하는 게 중요함.
- 작업을 하다가 내 코드가 마음에 들지 않으면 풀리퀘를 안하면 그만.
- 변경한 코드가 괜찮은 것 같다면 풀리퀘스트를 보냄.
- 수정한 내용에 대하여 코드 리뷰 및 토론 진행
- 지적사항이 나오면 수정
- 최종 merge 까지 이를 반복함.
깃허브 활용 팁
- git add .
- git commit -m “현재 내용까지 커밋”
- git fetch –all
- git rebase origin/develop # 이 단계에서 충돌 잡기
- git push orgin mybranch
- github 사이트의 develop 브랜치에서 방금 전 커밋 내용을 풀리퀘 진행
- 최종 승인자가 승인/거부 결정
Git Flow (깃 플로우)
master
: 프로덕션 (배포용) 버전develop
: 개발 (테스트용) 버전feature
: 신규 기능 작업 단위hotfix
: 급한 수정 작업 단위
- 개인 프로젝트 플로우
master - develop - hotfix/작업단위
# 예시
git branch develop
git checkout develop
git add .
git commit -m "Add 로그인 카드"
git push origin develop
# 급한 수정 발생
git branch hotfix/로그인버그수정
git branch hotfix/파비콘수정
git branch hotfix/현재시간버그수정
- 협업 프로젝트 플로우
master - develop - feature/작업단위
- hotfix/작업단위
# 예시
git branch develop
git checkout develop
git branch feature/로그인카드
git add .
git commit -m "Init 로그인 카드"
git push origin develop
# 급한 수정 발생
git branch hotfix/로그인버그수정
커밋 메시지 규칙
개요
커밋 메시지의 규칙화를 통해 커밋 메시지만으로 작업을 구분할 수 있게 하기 위함
규칙
커밋 제목
[작업 액션] [작업 단위]
[작업 액션]
: Init, Add, Fix, HotFix, Improve 등과 같은 해당 작업의 성격을 나타내는 액션[작업 단위]
: 어떠한 작업인지에 대한 설명[(Init, Add, Fix, HotFix, Improve,....)]
중 택일 +[작업 단위에 대한 개요]
커밋 설명
[설명]
[설명]
: 추가 상세 설명 내용은 커밋 제목 하단에 내용으로 추가한다
작업 액션 상세 설명
Init
: 해당 작업을 처음 시작 할 때 또는 해당 작업에 대한 커밋을 처음 진행 할 때Add
: 이미 해당 작업에 대한 INIT 이 이뤄지고 난 뒤 새로운 무언가를 추가 할 때 (기능, 디자인 등을 추가할 때)Fix
: 기존의 작업 내용을 수정해야 할 때 (기능, 디자인 등을 수정할 때)HotFix
: 이미 배포된 작업에 대해 급하게 수정을 해야할 때, 즉 최고 우선순위의 Fix 작업Imporve
: 기존의 작업 내용을 고치는 개념이 아니라 향상시키고자 할 때 (코드 최적화, 쿼리 최적화, 기능 개선, 디자인 개선)
예시
- Init 패션 태그 뷰셋
- Add 소셜로그인 Facebook API
- Fix Facebook 소셜로그인 Email Field validation 오류
- HotFix 소셜 계정 이미지 does not exist 오류
- Improve 도시락 태그 api 쿼리 코드 리팩토링
활용
git add -p
git commit -v
# ---------------------
# vi 편집기 내
# 첫째줄은 자동으로 제목이 됨
Init 패션 태그 뷰셋
패션 태그의 Create Retreive Update Delete Viewset 개발 init
:wq!
# ----------------------
git push origin feature/FashionTagViewset