๐Ÿ™ Git ๋ฐ GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
๊ณต๊ฐœ

2025๋…„ 8์›” 31์ผ

๋ฒ„์ „ ๊ด€๋ฆฌ, ๋ธŒ๋žœ์นญ, ์›๊ฒฉ ์ €์žฅ์†Œ, stash, ํƒœ๊ทธ ๋ฐ GitHub CLI๋ฅผ ์œ„ํ•œ ๊ธฐ๋ณธ ๋ฐ ๊ณ ๊ธ‰ Git ๋ช…๋ น์–ด.

๐Ÿ”น ๊ธฐ๋ณธ ๋ช…๋ น์–ด

๋ช…๋ น์–ด

์˜ˆ์‹œ

์„ค๋ช…

git add ํŒŒ์ผ์„ ์Šคํ…Œ์ด์ง• ์˜์—ญ์— ์ถ”๊ฐ€
git add file.txt

๋‹ค์Œ ์ปค๋ฐ‹์„ ์œ„ํ•ด ํŠน์ • ํŒŒ์ผ ์Šคํ…Œ์ด์ง•

git add .

ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ฐ ํ•˜์œ„์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ ์Šคํ…Œ์ด์ง•

git add -p

ํŒŒ์ผ์˜ ์ผ๋ถ€๋งŒ ์„ ํƒ์ ์œผ๋กœ ์Šคํ…Œ์ด์ง• (๋ถ€๋ถ„ ์ปค๋ฐ‹์— ์œ ์šฉ)

git clone ์ €์žฅ์†Œ๋ฅผ ์ƒˆ ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ํด๋ก 
git clone -b branch_name URL

๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜ ๋Œ€์‹  ์ง€์ •๋œ ๋ธŒ๋žœ์น˜๋งŒ ํด๋ก 

git clone --depth 1 URL

์ตœ์‹  ์ปค๋ฐ‹๋งŒ ํด๋ก ํ•˜์—ฌ ์–•์€ ๋ณต์‚ฌ (์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„ ์ ˆ์•ฝ)

git commit ์ €์žฅ์†Œ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ธฐ๋ก
git commit -m "Initial commit"

์—๋””ํ„ฐ๋ฅผ ์—ด์ง€ ์•Š๊ณ  ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ปค๋ฐ‹

git commit -a -m "Fix bugs"

์ˆ˜์ •๋œ ์ถ”์  ํŒŒ์ผ ๋ชจ๋‘ ์Šคํ…Œ์ด์ง• ํ›„ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ปค๋ฐ‹

git commit --amend

๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ์—…๋ฐ์ดํŠธ (๋ฉ”์‹œ์ง€ ๋ณ€๊ฒฝ ๋˜๋Š” ์ถ”๊ฐ€ ๋ณ€๊ฒฝ ํฌํ•จ)

git commit --fixup abc1234

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค ์ค‘ ์ž๋™ squash๋ฅผ ์œ„ํ•œ fixup ์ปค๋ฐ‹ ์ƒ์„ฑ

git config ์ €์žฅ์†Œ ๋˜๋Š” ๊ธ€๋กœ๋ฒŒ ์˜ต์…˜ ๊ฐ€์ ธ์˜ค๊ธฐ/์„ค์ •
git config --global user.name "Name"

๊ธ€๋กœ๋ฒŒ Git ์‚ฌ์šฉ์ž ์ด๋ฆ„ ์„ค์ •

git config --global user.email "email@example.com"

๊ธ€๋กœ๋ฒŒ Git ์ด๋ฉ”์ผ ์„ค์ •

git config --list

๋ชจ๋“  Git ์„ค์ • ๋‚˜์—ด (์ด๋ฆ„, ์ด๋ฉ”์ผ, ์—๋””ํ„ฐ ๋“ฑ)

git diff ์ปค๋ฐ‹ ๊ฐ„, ์ปค๋ฐ‹๊ณผ ์ž‘์—… ํŠธ๋ฆฌ ๊ฐ„์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ‘œ์‹œ
git diff HEAD

๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ์ดํ›„์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ‘œ์‹œ (์Šคํ…Œ์ด์ง•๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ)

git diff --staged

๋‹ค์Œ ์ปค๋ฐ‹์— ํฌํ•จ๋  ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ‘œ์‹œ

git diff --word-diff HEAD~1

๋‹จ์–ด ๋‹จ์œ„ ์ฐจ์ด ํ‘œ์‹œ

git grep ์ €์žฅ์†Œ ํŒŒ์ผ ๋‚ด๋ถ€ ๊ฒ€์ƒ‰
git grep "functionName"

ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์—์„œ functionName์ด ์–ธ๊ธ‰๋œ ๋ชจ๋“  ๋ถ€๋ถ„ ์ฐพ๊ธฐ

git grep -n "TODO"

TODO๊ฐ€ ํฌํ•จ๋œ ์ค„๊ณผ ์ค„ ๋ฒˆํ˜ธ ํ‘œ์‹œ (์ฝ”๋“œ ๋…ธํŠธ ์ฐพ๊ธฐ์— ์œ ์šฉ)

git grep -i "login"

login ๋‹จ์–ด๋ฅผ ๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œํ•˜๊ณ  ๊ฒ€์ƒ‰ (Login, LOGIN, login ๋“ฑ๊ณผ ์ผ์น˜)

git init ๋นˆ Git ์ €์žฅ์†Œ ์ƒ์„ฑ ๋˜๋Š” ๊ธฐ์กด ์ €์žฅ์†Œ ์žฌ์ดˆ๊ธฐํ™”
git init my-project

my-project ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ƒˆ ์ €์žฅ์†Œ ์ดˆ๊ธฐํ™”

git init --bare

bare ์ €์žฅ์†Œ ์ดˆ๊ธฐํ™”

git log ์ปค๋ฐ‹ ๋กœ๊ทธ ํ‘œ์‹œ
git log --oneline

์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํ•œ ์ค„ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ

git log --graph --all

๋ชจ๋“  ๋ธŒ๋žœ์น˜๋ฅผ ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„๋กœ ์‹œ๊ฐํ™”ํ•˜์—ฌ ํ‘œ์‹œ

git log -p --stat

์ปค๋ฐ‹์˜ ํŒจ์น˜ ๋ฐ ํŒŒ์ผ ๋ณ€๊ฒฝ ํ†ต๊ณ„ ํ‘œ์‹œ

git reset ์Šคํ…Œ์ด์ง•์—์„œ ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๋˜ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์œ ์ง€
git reset HEAD file.txt

์Šคํ…Œ์ด์ง•์—์„œ ํŒŒ์ผ ์ œ๊ฑฐ (ํŽธ์ง‘ ๋‚ด์šฉ์€ ์œ ์ง€)

git reset --hard HEAD~1

ํ•œ ์ปค๋ฐ‹ ์ด์ „์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ณ  ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ญ์ œ (๋ณต๊ตฌ ๋ถˆ๊ฐ€!)

git reset --soft HEAD~1

๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ์ทจ์†Œํ•˜๋˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์œ ์ง€ํ•˜์—ฌ ๋‹ค์‹œ ์ปค๋ฐ‹ ๊ฐ€๋Šฅ

git reset --mixed HEAD~1

์ปค๋ฐ‹ ์ทจ์†Œ ํ›„ ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์Šคํ…Œ์ด์ง•ํ•˜์ง€ ์•Š๊ณ  ์œ ์ง€

git show ๋‹ค์–‘ํ•œ ๊ฐ์ฒด ํ‘œ์‹œ
git show <commit_hash>

ํŠน์ • ์ปค๋ฐ‹์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ๊ณผ ๋ฉ”์‹œ์ง€ ํ‘œ์‹œ

git show HEAD~1

ํ˜„์žฌ ์ด์ „ ์ปค๋ฐ‹ ํ‘œ์‹œ

git show --stat

์ตœ์‹  ์ปค๋ฐ‹์˜ ํŒŒ์ผ ๋ณ€๊ฒฝ ์š”์•ฝ ํ‘œ์‹œ

git status ์ž‘์—… ํŠธ๋ฆฌ ์ƒํƒœ ํ‘œ์‹œ
git status -s

์งง์€ ํ˜•์‹์œผ๋กœ ์ƒํƒœ ํ‘œ์‹œ

git status -b

ํ˜„์žฌ ๋ธŒ๋žœ์น˜ ๋ฐ ํŒŒ์ผ ์ƒํƒœ ํ‘œ์‹œ

๐ŸŒฟ ๋ธŒ๋žœ์นญ ๋ฐ ๋ณ‘ํ•ฉ

๋ช…๋ น์–ด

์˜ˆ์‹œ

์„ค๋ช…

git branch ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ, ๋‚˜์—ด, ์‚ญ์ œ
git branch new-feature

new-feature๋ผ๋Š” ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ

git branch -d old-feature

old-feature๋ผ๋Š” ๋กœ์ปฌ ๋ธŒ๋žœ์น˜ ์‚ญ์ œ

git checkout ๋ธŒ๋žœ์น˜ ์ „ํ™˜ ๋˜๋Š” ๋‹ค๋ฅธ ์ปค๋ฐ‹์—์„œ ํŒŒ์ผ ๋ณต์›
git checkout main

main ๋ธŒ๋žœ์น˜๋กœ ์ „ํ™˜

git checkout -b new-branch

new-branch๋ผ๋Š” ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ๋ฐ ์ „ํ™˜

git switch ๋ธŒ๋žœ์น˜ ์ „ํ™˜ (checkout์˜ ๋‹จ์ˆœํ™”๋œ ๋Œ€์•ˆ)
git switch main

main ๋ธŒ๋žœ์น˜๋กœ ์ „ํ™˜

git switch -c feature-x

feature-x๋ผ๋Š” ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ๋ฐ ์ „ํ™˜

git switch new-feature

new-feature๋ผ๋Š” ๊ธฐ์กด ๋ธŒ๋žœ์น˜๋กœ ์ „ํ™˜

git merge ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ˜„์žฌ ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉ
git merge new-feature

new-feature ๋ธŒ๋žœ์น˜๋ฅผ ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ

git merge --no-ff new-feature

๋น ๋ฅธ ๋ณ‘ํ•ฉ์ด ๊ฐ€๋Šฅํ•ด๋„ ํ•ญ์ƒ ๋ณ‘ํ•ฉ ์ปค๋ฐ‹ ์ƒ์„ฑ

git merge --abort

์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ๋ณ‘ํ•ฉ ์ทจ์†Œ ๋ฐ ๋ณ€๊ฒฝ ๋˜๋Œ๋ฆฌ๊ธฐ

git rebase ์ปค๋ฐ‹์„ ์ƒˆ๋กœ์šด ๊ธฐ๋ฐ˜ ์ปค๋ฐ‹ ์œ„๋กœ ์˜ฎ๊ธฐ๊ฑฐ๋‚˜ ๋‹ค์‹œ ์ ์šฉ
git rebase main

๋ธŒ๋žœ์น˜ ์ปค๋ฐ‹์„ main ๋ธŒ๋žœ์น˜ ์œ„๋กœ ๋‹ค์‹œ ์ ์šฉ

git rebase -i HEAD~3

์ตœ๊ทผ 3๊ฐœ์˜ ์ปค๋ฐ‹์„ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•˜๊ฒŒ ํŽธ์ง‘

git rebase --abort

์ง„ํ–‰ ์ค‘์ธ ๋ฆฌ๋ฒ ์ด์Šค ์ค‘์ง€ ๋ฐ ๋˜๋Œ๋ฆฌ๊ธฐ

git rebase -i --autosquash HEAD~5

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์Šค ์ค‘ fixup/squash๋กœ ํ‘œ์‹œ๋œ ์ปค๋ฐ‹ ์ž๋™ ๋ณ‘ํ•ฉ

git cherry-pick ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์—์„œ ํŠน์ • ์ปค๋ฐ‹ ์ ์šฉ
git cherry-pick <hash>

ํŠน์ • ์ปค๋ฐ‹(ํ•ด์‹œ)์„ ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— ์ ์šฉ

git cherry-pick --continue

์ถฉ๋Œ ํ•ด๊ฒฐ ํ›„ cherry-pick ๊ณ„์† ์ง„ํ–‰

git cherry-pick A^..B

A(์ œ์™ธ)๋ถ€ํ„ฐ B(ํฌํ•จ)๊นŒ์ง€ ์ปค๋ฐ‹ ๋ฒ”์œ„ ์ ์šฉ

๐Ÿ“ก ์›๊ฒฉ ์ €์žฅ์†Œ

๋ช…๋ น์–ด

์˜ˆ์‹œ

์„ค๋ช…

git remote ์›๊ฒฉ ์ €์žฅ์†Œ(GitHub ๋“ฑ)์— ๋Œ€ํ•œ ๋งํฌ ๊ด€๋ฆฌ
git remote -v

์›๊ฒฉ ์ด๋ฆ„๊ณผ URL ํ‘œ์‹œ

git remote add origin URL

origin์ด๋ผ๋Š” ์›๊ฒฉ ์ €์žฅ์†Œ ์ถ”๊ฐ€

git pull ์›๊ฒฉ ๋ธŒ๋žœ์น˜์—์„œ ๋ณ€๊ฒฝ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์ž๋™ ๋ณ‘ํ•ฉ
git pull origin main

์›๊ฒฉ main ๋ธŒ๋žœ์น˜์—์„œ ๋ณ€๊ฒฝ ๊ฐ€์ ธ์™€ ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ

git pull --rebase origin main

๋ณ‘ํ•ฉ ๋Œ€์‹  ๋ฆฌ๋ฒ ์ด์Šค๋กœ ์›๊ฒฉ ๋ธŒ๋žœ์น˜ ์œ„์— ์ ์šฉ

git push ๋กœ์ปฌ ๋ณ€๊ฒฝ์„ ์›๊ฒฉ ์ €์žฅ์†Œ์— ์—…๋กœ๋“œ
git push origin main

๋กœ์ปฌ main ๋ธŒ๋žœ์น˜๋ฅผ ์›๊ฒฉ origin์— ํ‘ธ์‹œ

git fetch ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๊ณ  ์›๊ฒฉ์—์„œ ๋ณ€๊ฒฝ ๋‹ค์šด๋กœ๋“œ
git fetch origin

์›๊ฒฉ origin์˜ ๋ชจ๋“  ์—…๋ฐ์ดํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ (์ ์šฉํ•˜์ง€ ์•Š์Œ)

git fetch origin main

์›๊ฒฉ์—์„œ main ๋ธŒ๋žœ์น˜๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ

git fetch --all

๋ชจ๋“  ์›๊ฒฉ ์ €์žฅ์†Œ์—์„œ ์—…๋ฐ์ดํŠธ ๊ฐ€์ ธ์˜ค๊ธฐ

git fetch --prune

์‚ญ์ œ๋œ ๋ธŒ๋žœ์น˜ ์ •๋ฆฌ โ€” ์›๊ฒฉ์—์„œ ์‚ญ์ œ๋œ ๋ธŒ๋žœ์น˜ ๋กœ์ปฌ ์ฐธ์กฐ ์ œ๊ฑฐ

git fetch --dry-run

์‹ค์ œ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ๊ฐ€์ ธ์˜ฌ ํ•ญ๋ชฉ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

git fetch origin +main

์ถฉ๋Œ์„ ๋ฎ์–ด์“ฐ๋ฉฐ ๋กœ์ปฌ ์ถ”์  ๋ธŒ๋žœ์น˜(origin/main) ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ

๐Ÿ“ฆ Stash ๋ฐ ์ •๋ฆฌ

๋ช…๋ น์–ด

์˜ˆ์‹œ

์„ค๋ช…

git stash ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ž„์‹œ ์ €์žฅ (์ž‘์—… ์ค‘)
git stash

์ˆ˜์ • ๋ฐ ์Šคํ…Œ์ด์ง•๋œ ํŒŒ์ผ ์ €์žฅ ํ›„ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์œผ๋กœ ๋˜๋Œ๋ฆผ

git stash apply

์ตœ๊ทผ stash ์žฌ์ ์šฉ (stash๋Š” ์œ ์ง€๋จ)

git stash pop

์ตœ๊ทผ stash ์žฌ์ ์šฉ ๋ฐ ์ œ๊ฑฐ

git stash list

๋ชจ๋“  stash ๋ชฉ๋ก ํ‘œ์‹œ

git stash branch feature-fix

์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ตœ๊ทผ stash ์ ์šฉ

git clean Git์— ์ถ”์ ๋˜์ง€ ์•Š์€ ํŒŒ์ผ ์˜๊ตฌ ์‚ญ์ œ
git clean -f

ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ถ”์ ๋˜์ง€ ์•Š์€ ํŒŒ์ผ ์‚ญ์ œ

git clean -fd

์ถ”์ ๋˜์ง€ ์•Š์€ ํŒŒ์ผ๊ณผ ํด๋” ์‚ญ์ œ

git clean -n

์‚ญ์ œ๋  ํ•ญ๋ชฉ ๋ฏธ๋ฆฌ๋ณด๊ธฐ (์•ˆ์ „ dry run)

๐Ÿท๏ธ ํƒœ๊ทธ

๋ช…๋ น์–ด

์˜ˆ์‹œ

์„ค๋ช…

git tag ํŠน์ • ์‹œ์ ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ํƒœ๊ทธ ์ƒ์„ฑ, ๋‚˜์—ด, ์‚ญ์ œ (์˜ˆ: ๋ฆด๋ฆฌ์Šค)
git tag -a v1.0 -m "Version 1.0"

v1.0์ด๋ผ๋Š” ์ฃผ์„ ํƒœ๊ทธ ์ƒ์„ฑ (๋ฉ”์‹œ์ง€ ํฌํ•จ, ๋ฆด๋ฆฌ์Šค์— ์ ํ•ฉ)

git tag -d v1.0

v1.0์ด๋ผ๋Š” ๋กœ์ปฌ ํƒœ๊ทธ ์‚ญ์ œ (์›๊ฒฉ์—๋Š” ์˜ํ–ฅ ์—†์Œ)

git push ๋กœ์ปฌ์—์„œ ์›๊ฒฉ ์ €์žฅ์†Œ๋กœ ์ปค๋ฐ‹, ๋ธŒ๋žœ์น˜ ๋ฐ ํƒœ๊ทธ ์—…๋กœ๋“œ
git push origin --tags

๋ชจ๋“  ๋กœ์ปฌ ํƒœ๊ทธ๋ฅผ ์›๊ฒฉ์— ํ‘ธ์‹œ (์—ฌ๋Ÿฌ ๋ฒ„์ „ ํƒœ๊ทธ ํ›„ ์œ ์šฉ)

git push origin v1.0

ํŠน์ • ํƒœ๊ทธ (์˜ˆ: v1.0)๋ฅผ ์›๊ฒฉ ์ €์žฅ์†Œ์— ํ‘ธ์‹œ

git push origin :refs/tags/v1.0

์›๊ฒฉ ํƒœ๊ทธ v1.0 ์‚ญ์ œ (์ฝœ๋ก  ๋ฌธ๋ฒ• ์‚ฌ์šฉ)

๐Ÿ› ๏ธ ์ถฉ๋Œ ํ•ด๊ฒฐ

๋ช…๋ น์–ด

์˜ˆ์‹œ

์„ค๋ช…

git mergetool ๋จธ์ง€ ์ถฉ๋Œ ํ•ด๊ฒฐ์„ ๋•๋Š” ์‹œ๊ฐ์  ๋„๊ตฌ ์—ด๊ธฐ
git mergetool --tool=meld

ํŠน์ • ๋จธ์ง€ ๋„๊ตฌ (์˜ˆ: Meld) ์‚ฌ์šฉํ•ด ์ถฉ๋Œ ํ•ด๊ฒฐ

git rerere Git์ด ์ด์ „์— ํ•ด๊ฒฐํ•œ ๋จธ์ง€ ์ถฉ๋Œ์„ ๊ธฐ์–ตํ•˜๋„๋ก ํ•จ
git config --global rerere.enabled true

๊ณผ๊ฑฐ ์ถฉ๋Œ ํ•ด๊ฒฐ ์ž๋™ ์žฌ์‚ฌ์šฉ ํ™œ์„ฑํ™”

git rerere status

์ €์žฅ๋œ ์ถฉ๋Œ ํ•ด๊ฒฐ์ด ์žˆ๋Š” ํŒŒ์ผ ํ‘œ์‹œ

git rerere diff

Git์ด ์ €์žฅํ•œ ๋ฏธ๋ž˜ ์žฌ์‚ฌ์šฉ์šฉ ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ‘œ์‹œ

โš™๏ธ ๊ณ ๊ธ‰ ๋ช…๋ น์–ด

๋ช…๋ น์–ด

์˜ˆ์‹œ

์„ค๋ช…

git bisect ๋ฒ„๊ทธ๊ฐ€ ๋„์ž…๋œ ์ปค๋ฐ‹ ์ฐพ๊ธฐ ์œ„ํ•ด ์ด์ง„ ๊ฒ€์ƒ‰ ์‚ฌ์šฉ
git bisect start

๋ฒ„๊ทธ๊ฐ€ ์—†๋Š” ์ปค๋ฐ‹๊ณผ ์žˆ๋Š” ์ปค๋ฐ‹ ์‚ฌ์ด์—์„œ ์ด์ง„ ๊ฒ€์ƒ‰ ์‹œ์ž‘

git bisect bad

ํ˜„์žฌ ์ปค๋ฐ‹์„ โ€œbadโ€๋กœ ํ‘œ์‹œ (๋ฒ„๊ทธ ํฌํ•จ)

git bisect good <commit>

๋ฒ„๊ทธ๊ฐ€ ์—†๋˜ ์ปค๋ฐ‹์„ โ€œgoodโ€์œผ๋กœ ํ‘œ์‹œ

git blame ํŒŒ์ผ ๊ฐ ์ค„์„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •ํ•œ ์‚ฌ๋žŒ ํ‘œ์‹œ (๋ฆฌ๋น„์ „ ๋ฐ ์ž‘์„ฑ์ž ํฌํ•จ)
git blame file.txt

ํŒŒ์ผ์˜ ๊ฐ ์ค„์— ๋Œ€ํ•œ ์ž‘์„ฑ์ž์™€ ์ปค๋ฐ‹ ์ •๋ณด ํ‘œ์‹œ

git blame -L 10,20 file.txt

10~20๋ฒˆ์งธ ์ค„์— ๋Œ€ํ•œ blame ์ •๋ณด๋งŒ ํ‘œ์‹œ

git blame --show-email file.txt

๋ผ์ธ ๋ณ€๊ฒฝ๊ณผ ํ•จ๊ป˜ ์ž‘์„ฑ์ž์˜ ์ด๋ฉ”์ผ ํ‘œ์‹œ

git reflog ๋ธŒ๋žœ์น˜ ์ด๋™ ๋ฐ HEAD์˜ ์ฐธ์กฐ ๋กœ๊ทธ(reflog) ๋ณด๊ธฐ ๋ฐ ๊ด€๋ฆฌ
git reflog show main@{1.week.ago}

main ๋ธŒ๋žœ์น˜๊ฐ€ ์ผ์ฃผ์ผ ์ „ ๊ฐ€๋ฆฌ์ผฐ๋˜ ์œ„์น˜ ๋ณด๊ธฐ

git reflog expire --expire=30.days --dry-run

30์ผ ์ด์ƒ ๋œ reflog ํ•ญ๋ชฉ ์ค‘ ์ •๋ฆฌ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ (๋ณ€๊ฒฝ ์—†์Œ)

git reflog delete HEAD@{2}

ํŠน์ • reflog ํ•ญ๋ชฉ ์‚ญ์ œ (์ฃผ์˜: ๋ณต๊ตฌ์— ์˜ํ–ฅ ์ค„ ์ˆ˜ ์žˆ์Œ)

git submodule ์„œ๋ธŒ๋ชจ๋“ˆ ์ถ”๊ฐ€, ์ดˆ๊ธฐํ™”, ์—…๋ฐ์ดํŠธ, ๊ฒ€์‚ฌ (์ €์žฅ์†Œ ์•ˆ์˜ ์ €์žฅ์†Œ)
git submodule add URL path

์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ์„œ๋ธŒ๋ชจ๋“ˆ๋กœ ํŠน์ • ๊ฒฝ๋กœ์— ์ถ”๊ฐ€

git submodule update --init

์ €์žฅ์†Œ์— ๋‚˜์—ด๋œ ๋ชจ๋“  ์„œ๋ธŒ๋ชจ๋“ˆ ์ดˆ๊ธฐํ™” ๋ฐ ๋‹ค์šด๋กœ๋“œ

git submodule foreach git pull

๊ฐ ์„œ๋ธŒ๋ชจ๋“ˆ ์•ˆ์—์„œ git pull ์‹คํ–‰ํ•˜์—ฌ ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์—…๋ฐ์ดํŠธ

git submodule sync --recursive

.gitmodules ํŒŒ์ผ ๋ณ€๊ฒฝ ํ›„ ์„œ๋ธŒ๋ชจ๋“ˆ URL ๋™๊ธฐํ™”

git submodule update --remote --merge

์„œ๋ธŒ๋ชจ๋“ˆ์„ ์›๊ฒฉ ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์—…๋ฐ์ดํŠธ

git archive ํŠน์ • ์ปค๋ฐ‹ ๋˜๋Š” ๋ธŒ๋žœ์น˜์—์„œ ํŒŒ์ผ์„ ์•„์นด์ด๋ธŒ(zip, tar ๋“ฑ) ์ƒ์„ฑ
git archive --format=zip HEAD > archive.zip

HEAD์˜ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ZIP ์•„์นด์ด๋ธŒ๋กœ ์ƒ์„ฑ

git archive -o release.tar.gz HEAD

ํ˜„์žฌ HEAD์—์„œ .tar.gz ์••์ถ• ์•„์นด์ด๋ธŒ ์ƒ์„ฑ

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋ฅผ .tar.gz ์•„์นด์ด๋ธŒ๋กœ ์ƒ์„ฑํ•˜๋˜ ๋ชจ๋“  ํŒŒ์ผ์„ project/ ํด๋” ์•ˆ์— ๋ฐฐ์น˜

git gc ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ •๋ฆฌ ๋ฐ ์ €์žฅ์†Œ ์„ฑ๋Šฅ ์ตœ์ ํ™”
git gc --aggressive

์ฒ ์ €ํ•œ ์ •๋ฆฌ ๋ฐ ์ตœ์ ํ™” ์ˆ˜ํ–‰ (๋А๋ฆฌ์ง€๋งŒ ํšจ๊ณผ์ )

git gc --prune=now

์ฆ‰์‹œ ๋ชจ๋“  ์ ‘๊ทผ ๋ถˆ๊ฐ€ ๊ฐ์ฒด ์ œ๊ฑฐ (์ฃผ์˜ ํ•„์š”)

git shortlog ์ž‘์„ฑ์ž์™€ ์ปค๋ฐ‹ ์š”์•ฝ ๋น ๋ฅด๊ฒŒ ๋ณด๊ธฐ
git shortlog -e

์ž‘์„ฑ์ž ๋ชฉ๋ก๊ณผ ์ด๋ฉ”์ผ ํ‘œ์‹œ (๋ˆ„๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ธฐ์—ฌํ–ˆ๋Š”์ง€ ๋ถ„์„์šฉ)

git shortlog -s -n

์ž‘์„ฑ์ž๋ณ„ ์ปค๋ฐ‹ ์ˆ˜ ํ‘œ์‹œ, ์ปค๋ฐ‹ ์ˆ˜ ๊ธฐ์ค€ ์ •๋ ฌ

git shortlog -sne

์ƒ์„ธ ํ™œ๋™ ์ถ”์ ์šฉ ์ด๋ฆ„๊ณผ ์ด๋ฉ”์ผ ํฌํ•จํ•˜์—ฌ ํ‘œ์‹œ

git revert ๊ธฐ๋ก์„ ๋‹ค์‹œ ์“ฐ์ง€ ์•Š๊ณ  ์ด์ „ ์ปค๋ฐ‹์„ ๋˜๋Œ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ์ปค๋ฐ‹ ์ƒ์„ฑ
git revert HEAD

๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์„ ๋˜๋Œ๋ฆฌ๋Š” ์ƒˆ ์ปค๋ฐ‹ ์ƒ์„ฑ

git revert <commit_hash>

ํŠน์ • ์ปค๋ฐ‹ ํ•ด์‹œ๋ฅผ ๋˜๋Œ๋ฆฌ๋Š” ์ƒˆ ์ปค๋ฐ‹ ์ƒ์„ฑ (์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•)

๐Ÿ™ GitHub CLI

gh๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ„ฐ๋ฏธ๋„์—์„œ GitHub๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…๋ น์–ด

์˜ˆ์‹œ

์„ค๋ช…

gh auth login GitHub ํ˜ธ์ŠคํŠธ์— ์ธ์ฆํ•˜์—ฌ CLI ๋ช…๋ น์–ด๊ฐ€ ๊ณ„์ •๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
gh auth login --with-token < mytoken.txt

ํŒŒ์ผ(mytoken.txt)์— ์ €์žฅ๋œ ๊ฐœ์ธ ์•ก์„ธ์Šค ํ† ํฐ์œผ๋กœ ์ธ์ฆ

gh auth login --hostname enterprise.internal

GitHub Enterprise ์„œ๋ฒ„์— ์ธ์ฆ (github.com ์•„๋‹˜)

gh repo clone GitHub ์ €์žฅ์†Œ๋ฅผ ๋กœ์ปฌ ๋จธ์‹ ์œผ๋กœ ํด๋ก 
gh repo clone user/repo

user๊ฐ€ ์†Œ์œ ํ•œ repo ์ €์žฅ์†Œ๋ฅผ repo๋ผ๋Š” ํด๋”๋กœ ํด๋ก 

gh repo clone cli/cli -- --depth=1

์ตœ์‹  ์ปค๋ฐ‹๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ๋น ๋ฅด๊ณ  ์ž‘์€ ํด๋ก  ์ˆ˜ํ–‰

gh repo clone cli/cli workspace/cli

workspace/cli๋ผ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ํด๋”์— ์ €์žฅ์†Œ ํด๋ก 

gh issue list GitHub ์ €์žฅ์†Œ์˜ ์ด์Šˆ ๋‚˜์—ด (ํ•„ํ„ฐ๋ง ์˜ต์…˜ ํฌํ•จ)
gh issue list --assignee "@me"

์ž์‹ ์—๊ฒŒ ํ• ๋‹น๋œ ์ด์Šˆ ๋‚˜์—ด

gh issue list --state all

์ƒํƒœ์™€ ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ์ด์Šˆ ๋‚˜์—ด (open, closed)

gh issue list --search "error no:assignee sort:created-asc"

โ€œerrorโ€์— ์ผ์น˜ํ•˜๊ณ , ๋ฏธํ• ๋‹น์ด๋ฉฐ, ์ƒ์„ฑ ๋‚ ์งœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ด์Šˆ ๋‚˜์—ด

gh pr create CLI๋ฅผ ํ†ตํ•ด GitHub์— Pull Request ์ƒ์„ฑ
gh pr create --title "..."

์ง€์ •๋œ ์ œ๋ชฉ์œผ๋กœ Pull Request ์ƒ์„ฑ

gh pr create --project "Roadmap"

โ€œRoadmapโ€์ด๋ผ๋Š” GitHub ํ”„๋กœ์ ํŠธ์— Pull Request ์—ฐ๊ฒฐ

gh pr create --base develop --head monalisa:feature

fork monalisa์˜ feature ๋ธŒ๋žœ์น˜์—์„œ develop ๋ธŒ๋žœ์น˜๋กœ PR ์ƒ์„ฑ

gh repo create CLI์—์„œ ์ƒˆ GitHub ์ €์žฅ์†Œ ์ƒ์„ฑ
gh repo create my-project

GitHub์— my-project๋ผ๋Š” ์ƒˆ ์ €์žฅ์†Œ ์ƒ์„ฑ (๋Œ€ํ™”ํ˜• ํ”„๋กฌํ”„ํŠธ ์ง„ํ–‰)

gh repo create my-project --public --clone

๊ณต๊ฐœ ์ €์žฅ์†Œ ์ƒ์„ฑ ํ›„ ๋กœ์ปฌ์— ํด๋ก 

gh repo create my-project --private --source=. --remote=upstream

ํ˜„์žฌ ํด๋”์—์„œ ๋น„๊ณต๊ฐœ ์›๊ฒฉ ์ €์žฅ์†Œ ์ƒ์„ฑ ํ›„ upstream์ด๋ผ๋Š” ์›๊ฒฉ ์ถ”๊ฐ€

๐Ÿ’ก Git ๋ณ„์นญ (์œ ์šฉํ•œ ๋‹จ์ถ•ํ‚ค)

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Git ๋ช…๋ น์–ด๋ฅผ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŽธ๋ฆฌํ•œ ๋ณ„์นญ์„ ์„ค์ •ํ•˜์„ธ์š”:

git config --global alias.br branch                                       # ๋‹จ์ถ•ํ‚ค: git branch
git config --global alias.ci commit                                       # ๋‹จ์ถ•ํ‚ค: git commit
git config --global alias.co checkout                                     # ๋‹จ์ถ•ํ‚ค: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # ๋ณด๊ธฐ ์ข‹์€ ํžˆ์Šคํ† ๋ฆฌ ๊ทธ๋ž˜ํ”„
git config --global alias.last "log -1 HEAD"                              # ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ํ‘œ์‹œ
git config --global alias.st status                                       # ๋‹จ์ถ•ํ‚ค: git status

๐Ÿš€ ์ „๋ฌธ๊ฐ€์šฉ ๊ณ ๊ธ‰ Git ๋ช…๋ น์–ด

๋ช…๋ น์–ด

์˜ˆ์‹œ

์„ค๋ช…

git filter-repo Git ๊ธฐ๋ก์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜์—ฌ ํŒŒ์ผ, ์ž‘์„ฑ์ž, ๊ฒฝ๋กœ๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ๋น ๋ฅธ ๋„๊ตฌ. git filter-branch๋ฅผ ๋Œ€์ฒดํ•˜๋ฉฐ ์†๋„์™€ ์•ˆ์ „์„ฑ์ด ํ–ฅ์ƒ๋จ
git filter-repo --path secret.txt --invert-paths

git filter-branch์˜ ์„ฑ๋Šฅ ๋ฌธ์ œ ์—†์ด ๋ฏผ๊ฐํ•œ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ œ๊ฑฐ. ์ฃผ์˜ํ•˜์—ฌ ์‚ฌ์šฉ

git filter-repo --replace-text replacements.txt

์ „์ฒด ๊ธฐ๋ก์—์„œ ๋ฌธ์ž์—ด ๋˜๋Š” ํŒจํ„ด์„ ์ผ๊ด„ ๊ต์ฒด (์˜ˆ: ์ž๊ฒฉ ์ฆ๋ช… ์ œ๊ฑฐ)

git filter-repo --subdirectory-filter src

ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ธฐ๋ก์„ ์ƒˆ๋กœ์šด ์ €์žฅ์†Œ๋กœ ์ถ”์ถœํ•˜๋ฉด์„œ ์ปค๋ฐ‹ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ณด์กด

git worktree ๋‹จ์ผ ์ €์žฅ์†Œ์— ์—ฐ๊ฒฐ๋œ ์—ฌ๋Ÿฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์—์„œ ๋™์‹œ์— ์ž‘์—… ๊ฐ€๋Šฅ (์ถ”๊ฐ€ ํด๋ก  ๋ถˆํ•„์š”)
git worktree add ../feature feature-branch

๊ฐ™์€ ์ €์žฅ์†Œ์— ์ถ”๊ฐ€ ์ž‘์—… ํŠธ๋ฆฌ ์ƒ์„ฑ โ†’ ๋ณ‘๋ ฌ ๋ธŒ๋žœ์น˜ ์ฒดํฌ์•„์›ƒ ๊ฐ€๋Šฅ

git worktree list

ํ™œ์„ฑ worktree ๋ชฉ๋ก, ๊ฒฝ๋กœ, ์—ฐ๊ฒฐ๋œ ๋ธŒ๋žœ์น˜ ํ‘œ์‹œ

git worktree remove ../feature

๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ worktree ์ œ๊ฑฐ (์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์ „ ์ •๋ฆฌ)

git replace ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ์ž„์‹œ ์ฐธ์กฐ ์ƒ์„ฑ โ†’ ๋กœ์ปฌ ๊ธฐ๋ก์„ ํŒŒ๊ดดํ•˜์ง€ ์•Š๊ณ  ์กฐ์ž‘ ๋ฐ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
git replace <old_commit> <new_commit>

๋กœ์ปฌ ์ €์žฅ์†Œ์—์„œ ํ•œ ์ปค๋ฐ‹์„ ๋‹ค๋ฅธ ์ปค๋ฐ‹์œผ๋กœ ์ž„์‹œ ๊ต์ฒด (ํ…Œ์ŠคํŠธ/ํŒจ์น˜์— ์œ ์šฉ)

git replace --list

ํ™œ์„ฑ ๋Œ€์ฒด ์ฐธ์กฐ ํ‘œ์‹œ

git replace -d <replace_ref>

ํŠน์ • ๋Œ€์ฒด ์ฐธ์กฐ ์‚ญ์ œํ•˜์—ฌ ์›๋ž˜ ๋™์ž‘ ๋ณต์›

git stash ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์„ ์Šคํƒ์— ์ž„์‹œ ์ €์žฅํ•˜์—ฌ ๋ฏธ์™„์„ฑ ์ž‘์—…์„ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ ๋„ ์ปจํ…์ŠคํŠธ ์ „ํ™˜ ๊ฐ€๋Šฅ
git stash push -p

๋ณ€๊ฒฝ์‚ฌํ•ญ ์ผ๋ถ€๋งŒ ์„ ํƒ์ ์œผ๋กœ stash โ†’ ์„ธ๋ฐ€ํ•œ ์ œ์–ด ๊ฐ€๋Šฅ

git stash push -m "WIP selective stash"

์‹๋ณ„์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ stash ์ƒ์„ฑ

git stash apply stash@{2}

stash ๋ชฉ๋ก์—์„œ ํŠน์ • stash ์ ์šฉ (์‚ญ์ œํ•˜์ง€ ์•Š์Œ)

git rebase ์ปค๋ฐ‹์„ ๋‹ค๋ฅธ ๊ธฐ๋ฐ˜ ์œ„๋กœ ๋‹ค์‹œ ์ ์šฉ โ†’ ๋” ๊น”๋”ํ•˜๊ณ  ์„ ํ˜•์ ์ธ ๊ธฐ๋ก ์œ ์ง€ ๋ฐ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํŽธ์ง‘ ๊ฐ€๋Šฅ
git rebase --interactive --autosquash

fixup/squash ํ‘œ์‹œ๋œ ์ปค๋ฐ‹์„ ์ž๋™์œผ๋กœ ์žฌ์ •๋ ฌยท๋ณ‘ํ•ฉํ•˜๋Š” ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ rebase ์‹œ์ž‘

git rebase -i --autosquash HEAD~10

push ์ „์— ์ปค๋ฐ‹ ์ด๋ ฅ์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด fixup/squash ์ž๋™ ๋ณ‘ํ•ฉ

git commit --fixup <commit>

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ rebase์—์„œ ์ž๋™ squash๋  fixup ์ปค๋ฐ‹ ์ƒ์„ฑ

git commit --squash <commit>

๋ฆฌ๋ฒ ์ด์Šค ์‹œ ํŠน์ • ์ปค๋ฐ‹๊ณผ ๋ณ‘ํ•ฉ๋  squash ์ปค๋ฐ‹ ์ƒ์„ฑ

git bisect ์ด์ง„ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ๋ฒ„๊ทธ๋ฅผ ๋„์ž…ํ•œ ์ปค๋ฐ‹์„ ํšจ์œจ์ ์œผ๋กœ ์‹๋ณ„. ์ปค๋ฐ‹๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜์—ฌ ๋ฌธ์ œ narrowing
git bisect run

๊ฐ ์ปค๋ฐ‹์—์„œ ์ง€์ •๋œ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด bisect ์ž๋™ํ™” โ†’ ์ˆ˜๋™ ๊ฐœ์ž… ์—†์ด ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ ์ปค๋ฐ‹ ์ฐพ๊ธฐ

git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh

์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋กœ bisect๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฒ„๊ทธ ์‹๋ณ„ ์†๋„ ํ–ฅ์ƒ

git bisect visualize

๊ทธ๋ž˜ํ”ฝ ๋„๊ตฌ๋กœ bisect ๊ณผ์ • ์‹œ๊ฐํ™”

git bisect reset

bisect ๋ชจ๋“œ ์ข…๋ฃŒ ํ›„ ์›๋ž˜ HEAD๋กœ ๋ณต์›

git commit amend, sign, fixup, ๋ฉ”์‹œ์ง€ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ๊ณ ํ’ˆ์งˆ ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก ์œ ์ง€
git commit --gpg-sign

GPG ํ‚ค๋กœ ์„œ๋ช…๋œ ์ปค๋ฐ‹ ์ƒ์„ฑ โ†’ ์ปค๋ฐ‹์˜ ์ง„์œ„์„ฑ๊ณผ ์ž‘์„ฑ์ž ๊ฒ€์ฆ ๊ฐ€๋Šฅ

git commit -S -m "Signed commit"

GPG ํ‚ค๋กœ ์ปค๋ฐ‹ ์•”ํ˜ธํ™” ์„œ๋ช… โ†’ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์ž‘์„ฑ์ž ์‹ ๋ขฐ์„ฑ ๋ณด์žฅ

git config --global user.signingkey <key_id>

์ปค๋ฐ‹ ์„œ๋ช…์— ์‚ฌ์šฉํ•  GPG ํ‚ค๋ฅผ ์ „์—ญ์œผ๋กœ ์„ค์ •

git log --show-signature

์ปค๋ฐ‹์˜ GPG ์„œ๋ช… ์ •๋ณด ํ™•์ธ ๋ฐ ํ‘œ์‹œ

git reflog HEAD์™€ ๋ธŒ๋žœ์น˜ ์—…๋ฐ์ดํŠธ ๊ธฐ๋ก(reflog) ์œ ์ง€ โ†’ ์žƒ์–ด๋ฒ„๋ฆฐ ์ปค๋ฐ‹ ๋ณต๊ตฌ ๋ฐ ๋กœ์ปฌ ๊ธฐ๋ก ์ถ”์ ์— ํ•„์ˆ˜
git reset --hard HEAD@{3}

reflog์—์„œ ์ด์ „ ์ƒํƒœ๋กœ ๋ธŒ๋žœ์น˜ ๋ฆฌ์…‹ํ•˜์—ฌ ๋ณ€๊ฒฝ ๋ณต๊ตฌ ๋˜๋Š” ๋˜๋Œ๋ฆฌ๊ธฐ

git reflog expire --expire=now --all

๋ชจ๋“  reflog ํ•ญ๋ชฉ์„ ์ฆ‰์‹œ ๋งŒ๋ฃŒ์‹œ์ผœ ๊ธฐ๋ก ์ •๋ฆฌ (์ฃผ์˜ ํ•„์š”)

๐Ÿงฐ ์ „๋ฌธ๊ฐ€ ์›Œํฌํ”Œ๋กœ์šฐ ํŒ ๋ฐ ์ž๋™ํ™”

์ฃผ์ œ

๋ช…๋ น์–ด / ์˜ˆ์‹œ

์„ค๋ช… ๋ฐ ์ „๋ฌธ๊ฐ€ ํŒ

๊ฐ•๋ ฅํ•œ ์ €์žฅ์†Œ ์ •๋ฆฌ

git gc --aggressive --prune=now

๊นŠ์€ garbage collection ์ˆ˜ํ–‰ ๋ฐ ์ ‘๊ทผ ๋ถˆ๊ฐ€ ๊ฐ์ฒด ์ฆ‰์‹œ ์ œ๊ฑฐ โ†’ ์ €์žฅ์†Œ ์ตœ์ ํ™”. ์œ ์ง€๋ณด์ˆ˜ ์‹œ ์‚ฌ์šฉ

๋ณ‘๋ ฌ ๋ธŒ๋žœ์น˜ Worktree

git worktree add ../feature-branch feature

์—ฌ๋Ÿฌ ์ž‘์—… ํŠธ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜์—ฌ ๋™์‹œ์— ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ, ํด๋ก  ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐฉ์ง€

๊น”๋”ํ•˜๊ณ  ์„ ํ˜•์ ์ธ ๊ธฐ๋ก

git rebase -i --autosquash

push ์ „์— autosquash ์˜ต์…˜์œผ๋กœ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ rebase ์‹คํ–‰ โ†’ ๊ธฐ๋ก์„ ๊น”๋”ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์œ ์ง€

๋ณด์•ˆ ์ปค๋ฐ‹

git commit -S

GPG๋กœ ์ปค๋ฐ‹ ์„œ๋ช… โ†’ ๊ณต์œ  ์ €์žฅ์†Œ์—์„œ ์‹ ๋ขฐ์„ฑ ํ–ฅ์ƒ (์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ ํ•„์ˆ˜)

์ž๋™ํ™”๋œ Bisect

git bisect run ./test-script.sh

bisect ๊ณผ์ •์—์„œ ๊ฐ ์ปค๋ฐ‹๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด ๋ฒ„๊ทธ ํ—ŒํŒ… ์ž๋™ํ™”

์ถฉ๋Œ ํ•ด๊ฒฐ ์บ์‹œ

git config --global rerere.enabled true

์ถฉ๋Œ ํ•ด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜์—ฌ ๋ฐ˜๋ณต๋˜๋Š” merge/rebase ์ถฉ๋Œ ์ฒ˜๋ฆฌ ์†๋„ ํ–ฅ์ƒ

๊ณต์œ  ๋ณ„์นญ ๋ฐ Hooks

๊ณต์œ  ์ €์žฅ์†Œ ๋˜๋Š” CI ํŒŒ์ดํ”„๋ผ์ธ์— ๊ณตํ†ต Git ๋ณ„์นญ ๋ฐ ์ปค๋ฐ‹ hook ์ €์žฅ โ†’ ํŒ€ ํ‘œ์ค€ํ™” ๋ฐ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ

์ถ”๊ฐ€ ์ž๋ฃŒ

๐Ÿง  ํŒ

๋ชจ๋“  ๊ฒƒ์„ ์™ธ์šฐ๋ ค ํ•˜์ง€ ๋งˆ์„ธ์š”. --help๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ํƒ์ƒ‰ํ•˜๋ฉฐ, ์ •๊ธฐ์ ์œผ๋กœ ์—ฐ์Šตํ•˜์„ธ์š”:

git help <command>
git status

๐ŸŒ ์œ ์šฉํ•œ ๋งํฌ

๐Ÿ“˜ Git ๊ณต์‹ ๋ฌธ์„œ โ€” ๋ชจ๋“  Git ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์ƒ์„ธ ๋งค๋‰ด์–ผ:
https://git-scm.com/docs

๐Ÿ“™ Learn Git Branching โ€” ๋ธŒ๋žœ์น˜ ๊ฐœ๋…์„ ์ตํžˆ๊ธฐ ์œ„ํ•œ ๋Œ€ํ™”ํ˜• ์‹œ๊ฐ ํŠœํ† ๋ฆฌ์–ผ:
https://learngitbranching.js.org

๐Ÿ“• Pro Git ์ฑ… (๋ฌด๋ฃŒ, Scott Chacon & Ben Straub ์ €):
https://git-scm.com/book

๐Ÿ“— Git ์น˜ํŠธ ์‹œํŠธ (๊ณต์‹ ๊ฐ„๊ฒฐ ์ฐธ๊ณ ์ž๋ฃŒ):
https://education.github.com/git-cheat-sheet-education.pdf