# Git 노트

- 저자: chorr
- URL: https://8log.kr/git-note

---

## 설정

- `git config --global user.name "이름"` : 사용자 이름
- `git config --global user.email "이메일"` : 사용자 이메일
- `git config --global core.editor vim` : 기본 에디터
- `git config --global init.defaultBranch main` : 기본 브랜치명
- `git config --list` : 설정 확인

## 저장소

- `git init` : 새 저장소 생성
- `git clone [url]` : 원격 저장소 복제
- `git clone [url] [폴더명]` : 지정 폴더에 복제
- `git clone --depth 1 [url]` : 최신 커밋만 복제 (shallow)

## 기본 흐름

- `git status` : 상태 확인
- `git add [파일]` : 스테이징
- `git add .` : 전체 스테이징
- `git add -p` : 변경사항 선택적 스테이징 (hunk 단위)
- `git commit -m "메시지"` : 커밋
- `git commit --amend` : 마지막 커밋 수정
- `git commit --amend --no-edit` : 메시지 변경 없이 수정

## 브랜치

- `git branch` : 로컬 브랜치 목록
- `git branch -a` : 전체 브랜치 목록 (원격 포함)
- `git branch [이름]` : 브랜치 생성
- `git branch -d [이름]` : 브랜치 삭제 (병합된 경우)
- `git branch -D [이름]` : 브랜치 강제 삭제
- `git branch -m [새이름]` : 현재 브랜치 이름 변경
- `git switch [브랜치]` : 브랜치 전환
- `git switch -c [브랜치]` : 브랜치 생성 + 전환
- `git checkout [브랜치]` : 브랜치 전환 (레거시)
- `git checkout -b [브랜치]` : 브랜치 생성 + 전환 (레거시)

## 병합

- `git merge [브랜치]` : 현재 브랜치에 병합
- `git merge --no-ff [브랜치]` : fast-forward 없이 병합 커밋 생성
- `git merge --abort` : 병합 충돌 시 취소
- `git rebase [브랜치]` : 리베이스
- `git rebase -i HEAD~[n]` : 최근 n개 커밋 인터랙티브 리베이스
- `git rebase --abort` : 리베이스 취소
- `git cherry-pick [해시]` : 특정 커밋만 가져오기

## 원격

- `git remote -v` : 원격 저장소 목록
- `git remote add [이름] [url]` : 원격 저장소 추가
- `git remote remove [이름]` : 원격 저장소 제거
- `git fetch` : 원격 변경사항 가져오기 (병합 없이)
- `git fetch --prune` : 삭제된 원격 브랜치 정리
- `git pull` : fetch + merge
- `git pull --rebase` : fetch + rebase
- `git push` : 원격에 푸시
- `git push -u origin [브랜치]` : 업스트림 설정 + 푸시
- `git push --force-with-lease` : 안전한 강제 푸시

## 되돌리기

- `git restore [파일]` : 워킹 디렉토리 변경 취소
- `git restore --staged [파일]` : 스테이징 취소
- `git checkout -- [파일]` : 변경 취소 (레거시)
- `git reset HEAD [파일]` : 스테이징 취소 (레거시)
- `git reset --soft HEAD~1` : 커밋 취소 (변경사항 스테이징 유지)
- `git reset --mixed HEAD~1` : 커밋 취소 (변경사항 워킹 디렉토리 유지)
- `git reset --hard HEAD~1` : 커밋 + 변경사항 모두 삭제
- `git revert [해시]` : 커밋을 되돌리는 새 커밋 생성

## Stash

- `git stash` : 변경사항 임시 저장
- `git stash -m "메시지"` : 메시지와 함께 저장
- `git stash -u` : untracked 파일 포함
- `git stash list` : 스태시 목록
- `git stash pop` : 최근 스태시 적용 + 삭제
- `git stash apply` : 최근 스태시 적용 (삭제 안 함)
- `git stash drop` : 최근 스태시 삭제
- `git stash clear` : 전체 스태시 삭제

## 조회

- `git log` : 커밋 로그
- `git log --oneline` : 한 줄 로그
- `git log --oneline --graph --all` : 브랜치 그래프
- `git log -p [파일]` : 파일 변경 이력
- `git log --author="이름"` : 작성자별 필터
- `git log --since="2024-01-01"` : 날짜 필터
- `git diff` : 워킹 디렉토리 변경사항
- `git diff --staged` : 스테이징된 변경사항
- `git diff [브랜치A]..[브랜치B]` : 브랜치 간 비교
- `git show [해시]` : 특정 커밋 상세
- `git blame [파일]` : 줄별 마지막 수정자
- `git reflog` : HEAD 이동 이력 (복구용)

## 태그

- `git tag` : 태그 목록
- `git tag [이름]` : 경량 태그 생성
- `git tag -a [이름] -m "메시지"` : 주석 태그 생성
- `git tag -d [이름]` : 태그 삭제
- `git push origin [태그]` : 태그 푸시
- `git push origin --tags` : 전체 태그 푸시

## 유용한 조합

- `git log --oneline --graph --all --decorate` : 전체 히스토리 시각화
- `git diff --name-only` : 변경된 파일 이름만
- `git log -S "검색어"` : 코드 변경 내용 검색 (pickaxe)
- `git bisect start` → `git bisect bad` → `git bisect good [해시]` : 이진 탐색으로 버그 커밋 찾기
- `git clean -fd` : untracked 파일 + 폴더 삭제
- `git shortlog -sn` : 커밋 수 기준 기여자 랭킹

## .gitignore

```
# 패턴 예시
*.log           # 확장자
build/          # 디렉토리
!important.log  # 예외 (추적 유지)
**/temp         # 모든 경로의 temp
```

- `git rm --cached [파일]` : 이미 추적 중인 파일을 gitignore 적용
