Git ์นํธ์ํธ ํต์ฌ ๋ช
๋ น์ด ๋ฐ ์ค์ ๊ฐ์ด๋
์ปค๋ฐ, ๋ธ๋์น ๊ด๋ฆฌ, ์คํ์, ์๊ฒฉ ๋๊ธฐํ, cherry-pick(์ฒด๋ฆฌํฝ), reset/revert ๋๋๋ฆฌ๊ธฐ ๋ง๋ฒ ๋ช
๋ น์ด
## 1. ์ด๊ธฐํ ๋ฐ ์ ์ญ ์ค์
```bash
# ์ฌ์ฉ์ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ ์ ์ญ ์ค์
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
# ๊ธฐ๋ณธ ๋ธ๋์น๋ช
์ main์ผ๋ก ์ค์
git config --global init.defaultBranch main
# ํ์ฌ ์ ์ฉ๋ ์ ์ฒด ์ค์ ํ์ธ
git config --list --show-origin
```
์๋ก์ด ํ๊ฒฝ์์ Git์ ์ฒ์ ์์ํ ๋ ํ์๋ก ์ง์ ํด์ผ ํ๋ ๊ธฐ๋ณธ ์ค์ ์
๋๋ค.
## 2. ์ ์ฅ์ ์์ฑ ๋ฐ ๋ณต์
```bash
# ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์๋ก์ด Git ์ ์ฅ์ ์ด๊ธฐํ
git init
# ์๊ฒฉ ์ ์ฅ์ ๋ณต์ (ํน์ ๋ธ๋์น๋ง ๋ณต์ ์ -b ์ต์
)
git clone https://github.com/user/repo.git
git clone -b develop --single-branch https://github.com/user/repo.git
```
๊ธฐ์กด ํ๋ก์ ํธ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ ๊ท ์ ์ฅ์๋ฅผ ์์ํ ๋ ์ฌ์ฉํฉ๋๋ค.
## 3. ์คํ
์ด์ง ๋ฐ ์ปค๋ฐ
```bash
# ๋ณ๊ฒฝ๋ ๋ชจ๋ ํ์ผ ์คํ
์ด์ง
git add .
# ๋ณ๊ฒฝ ์ฌํญ ์ผ๋ถ๋ง ๋ํํ์ผ๋ก ์คํ
์ด์ง (๊ฐ๋ ฅ ์ถ์ฒ)
git add -p
# ๋ฉ์์ง์ ํจ๊ป ์ปค๋ฐ
git commit -m "feat: ์ฌ์ฉ์ ๋ก๊ทธ์ธ API ๊ตฌํ"
# ์ง์ ์ปค๋ฐ ๋ฉ์์ง ๋๋ ๋น ๋จ๋ฆฐ ํ์ผ ์์ (amend)
git commit --amend --no-edit
```
`git add -p`๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๊ฒฝ๋ ์ฒญํฌ(hunk) ๋จ์๋ก ์ฝ๋๋ฅผ ๊ฒํ ํ๋ฉฐ ์คํ
์ด์งํ ์ ์์ด ์ปค๋ฐ์ด ๊น๋ํด์ง๋๋ค.
## 4. ์ํ ๋ฐ ๋ณ๊ฒฝ ์ฌํญ ๋น๊ต
```bash
# ๊ฐ๊ฒฐํ ํ ์ค ์ํ ์์ฝ
git status -s
# ์์
๋๋ ํ ๋ฆฌ์ ๋ณ๊ฒฝ ์ฌํญ ๋น๊ต (์์ง ์คํ
์ด์ง ์ ๋ ๋ด์ฉ)
git diff
# ์คํ
์ด์ง๋ ๋ณ๊ฒฝ ์ฌํญ ๋น๊ต
git diff --staged
# ํน์ ์ปค๋ฐ ๊ฐ์ ๋ณ๊ฒฝ ๋ด์ญ ์์ฝ
git diff --stat HEAD~1 HEAD
```
## 5. ๋ธ๋์น ๊ด๋ฆฌ ๋ฐ ์ ํ
```bash
# ๋ธ๋์น ๋ชฉ๋ก ํ์ธ (์๊ฒฉ ํฌํจ)
git branch -a
# ์ ๋ธ๋์น ์์ฑ ๋ฐ ์ฆ์ ์ ํ (ํ๋์ ์ธ switch ๋ช
๋ น)
git switch -c feature/auth-flow
# ์ด์ ๋ธ๋์น๋ก ๋น ๋ฅด๊ฒ ๋๋์๊ฐ๊ธฐ
git switch -
# ๋ธ๋์น ์ญ์ (๋ณํฉ ์๋ฃ / ๊ฐ์ ์ญ์ )
git branch -d feature/old
git branch -D feature/discard
```
```mermaid
gitGraph
commit id: "init"
commit id: "v1.0"
branch feature
checkout feature
commit id: "feat-auth"
commit id: "feat-ui"
checkout main
merge feature id: "merge"
commit id: "deploy"
```
Astro์ ์ต์ Git์์๋ ๊ตฌ์ `checkout` ๋์ `switch`์ `restore`๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํ๊ณ ๊ถ์ฅ๋ฉ๋๋ค.
## 6. ์๊ฒฉ ์ ์ฅ์ ๋๊ธฐํ & ํธ์
```bash
# ์๊ฒฉ ์ ์ฅ์ ์ต์ ์ปค๋ฐ ๊ฐ์ ธ์ค๊ธฐ (๋ณํฉ ์์ด)
git fetch origin
# ์๊ฒฉ ๋ณ๊ฒฝ์ฌํญ์ ํ์ฌ ๋ธ๋์น ์๋ก ๊น๋ํ๊ฒ rebase ํ
git pull --rebase origin main
# ์ ๋ธ๋์น๋ฅผ ์๊ฒฉ์ ์
์คํธ๋ฆผ ์ถ์ ์ค์ ํ๋ฉฐ ํธ์
git push -u origin feature/auth-flow
# ๊ฐ์ ํธ์ ์ ๋ค๋ฅธ ์ฌ๋์ ์ปค๋ฐ ๋ฎ์ด์ฐ๊ธฐ ๋ฐฉ์ง (์์ ํ force-with-lease)
git push --force-with-lease
```
`--force-with-lease`๋ ์ผ๋ฐ `-f`๋ณด๋ค ํจ์ฌ ์์ ํ๊ฒ ์๊ฒฉ ๋ณ๊ฒฝ ์ถฉ๋์ ๊ฐ์งํด ์ค๋๋ค.
## 7. ์์ ์์
์ ์ฅ (Stash)
```bash
# ์ถ์ ๋์ง ์๋(untracked) ํ์ผ๊น์ง ํจ๊ป ์์ ๋ณด๊ด
git stash -u -m "๋ก๊ทธ์ธ ์์ ์์
"
# ์คํ์ ๋ณด๊ด ๋ชฉ๋ก ํ์ธ
git stash list
# ๊ฐ์ฅ ์ต๊ทผ ์คํ์ ๋ณต์ ํ ๋ชฉ๋ก์์ ์ญ์
git stash pop
# ํน์ ์คํ์ ๋ด์ฉ ํ์ธ (์ ์ฉํ์ง ์๊ณ ๋ด์ฉ๋ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ)
git stash show -p stash@{0}
```
## 8. ๋๋๋ฆฌ๊ธฐ & ์คํ ์ทจ์ (Undo & Reset)
```bash
# ํน์ ํ์ผ์ ์์ ์ ์ต์ ์ปค๋ฐ ์ํ๋ก ๋๋๋ฆฌ๊ธฐ
git restore <file-path>
# ์คํ
์ด์ง๋ ํ์ผ์ ์์
๋๋ ํ ๋ฆฌ๋ก ๋๋๋ฆฌ๊ธฐ (unstage)
git restore --staged <file-path>
# ์ต๊ทผ ์ปค๋ฐ์ ์ทจ์ํ๊ณ ๋ณ๊ฒฝ ํ์ผ์ ๊ทธ๋๋ก ๋จ๊ฒจ๋๊ธฐ (Soft Reset)
git reset --soft HEAD~1
# ํน์ ์ปค๋ฐ์ ๋ณ๊ฒฝ์ ๋ฐ๋๋ก ์ํํ๋ ์์ ํ ์ทจ์ ์ปค๋ฐ ์์ฑ
git revert <commit-hash>
```
## 9. ์๋ฆ๋ค์ด ๋ก๊ทธ ๊ทธ๋ํ ํ์ธ
```bash
# ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ํ๋์ ๋ณผ ์ ์๋ ํฐ๋ฏธ๋ ๊ทธ๋ํ
git log --graph --oneline --decorate --all
# ์ต๊ทผ 5๊ฐ์ ์ปค๋ฐ๊ณผ ๋ณ๊ฒฝ ํ์ผ ํต๊ณ ํ์
git log -n 5 --stat
```
ํฐ๋ฏธ๋์์ ๋ธ๋์น ๋ถ๊ธฐ์ ๋ณํฉ ํ๋ฆ์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ํ์
ํ๋ ๋ช
๋ น์ด์
๋๋ค.
## 10. ์ ์ฉํ ๋น์ ํ์ถ ๋ช
๋ น์ด
```bash
# ์ค์๋ก ์ญ์ ํ ์ปค๋ฐ/๋ธ๋์น ์ด๋ฆฌ๊ธฐ (๋ชจ๋ HEAD ์ด๋ ๊ธฐ๋ก ์กฐํ)
git reflog
# ๋ณํฉ ๋๋ ๋ฆฌ๋ฒ ์ด์ค ์ถฉ๋ ์ค ์ค๋จํ๊ณ ์ด์ ์ผ๋ก ๋ณต๊ตฌ
git merge --abort
git rebase --abort
# ํ์ผ๋ณ ๋๊ฐ ์ด๋ค ๋ผ์ธ์ ์ธ์ ์์ ํ๋์ง ํ์ธ
git blame -L 10,25 path/to/file.ts
```
`git reflog`๋ ์ค์๋ก ๋ธ๋์น๋ฅผ ๋ ๋ ธ๊ฑฐ๋ `reset --hard`๋ฅผ ํ์ ๋ ์ปค๋ฐ ํด์๋ฅผ ์ฐพ์ ๋์ด๋ฆด ์ ์๋ ๊ตฌ์ํฌ์์
๋๋ค.
## 11. ํน์ ์ปค๋ฐ ์ ๊ณจ๋ผ์ค๊ธฐ (Cherry-Pick)
```bash
# [1] ๋ค๋ฅธ ๋ธ๋์น์ ํน์ ์ปค๋ฐ ํ๋๋ง ํ์ฌ ๋ธ๋์น๋ก ๊ฐ์ ธ์ ์ปค๋ฐ
git cherry-pick <commit-hash>
# [2] ์ปค๋ฐ์ ์์ฑํ์ง ์๊ณ ๋ณ๊ฒฝ ๋ด์ฉ๋ง ์ํนํธ๋ฆฌ/์คํ
์ด์ง์ ๋ฐ์ (-n, --no-commit)
# ์ฌ๋ฌ ์ปค๋ฐ์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฒํ ํ๊ฑฐ๋ ํ๋๋ก ๋ฌถ์ด ์ปค๋ฐํ๊ณ ์ถ์ ๋ ๋งค์ฐ ์ ์ฉ
git cherry-pick -n <commit-hash>
# [3] ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ณ ์ปค๋ฐ ํ ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ (๊ณต๋ฐฑ ๊ตฌ๋ถ)
git cherry-pick <hash-A> <hash-B> <hash-C>
# [4] ํน์ ์ปค๋ฐ ๋ฒ์(A ๋ค์๋ถํฐ B๊น์ง) ์ฐ์ ๊ฐ์ ธ์ค๊ธฐ (A ๋ฏธํฌํจ)
git cherry-pick <commit-A>..<commit-B>
# [5] ํน์ ์ปค๋ฐ ๋ฒ์(A๋ถํฐ B๊น์ง) ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ (A ํฌํจ)
git cherry-pick <commit-A>^..<commit-B>
# [6] ์ฒด๋ฆฌํฝ ์ค ์ถฉ๋(Conflict) ๋ฐ์ ์ ํด๊ฒฐ ์ํฌํ๋ก์ฐ
# 1) ์ถฉ๋ ํ์ผ ์๋ ํด๊ฒฐ ํ ์คํ
์ด์ง
git add <resolved-file>
# 2) ์ฒด๋ฆฌํฝ ๊ณ์ ์งํ
git cherry-pick --continue
# 3) ํ์ฌ ์ปค๋ฐ์ ๊ฑด๋๋ฐ๊ณ ๋ค์ ์ฒด๋ฆฌํฝ ์งํ
git cherry-pick --skip
# 4) ์ฒด๋ฆฌํฝ์ ์ค๋จํ๊ณ ์ฒด๋ฆฌํฝ ์์ ์ ์ํ๋ก ์์ ๋ณต์
git cherry-pick --abort
# [7] ๋จธ์ง ์ปค๋ฐ(Merge Commit) ์ฒด๋ฆฌํฝ ์ ๋ถ๋ชจ ๋ธ๋์น ๋ฒํธ ์ง์ (-m)
# ๋จธ์ง ์ปค๋ฐ์ ๋ถ๋ชจ๊ฐ 2๊ฐ์ด๋ฏ๋ก ๊ธฐ์ค ๋ถ๋ชจ(๋ณดํต 1: ํ๊ฒ ๋ธ๋์น ๋ฐฉํฅ)๋ฅผ ๋ช
์ํด์ผ ํจ
git cherry-pick -m 1 <merge-commit-hash>
```
๋ค๋ฅธ ๋ธ๋์น์์ ์ด๋ฏธ ๊ตฌํ๋ ํซํฝ์ค(๋ฒ๊ทธ ์์ )๋ ํน์ ๊ธฐ๋ฅ ์ปค๋ฐ๋ง ๊ณจ๋ผ์ ํ์ฌ ๋ฆด๋ฆฌ์ฆ ๋ธ๋์น๋ก ์ด์ํ ๋ ๊ฐ์ฅ ์ ์ฉํ ๋ช
๋ น์ด์
๋๋ค.
์๊ฒฌ ๋ฐ ์ง๋ฌธ
0์์ง ๋ฑ๋ก๋ ์๊ฒฌ์ด ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๋๊ธ์ ๋จ๊ฒจ๋ณด์ธ์!
๋๊ธ ์์
๋๊ธ ์ญ์