깃은 분산 버전 관리 시스템으로, 빠르고 팀의 규모에 상관없이 잘 동작하도록 설계되었다.
🧟♀️ .gitignore
git이 추적하지 않을 디렉토리 및 파일을 명시하기 위해,
.gitignore
파일을 생성 후 추적하지 않을 파일을 명시한다.gitignore.io: git 예시 모음 - https://www.gitignore.io/
작업 도중 .gitignore 파일을 만들었을 경우
깃허브에 올라간 파일들 삭제하기
git rm -r --cached . git add . git commit -m "Add gitignore" git push
🛁 git 관리
git config : 사용자 정보 지정
git config --global color.ui true git config --global user.name "Sook" git config --global user.email "22sook00@EMAIL.com"
🔐 SSH Key
Github와 연동등에 사용 - https://github.com/settings/keys
# 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 status, log, diff
# 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
🏞 Working Area: init, clone
# 프로젝트를 git repository로 생성하기 cd project git init # 원격 repository 클론하여 작업폴더로 만들기 git clone https://github.com/username/project-name.git project-name cd project-name
💬 Stage Area: add, commit, checkout
# 선택적으로 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 -
Remote Repository: remote, push, pull
# 로컬저장소에 origin이라는 이름으로 원격저장소의 주소를 알려주눈 작업 git remote add origin https://github.com/mhjo/test_mhjo.git # remote URL을 https에서 ssh로 변경하기 git remote set-url origin git@github.com:USERNAME/REPOSITORY.git # remote 저장소 목록보기 git remote -v # origin 저장소의 master 브랜치를 로컬 저장소의 master 브랜치의 업스트림으로 지정함 git push -u origin master # --set-upstream # 로컬저장소에 있는 커밋들을 원격저장소에 올리기 git push origin master # local의 master 브랜치를 heroku remote repository로 push git push heroku master # 원격저장소 origin의 변경사항을 local repository에 업데이트 git pull origin master git pull # fetch 후 merge하기 ## fetch: 원격저장소에서 변경사항을 가져오지만 HEAD에 merge하지 않음 git fetch git merge origin/master
Revert: 변경사항을 되돌리는 커밋 만들기
# 지정한 commit 해시버전을 최상단 커밋으로 올리면서 돌아가기, 즉 히스토리 남기기 git revert commit_hash # 마스터 브랜치에 있는 기능 하나 취소하기 # 예시) c1 <- f1 <- c2 <- f2 <- c3 (master) git revert f2 git revert f1 # ---> c1 <- f1 <- c2 <- f2 <- c3 <- rf2 <- rf1 (master)
Reset: 되돌리기
- Hard: 히스토리 되돌리기
- Soft: 원하는 커밋으로 이력을 되돌리지만 작업 내역은 남긴다.
- Mixed: 인덱스만 리셋. 언스테이징
# 예전 Commit 해시버전으로 돌아가기 (사용자제) git reset commit_id --hard
Branching
- 브랜치는 물리적인 요소가 아니라 단순한 포인터이다.
- 우리가 커밋을 할 때마다 master 브랜치의 포인터는 최신 커밋을 가리키도록 움직인다.
- 브랜치를 생성하면 브랜치를 생성한 커밋을 기준(base)으로 새로운 브랜치가 생성된다.
- HEAD: 브랜치나 커밋을 가리키는 포인터로써, HEAD를 다른 커밋을 가리키게 하여 브랜치를 전환하거나 과거의 커밋을 볼 수 있다.
브랜칭 전략
master
혹은develop
브랜치에 직접 커밋을 올리지 않는다.
- 기능 개발 시,
develop
브랜치를 기준으로feature/기능이름
브랜치를 만들어 작업한다.
- 기능 개발이 끝나면 작업자는 원격저장소에서 Pull Request를 요청한다.
- feature 브랜치 PR은 리뷰 후
develop
브랜치에 머지한다.
Branch: 분기
# 새로운 branch 생성 후 바로 체크아웃 하기 git checkout -b <branch> # branch 목록보기 git branch # 새로운 branch 생성 git branch feature/exp # branch 간 스위치하기 git checkout <branch> # branch 삭제하기 git branch -d <branch> # remote repository로 branch를 push 하기 git push origin <branch>
Merge: 병합
- Fast-forward: 빨리감기 병합. 베이스 브랜치에서 분기 후 작업내용을 머지하면 단순한 수정본이므로 FF됨
- Merge commit: 새로운 상태를 저장하면 병합 커밋이 생성됨
- Conflict: 충돌
# feature/exp 브랜치를 develop 브랜치에 합치기 git checkout develop git merge feature/exp
rebase 머지
현재 브랜치의 새로운 키밋을 대상 브랜치 위로 재배치하기
# 빨리감기 가능한 상황에서 rebase 하기. 머지와 같음. git checkout feature git rebase master # 변경사항 없음 git checkout master git rebase feature git push git branch -d feature # 브랜치 삭제
충돌 발생시
가운데
======
를 기준으로 HEAD 부분의 현재 체크아웃된 브랜치의 내용과,exp 부분의 merge 한 부분의 차이점을 보여준다.
<<<<<<< HEAD function a(master) {} ======= function a(exp) {} >>>>>>> exp
Pull Request - 현업에서 머지하기
develop
브랜치에서 분기한feature/기능
브랜치에서 작업한 내용을 커밋하고 푸시한다.
- 원격저장소에서 Compare & Pull Request 버튼을 눌러 PR 메시지를 작성한다.
- base: 병합된 커밋이 들어갈 브랜치
- compare: base브랜치에 반영하고 싶은 브랜치
- 내용: 스크린샷, 테스트 방법 등 내용 작성
- Reviewers: 리뷰어
- Assignees: 담당자. 보통 자기 자신.
- Labels: 버그, 기능추가, 핫픽스 등의 라벨
- 머지가 완료되면 로컬저장소에서
fetch
하여 반영 상태를 확인한다.
- develop 브랜치로 checkout한 뒤, pull하여 변경 내용을 가져온다.
Tagging
태그도 특정 커밋을 가리키는 포인터의 일종.
### 태그를 붙일 master 혹은 release 브랜치에서 작업한다. # 주석있는 태그 (annotated tag) 생성하기 git tag -a -m "Tag Description" v0.1 # tag 내용 보기 git tag -v v0.1 # remote에 release버전 추가하기 (tag push하기) git push origin v0.1 git push --tags
Hotfix 전략
- (옵션) 오류 없는 버전으로 롤백
- master 브랜치로부터 hotfix 브랜치 생성
- 소스코드 수정 및 테스트
- master 브랜치로 FF 병합 및 배포
- 개발중인 브랜치에 병합 (충돌 가능성)
# master에서 hotfix 브랜치 생성, 체크아웃 git checkout -b hotfix master ### 코드 수정 git commit # 빨리감기 병합 git checkout master git merge hotfix git push # 개발 중 브랜치에 병합 - 3way merge git checkout feature git merge master git add file.txt git commit
Stash
branch에서 작업도중, 다른 branch로 체크아웃해야 하는 상황, 하지만 현재 branch의 작업이 끝나지 않아 commit 할 수 없을 때 임시로 branch 작업 내용을 보존하기 위해 사용한다.
# stash 하기 git stash # 복원하기 git stash apply
Amend
- 커밋에 새로운 내용 추가
Cherry-pick
특정 브랜치의 커밋 피킹해서 다른 브랜치로 가져오기
Fork를 이용한 협업
- 5명 이하 개발자가 협업한다면 브랜치를 나누어 작업하는 것이 효율적
- 대규모 개발자가 협업을 해야한다면 포크하여 작업하는 것이 효율적 (오픈소스 프로젝트)
- Fork - 원본저장소의 프로젝트를 내 프로젝트로 만든다.
- 원본저장소에 영향을 미치지 않음.
- 따로 원본저장소의 주소를 추가해야 한다.
리모트 추가
# 포크한 저장소에서 원본저장소의 히스토리도 함께 보기 ## upstream: 원본저장소를 지칭하는 관용적 닉네임 git remote add upstream <url> # 페치해서 upstream 커밋 히스토리 가져오기 ...
원본저장소에 PR 보내기
- 포크한 원격저장소에서 New Pull Request를 생성한다.
- base: 원본저장소 <- head: 포크한 저장소
- 원본저장소 관리자는 PR 탭에서 보내온 PR을 확인한다.
- Approve, Submit Review를 클릭 해 승인한다.
- Merge PR을 클릭 해 머지한다.
Rebase: 병합 충돌 시 병합 커밋 이력 조작하기
rebase: 커밋의 베이스를 떼서 다른 곳에 붙이는 것. branch를 하나로 유지할 수 있다.
/---3 <-원본저장소 1---2-|-4---5 <- 포크한 저장소 # 4, 5번을 떼내서 3번 뒤에 붙인다. /---3---4----5 1---2-|
주의! 실수할 경우 로컬저장소는 삭제하고, 포크한 저장소를 클론 받아 작업하는 것이 낫다. 브랜치를 푸시했다면 리베이스 하지 말것.커밋을 하나씩 비교하면서 충돌여부를 확인하므로 충돌이 여러번 날 수도 있다.혼자 작업하는 브랜치에서만 작업하고, 작업 후 강제 푸시 할 것.
# 충돌 해결 git checkout feature git rebase master git push # TODO 갑자기 푸시??? git add file.txt git rebase --continue git checkout master git merge feature # 병합 커밋이 보기 싫을 때 git pull # 병합 커밋 생성됨 git reset --hard HEAD~ # 병합 커밋 되돌리기 git reabase origin/master git push
git을 이용한 작업 관리
pull -> (coding) -> commit -> pull -> push