HEAD: 브랜치나 커밋을 가리키는 포인터로써, HEAD를 다른 커밋을 가리키게 하여 브랜치를 전환하거나 과거의 커밋을 볼 수 있다.
브랜칭 전략
master 혹은 develop 브랜치에 직접 커밋을 올리지 않는다.
기능 개발 시, develop 브랜치를 기준으로 feature/기능이름 브랜치를 만들어 작업한다.
기능 개발이 끝나면 작업자는 원격저장소에서 Pull Request를 요청한다.
feature 브랜치 PR은 리뷰 후 develop 브랜치에 머지한다.
Branch: 분기
Merge: 병합
Fast-forward: 빨리감기 병합. 베이스 브랜치에서 분기 후 작업내용을 머지하면 단순한 수정본이므로 FF됨
Merge commit: 새로운 상태를 저장하면 병합 커밋이 생성됨
Conflict: 충돌
rebase 머지
현재 브랜치의 새로운 키밋을 대상 브랜치 위로 재배치하기
충돌 발생시
가운데 ====== 를 기준으로 HEAD 부분의 현재 체크아웃된 브랜치의 내용과,
exp 부분의 merge 한 부분의 차이점을 보여준다.
4. Pull Request - 현업에서 머지하기
develop 브랜치에서 분기한 feature/기능 브랜치에서 작업한 내용을 커밋하고 푸시한다.
원격저장소에서 Compare & Pull Request 버튼을 눌러 PR 메시지를 작성한다.
base: 병합된 커밋이 들어갈 브랜치
compare: base브랜치에 반영하고 싶은 브랜치
내용: 스크린샷, 테스트 방법 등 내용 작성
Reviewers: 리뷰어
Assignees: 담당자. 보통 자기 자신.
Labels: 버그, 기능추가, 핫픽스 등의 라벨
머지가 완료되면 로컬저장소에서 fetch하여 반영 상태를 확인한다.
develop 브랜치로 checkout한 뒤, pull하여 변경 내용을 가져온다.
Tagging
태그도 특정 커밋을 가리키는 포인터의 일종.
Hotfix 전략
(옵션) 오류 없는 버전으로 롤백
master 브랜치로부터 hotfix 브랜치 생성
소스코드 수정 및 테스트
master 브랜치로 FF 병합 및 배포
개발중인 브랜치에 병합 (충돌 가능성)
Stash
branch에서 작업도중, 다른 branch로 체크아웃해야 하는 상황, 하지만 현재 branch의 작업이 끝나지 않아 commit 할 수 없을 때 임시로 branch 작업 내용을 보존하기 위해 사용한다.
Amend
커밋에 새로운 내용 추가
Cherry-pick
특정 브랜치의 커밋 피킹해서 다른 브랜치로 가져오기
5. Fork를 이용한 협업
5명 이하 개발자가 협업한다면 브랜치를 나누어 작업하는 것이 효율적
대규모 개발자가 협업을 해야한다면 포크하여 작업하는 것이 효율적 (오픈소스 프로젝트)
Fork - 원본저장소의 프로젝트를 내 프로젝트로 만든다.
원본저장소에 영향을 미치지 않음.
따로 원본저장소의 주소를 추가해야 한다.
리모트 추가
원본저장소에 PR 보내기
포크한 원격저장소에서 New Pull Request를 생성한다.
base: 원본저장소 <- head: 포크한 저장소
원본저장소 관리자는 PR 탭에서 보내온 PR을 확인한다.
Approve, Submit Review를 클릭 해 승인한다.
Merge PR을 클릭 해 머지한다.
Rebase: 병합 충돌 시 병합 커밋 이력 조작하기
rebase: 커밋의 베이스를 떼서 다른 곳에 붙이는 것. branch를 하나로 유지할 수 있다.
⚠️
주의할점!!
실수할 경우 로컬저장소는 삭제하고, 포크한 저장소를 클론 받아 작업하는 것이 낫다.
브랜치를 푸시했다면 리베이스 하지 말것.커밋을 하나씩 비교하면서 충돌여부를 확인하므로 충돌이 여러번 날 수도 있다.혼자 작업하는 브랜치에서만 작업하고, 작업 후 강제 푸시 할 것.
# ssh key 생성
ssh-keygen -t rsa -b 4096 -C "22sook00@EMAIL.com"
# ssh key 확인하기
cat ~/.ssh/id_rsa.pub
#-> 복사해서 Github ssh key 세팅에 붙여넣기
# ssh 작동 확인하기
ssh -T git@github.com
#-> Hi excid3! You've successfully authenticated, but GitHub does not provide shell access.
# git 작업폴더 상태 확인
git status
# Log 보기
git log
# commit 간 차이점 모두 보기
git log -p
# 모든 브랜치 그래프로 보여주기
git log --oneline --graph --all --decorate
# branch간 log 비교하기
git log -p master..exp
git log -p exp..master
# commit 아이디를 사용해 차이점 보기
git diff commit_id..commit_id
# 각 branch간의 변경사항 비교
git diff <source_branch> <target_branch>
git diff master..exp
# 프로젝트를 git repository로 생성하기
cd project
git init
# 원격 repository 클론하여 작업폴더로 만들기
git clone https://github.com/username/project-name.git project-name
cd project-name
# 선택적으로 stage에 올리기. add changes to INDEX
git add index.html
# 모든 파일 스테이징. add all changes to INDEX
git add *
git add .
git add -A
# 언스테이징 (Mixed reset)
git reset file.txt
# 변경사항 commit
git commit -m "Fix typo in index.html"
# 체크아웃 - 커밋간 체크아웃
git checkout 5813b5
## 최신 커밋으로 체크아웃하기
git checkout -