VCS (Version Control System)
프로그램의 버전 관리를 위한 도구
ex: Git, SVN
작업한 코드를 과거 시점으로 되돌리거나
다른 버전의 코드에서 작업한 결과물을 하나로 합칠 때
Git과 같은 VCS 프로그램을 사용하면
빠르고 간편하게 작업을 수행할 수 있습니다.
Merge
branch를 병합합니다.
✅ branch가 사라지지 않고 그대로 남습니다.
Rebase
한 브랜치의 커밋을 다른 브랜치에 접붙입니다.
🧺 합쳐진 branch가 사라지면서 commit history가 깔끔하게 정리됩니다.
Snapshot
특정 시점의 파일, 폴더, 워크스페이스의 상태
Stash
Working Tree에서 작업하고 있던 내용을 별도의 저장소에 치워두는 것
✅ 작업이 덜 끝나 커밋할 수 없는데, 긴급히 다른 작업을 병행해야 할 경우 활용합니다.
Working Directory
untracked : ignore되었거나 add된 적 없는 로컬 파일
tracked : add된 적 있고 변경내역이 있는 로컬 파일
Staging area
Working Directory에서 git add한 파일들이 위치하는 공간
커밋을 준비하는 단계
Repository
커밋된 파일이 올라가는 저장소
◾ 저장 장소에 따라 : Local Repo.와 Remote Repo.
◾ 저장소의 계층 구조에 따라 : Upstream Repo. 와 DownStream Repo.
fetch
Remote Repository의 변경된 커밋을 로컬로 가져오기
(merge, rebase x)
pull
fetch + (merge 또는 rebase)
Remote Repository의 변경된 커밋을 가져오는 동시에 병합
Fast forward
공통 가지에서 뻗어나온 두 브랜치 중 한쪽 브랜치에만 이후의 커밋이 있을 때, 커밋 없이 HEAD만 옮겨 병합하는 전략
❗ 브랜치를 합친 기록이 남지 않습니다
3-way merge
① 공통 조상, ② A 브랜치, ③ B 브랜치 셋을 비교해 자동 병합, 충돌 (Conflict) 여부를 판단하는 Git의 기본 Merge 전략
.git 폴더
: 삭제 시 git의 버전 관리 정보를 모두 잃게 됩니다.
.gitignore
: git에서 추적하지 않을 파일 & 디렉토리를 지정하기 위한 파일
◾ 가벼운 용량 유지 : 자동 빌드 & 다운로드되는 파일 제거
◾ 보안 : 비밀번호, Secret 키, API 키 등을 공개 저장소에 올리지 않기 위해
# .git 폴더 생성 명령
git init
# 현재 디렉토리와 Staging 영역의 상태 파악
git status
# .gitconfig 조회 / 수정
git config --global -e
# 코드 편집기 변경
## VSCode면 'code'
git config --global core.editor "vim"
git config --global core.editor "code --wait"
git config --global core.editor "subl --wait"
git config --global core.editor "atom --wait"
# 디렉토리의 미등록 파일 Staging 하기
## 1개 등록
git add 경로_및_파일명
## 전부 등록
git add .
# 수정된 파일만 Staging 하기
git add -u
# 변화를 하나하나 확인하며 Staging 하기
## 같은 파일 내에서도 add할 부분과 아닌 부분을 지정 가능
git add -p
# 파일 제거 후 staging까지 자동으로 수행
git rm 경로_및_파일명
# 파일명 수정 후 staging까지 자동으로 수행
git mv 기존_파일명 새_파일명
# 이미 add된 변경사항을 commit하지 않기 위해 빼는 명령어
## Staging Area에서 Working Directory로 되돌리기
git restore --staged 파일명
## --staged 옵션을 빼면 Working Directory에서도 제거
git restore
# 변경 사항 출력
## 내용이 길면 내용의 일부만 출력됩니다. (j: 아래로 스크롤, k: 위로 스크롤)
git diff
## 특정 커밋 비교
git diff 커밋1 커밋2
## 특정 브랜치 비교
git diff 브랜치1 브랜치2
git diff
옵션
옵션 | 설명 |
---|---|
--name-only | 파일명만 보기 |
--staged | 스테이지 확인 |
# 스테이징된 파일 untracked로 전환하기
git restore --staged pumas.yaml
# 작업 중인 변경사항을 Stash 공간에 치워두기
git stash
## 메시지 추가
git stash -m "메시지"
# Stash 공간의 변경사항들 가져오기
git stash pop
## 새 브랜치를 만들어 pop하기
git stash branch 브랜치명
# Stash 목록 확인
git stash list
# 모든 Stash 지우기
git stash clear
# 특정 stash 가져오기
git stash apply 스태시_번호
# 특정 stash 지우기
git stash drop 스태시_번호
# Staging된 파일의 변경 이력 등록 (commit)
## vim 에디터를 열어 커밋 메시지 입력
git commit
## 명령어와 함게 커밋 메시지 입력
git commit -m "커밋 메시지"
## git add + 메시지 입력 + 커밋을 동시에 수행
### (untracked 파일이 없을 때만 사용 가능)
git commit -am "커밋 메시지"
### vim 입력 : (시작) i, (종료) ESC
### vim 종료 : (일반 종료) q, (강제) :q!, (저장 후 종료) :wq
# 변경사항 확인 후 커밋
git commit -v
# 커밋 목록 확인
git log
옵션 | 특징 |
---|---|
--all | 모든 branch의 log 출력 |
--oneline | 각 commit의 log를 한 줄로 요약해 출력 |
--graph | branch tree 출력 --oneline : 가지 길이 짧게 출력 |
--decorate | 모든 레퍼런스 출력 ( 옵션 : no, (default) short, full ) |
-p | 변경 내역 함께 출력 |
-숫자 | 원하는 수의 커밋만 출력 |
--stat | 통계치 같이 출력 |
-S 검색어 | 커밋 변경 내용 텍스트 검색 |
--grep 검색어 | 커밋 메시지에 포함된 텍스트 검색 |
--since, --after | 날짜 이후의 커밋만 검색 |
--until, --before | 날짜 이전의 커밋만 검색 |
--author | 특정 저자의 커밋 검색 |
--committer | 특정 커미터의 커밋 검색 |
# 커밋 메시지 변경 및 변화 추가
## 커밋 후 깜빡한 코드를 뒤늦게 추가할 때 유용
git commit --amend
## 명령어 줄에서 메시지까지 같이 변경
git commit --amend -m "커밋 메시지"
## 메시지는 수정할 필요 없을 경우
git commit --amend --no-edit
과거 커밋 수정
# 커밋 수정 옵션 선택창 열기
git rebase -i 수정할 커밋보다 한 칸 전의 커밋 해시
## 커밋 수정 방법
### git rebase -i 커밋 해시 → e 수정할 커밋 → 파일 삭제 x인 reset --mixed (기본옵션)
git reset HEAD^ # git reset --mixed HEAD^ 와 동일
### 그 후 다시 커밋
옵션 | 설명 |
---|---|
pick (p) | 건드리지 않을 커밋으로 지정 |
edit (e) | 커밋 수정 |
drop (d) | 커밋 삭제 |
reword (r) | 커밋 메시지 변경 |
squash (s) | 이전 커밋에 병합 |
# 커밋 수정 후 변경사항 반영 (rebase 종료)
git rebase --continue
# 과거 커밋으로 돌아가기 : 이후의 커밋 모두 Rollback
git reset --hard 해당_커밋의_해시값
옵션 | 설명 |
---|---|
--soft | repository → staging area로 이동 |
--mixed | repository → working directory로 이동 |
--hard | 변경된 파일 내역 완전히 삭제 |
# 원하는 단계 수만큼 reset하기
git reset HEAD~단계_수
# 취소할 커밋 지정하기 : 이후 커밋된 내용은 보존
## vim 에디터가 실행되면 Revert 커밋 메시지 입력
git revert 해당_커밋의_해시값
## revert 중 충돌 발생 시 : 취소할 커밋이 이후 수정된 경우
### 충돌 파일을 git add 또는 git rm해 충돌을 해소합니다.
git add(또는 rm) 충돌_파일
git revert --continue
## 커밋 없이 revert
git revert --no-commit 해당_커밋의_해시값
# 커밋 트리는 그대로 두고 다른 커밋 시점으로 이동하기
## 과거 시점으로 이동
git checkout HEAD^ # ^ 개수만큼 과거로 이동
git checkout HEAD~2 # ~ 뒤의 숫자만큼 이동 (HEAD~2 = HEAD~~)
## 미래 시점으로 이동
git checkout -
# 특정 시점으로 이동
git checkout 커밋_해시_값
# branch 추가
git branch 브랜치명
# branch 목록 보기
git branch
# branch 변경
git switch 변경대상_브랜치
# branch 생성 + 변경 (동시 수행)
git switch -c 브랜치명
# branch명 변경
git branch -m 기존_브랜치명 새_브랜치명
# branch 삭제
git branch -d 브랜치명
# branch 강제 삭제
git branch -D 브랜치명
# branch의 원격 tracking 브랜치 변경
git branch --set-upstream-to=origin/develop develop
Cherry Picking
# 다른 브랜치에서 원하는 커밋만 복사해 가져오기
git cherry-pick 가져올_커밋_해시
# 커밋을 범위 선택해 복사해오기(A 다음 커밋부터 B까지)
git cherry-pick 커밋A..커밋B
# 커밋을 범위 선택해 복사해오기(A 포함해서 B까지)
git cherry-pick 커밋A^..커밋B
파생 브랜치 가져오기
git rebase --onto 베이스_브랜치 중간_브랜치 가져올_브랜치
브랜치를 하나의 커밋으로 묶어 가져오기
# root 브랜치의 변경사항들을 현재 브랜치로 Staging하기
git merge --squash root
## 이후 커밋해주면 끝
git commit -m "메시지"
# 현재 브랜치에 다른 브랜치 합치기 (두 branch의 이력이 모두 남는 Merge 방식)
git merge 가져올_브랜치명
## 병합된 branch를 삭제하려면 (삭제 해도 합쳐진 branch의 이력이 graph에 남아 있음)
git branch -d 가져온_브랜치명 # 합쳐진 branch 제거
# merge 전으로 되돌리기
git reset --hard
# 다른 브랜치에 현재 브랜치 합치기
## (현재 브랜치 이력이 그래프에서 사라지고 base 브랜치로 병합되는 Rebase 방식)
git rebase 새_base가_될_브랜치명
git merge 합친_뒤_사라진_브랜치명 # base 브랜치 최신화 작업 (필수)
git branch -d 가져온_브랜치명 # 합쳐진 branch 제거
Fast forward only
git merge --ff-only 합칠_브랜치명
3-way merge
# Fast forward가 일어나는 상황에서 3-way 방식으로 merge하려면?
git merge --no-ff 합칠_브랜치명
Squash merge
git merge --squash 합칠_브랜치명
# Merge Conflict 해결 후 commit
git merge 가져올_브랜치명
## Code Editor로 Conflict 해결 후
git add .
git commit
### vim 에디터가 열리면 :wq로 commit 메시지 저장 후 commit
git branch -d conflict-1
# Merge 중단
git merge --abort
# Rebase Conflict 해결 후 commit
git rebase 새_base가_될_브랜치명
## REBASE 1/충돌_커밋개수 : Rebase Conflict 발생 시 표시되는 상태 메시지
### Conflict 해결 후
git add .
git rebase --continue
#### vim 에디터가 열리면 :wq로 commit 메시지 저장 후 commit
##### 충돌나는 commit 개수만큼 위 과정 반복 후
git switch 새_base가_된_브랜치명
git merge 가져온_브랜치명
git branch -d conflict-2
# Rebase 중단
git rebase --abort
# 로컬 저장소에 원격 저장소 등록
git remote add origin 원격_저장소_주소
# 원격 저장소 내려받기
git clone 원격_저장소_주소
# 최초 : 원격 저장소에 commit 내역 올리기
## -u (--set-upstream) 옵션 : 현재 브랜치와 원격 브랜치를 연결
git push -u origin 원격_브랜치명
## 이후부터는
git push
원격 저장소의 변경된 커밋 정보만 가져오고 local branch에 합치지는 않습니다.
# remote의 변경된 커밋 정보를 local로 가져오기
git fetch
## 변경 사항 확인하기
git checkout origin/업데이트된_원격_저장소의_브랜치명
## 변경 사항 병합하기
git pull
# 공동 개발자가 원격 저장소에 push한 코드를 내려받기 (동기화)
git pull
# pull 할 것이 남아 있는데 push를 하면?
## 로컬에 없는 업데이트 사항이 있다며 git pull로 동기화하라는 경고 출력
### 방법 1 : Merge 방식의 pull
git pull --no-rebase
### 방법 2 : Rebase 방식의 pull (협업 시에도 pull할 때 rebase는 OK)
git pull --rebase
### 마무리로 원격 저장소에 결과 반영
git push
# 로컬 변경 사항 강제 push
git push ---force
# 로컬 & 원격 저장소에 새 브랜치 생성
git switch -c 새_브랜치명
git push -u origin 새_브랜치명
# 원격 브랜치 목록 보기
## -a (--all) 옵션 추가
git branch -a
# 원격의 새 브랜치 가져오기
git fetch
# 원격 브랜치를 로컬로 가져온 후 연결 (--trace 옵션)
git switch -t origin/가져올_원격_브랜치명
# 원격 브랜치 제거
git push 원격_저장소_이름 --delete 원격_브랜치명
# 원격 브랜치 가지치기 : 이름 변경 등 반영
git remote prune origin
# 마지막 커밋에 태그 추가 (lightweight)
git tag 태그명
# 마지막 커밋에 태그 추가 (annotated)
git tag -a 태그명
## 메시지까지 작성 (-a 생략 가능)
git tag 태그명 -m 메시지
#특정 커밋에 태그 추가
git tag 태그명 커밋 해시
# 태그 목록 조회
git tag
# 특정 태그 조회
git show 태그명
# 와일드카드를 이용한 태그 필터링
git tag -l 'v1.0.*'
# 태그 삭제
git tag -d 태그명
# 태그를 이용해 checkout 하기
git checkout 태그명
# 원격 Repo에 모든 태그 올리기
git push --tags
# 원격 Repo에 특정 태그 올리기
git push 원격_Repo_이름 태그명
# 원격 Repo의 특정 태그 삭제하기
git push --delete 원격_Repo_이름 태그명
git blame 파일명
# 특정 라인 작성자 확인
git blame -L 시작줄,(끝줄 또는 +줄수) 파일명
## ex1) git blame -L 10,7 test.txt
## ex2) git blame -L 10,+3 test.txt
🛠 VSCode : Git Lens 확장 플러그인을 쓰면 쉽게 확인 가능
# 이진 탐색 시작
git bisect start
## 에러가 false면?
git bisect good
## 에러가 true면?
git bisect bad
### 위 과정을 원인을 찾을 때까지 반복
## 오류 시점 확인 완료 후에는
git bisect reset
브랜치명 | 용도 |
---|---|
main | 릴리즈된 코드들이 버전 Tag가 붙어서 올라가는 브랜치 |
develop | 새 기능 추가, 버그 수정 등이 일어나는 개발 단계의 중심 브랜치 |
feature | 주요 기능들을 따로 떼어 개발 후 develop 브랜치에 병합 |
release | QA팀 등 테스터들에 의해 검증이 이루어지는 브랜치 검증이 끝나면 main 브랜치로 코드 병합 |
hotfix | main 브랜치에 릴리즈된 코드에서 버그가 발견되면 이를 고치기 위해 사용되는 브랜치 버그 수정 후 중간 과정 없이 빠르게 릴리즈된다는게 특징 |
컨벤션
타입: 제목 (50자 이내; 과거 시제 x)
본문 (72자 이내; 설명이 필요할 때만 작성)
하단 (이슈 Closing이 필요할 때 `Closes #이슈번호` 작성; 중요한 변경점 표시)
타입
타입 | 설명 |
---|---|
feat | User를 위한 새 기능 추가 (build script 기능 추가 x) |
chore | feature 외의 빌드, 패키지 매니저 등 보조 기능 수정 (툴 변경, 설정 변경, production 코드 외의 코드 수정) |
fix | User를 위한 버그 수정 (build script 버그 수정 x) |
docs | 문서 작성 / 수정 |
style | 코드 스타일 수정 (세미콜론, 코드 포맷 수정 등; production 코드 변화 x) |
refactor | production 코드 리팩토링 (변수명 변경 등) |
perf | 성능 개선 |
test | 테스트(production 코드 변화 x) |
설치
# cli 설치
npm i -g gitmoji-cli
# 적용할 프로젝트에서 gitmoji-cli로 아래 명령어 실행
gitmoji -i
커밋
git commit
# 이후 이모티콘 선택 → 커밋 메시지 작성
이모티콘 적용방법
[GIT] ⚡️ Gitmoji 사용법 (Gitmoji-cli)