Git & GitHub All-in-One

Mec.D's Blog·2022년 1월 27일
0

개념

VCS (Version Control System)

프로그램의 버전 관리를 위한 도구
ex: Git, SVN

작업한 코드를 과거 시점으로 되돌리거나
다른 버전의 코드에서 작업한 결과물을 하나로 합칠 때

Git과 같은 VCS 프로그램을 사용하면
빠르고 간편하게 작업을 수행할 수 있습니다.

Merge

branch를 병합합니다.

✅ branch가 사라지지 않고 그대로 남습니다.

Rebase

한 브랜치의 커밋을 다른 브랜치에 접붙입니다.

🧺 합쳐진 branch가 사라지면서 commit history가 깔끔하게 정리됩니다.

Snapshot

특정 시점의 파일, 폴더, 워크스페이스의 상태

Stash

Working Tree에서 작업하고 있던 내용을 별도의 저장소에 치워두는 것

✅ 작업이 덜 끝나 커밋할 수 없는데, 긴급히 다른 작업을 병행해야 할 경우 활용합니다.

Git의 3가지 작업 영역

Working Directory

untracked : ignore되었거나 add된 적 없는 로컬 파일
tracked : add된 적 있고 변경내역이 있는 로컬 파일

Staging area

Working Directory에서 git add한 파일들이 위치하는 공간
커밋을 준비하는 단계

Repository

커밋된 파일이 올라가는 저장소
◾ 저장 장소에 따라 : Local Repo.와 Remote Repo.
◾ 저장소의 계층 구조에 따라 : Upstream Repo. 와 DownStream Repo.

fetch와 pull의 차이

fetch

Remote Repository의 변경된 커밋을 로컬로 가져오기
(merge, rebase x)

pull

fetch + (merge 또는 rebase)
Remote Repository의 변경된 커밋을 가져오는 동시에 병합

Merge 전략

Fast forward

공통 가지에서 뻗어나온 두 브랜치 중 한쪽 브랜치에만 이후의 커밋이 있을 때, 커밋 없이 HEAD만 옮겨 병합하는 전략

❗ 브랜치를 합친 기록이 남지 않습니다

3-way merge

① 공통 조상, ② A 브랜치, ③ B 브랜치 셋을 비교해 자동 병합, 충돌 (Conflict) 여부를 판단하는 Git의 기본 Merge 전략

특징

  1. 스냅샷 방식
  2. 분산 버전 관리

파일 & 폴더

.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

# 작업 중인 변경사항을 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를 한 줄로 요약해 출력
--graphbranch 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

되돌리기 (reset & revert)

# 과거 커밋으로 돌아가기 : 이후의 커밋 모두 Rollback
git reset --hard 해당_커밋의_해시값
옵션설명
--softrepository → staging area로 이동
--mixedrepository → 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

# 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 "메시지"

합치기 (merge & rebase)

# 현재 브랜치에 다른 브랜치 합치기 (두 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 합칠_브랜치명

충돌 (Conflict)

# 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

원격 : fetch

원격 저장소의 변경된 커밋 정보만 가져오고 local branch에 합치지는 않습니다.

# remote의 변경된 커밋 정보를 local로 가져오기
git fetch
## 변경 사항 확인하기
git checkout origin/업데이트된_원격_저장소의_브랜치명
## 변경 사항 병합하기
git pull

원격 : 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

원격 : branch

# 로컬 & 원격 저장소에 새 브랜치 생성
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

Tag

# 마지막 커밋에 태그 추가 (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

Git-flow

브랜치의 종류

브랜치명용도
main릴리즈된 코드들이 버전 Tag가 붙어서 올라가는 브랜치
develop새 기능 추가, 버그 수정 등이 일어나는 개발 단계의 중심 브랜치
feature주요 기능들을 따로 떼어 개발 후 develop 브랜치에 병합
releaseQA팀 등 테스터들에 의해 검증이 이루어지는 브랜치
검증이 끝나면 main 브랜치로 코드 병합
hotfixmain 브랜치에 릴리즈된 코드에서 버그가 발견되면 이를 고치기 위해 사용되는 브랜치
버그 수정 후 중간 과정 없이 빠르게 릴리즈된다는게 특징

Commit

컨벤션

타입: 제목 (50자 이내; 과거 시제 x)

본문 (72자 이내; 설명이 필요할 때만 작성)

하단 (이슈 Closing이 필요할 때 `Closes #이슈번호` 작성; 중요한 변경점 표시)

타입

타입설명
featUser를 위한 새 기능 추가
(build script 기능 추가 x)
chorefeature 외의 빌드, 패키지 매니저 등 보조 기능 수정
(툴 변경, 설정 변경, production 코드 외의 코드 수정)
fixUser를 위한 버그 수정
(build script 버그 수정 x)
docs문서 작성 / 수정
style코드 스타일 수정
(세미콜론, 코드 포맷 수정 등; production 코드 변화 x)
refactorproduction 코드 리팩토링
(변수명 변경 등)
perf성능 개선
test테스트(production 코드 변화 x)

Gitmoji

설치

# cli 설치
npm i -g gitmoji-cli

# 적용할 프로젝트에서 gitmoji-cli로 아래 명령어 실행
gitmoji -i

커밋

git commit
# 이후 이모티콘 선택 → 커밋 메시지 작성

이모티콘 적용방법
[GIT] ⚡️ Gitmoji 사용법 (Gitmoji-cli)

profile
기술로 더 나은 미래를 디자인하는 개발자 MEC:D 입니다

0개의 댓글