Git - tobyseo/open GitHub Wiki

๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค

  1. commit ํ•˜๊ธฐ ์ „์— git diff๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ (๋ฒ„๊ทธ ๋ฐฉ์ง€)
  • git add --patch
  • git diff --cached
  1. ์ž‘๊ณ , ๋…ผ๋ฆฌ์ ์ธ ์ปค๋ฐ‹ (์ผ์ฐ ์ž์ฃผํ•˜๊ธฐ)
  • ์ž˜ ๊ด€๋ฆฌ๋œ ์ €์žฅ์†Œ์˜ ์ปค๋ฐ‹ ๋กœ๊ทธ๋Š” ํ•˜๋‚˜์˜ ์Šคํ† ๋ฆฌ๋‹ค

  • git status์™€ git diff๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ฆฌ๋ทฐ์‹œ ๋‹จ์ผํ•œ ๋…ผ๋ฆฌ์  ๋‹จ์œ„, ๋‹จ์ˆœํ•œ ๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช… ๋˜์–ด์•ผํ•จ.

  • ํฌ๊ฒŒ ๋ญ‰์ณ์žˆ๋Š” ์ปค๋ฐ‹์˜ ๋‹จ์ 

    • "์ด์Šˆ#123 : ๋น„๋””์˜ค ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ ˆ์Šค๋ฐ” ์ถ”๊ฐ€" vs "์ด์Šˆ#123 : ํ”„๋กœ๊ทธ๋ ˆ์Šค๋ฐ”๋ฅผ ์œ„ํ•œ jQuery๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—…๋ฐ์ดํŠธ"
    • ์ฝ”๋“œ์˜ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋ฌด์šฉ์ง€๋ฌผ์ด๋จ, ์ฝ”๋“œ ๊ฐœ๋ฐœ ์ ˆ์ฐจ๊ฐ€ ๋ฌปํ˜€๋ฒ„๋ฆผ.
    • ๋””๋ฒ„๊น…์‹œ์— ์ปค๋ฐ‹ ๋‹จ์œ„๊ฐ€ ์ž˜๊ฒŒ ๋‚˜๋ˆ ์ ธ์žˆ๋Š” ํŽธ์ด ์–ด๋–ค ๋ผ์ธ์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์•Œ๊ธฐ ์šฉ์ดํ•จ
  • ๊ฐ€์ด๋“œ๋ผ์ธ

    • ์ ˆ๋Œ€ ํ•˜๋‚˜์˜ ์ปค๋ฐ‹์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ชจ๋“ˆ๋“ค์„ ๋ฌถ์–ด ๋„ฃ์ง€ ์•Š๋Š”๋‹ค. (์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด ํƒ€์ดํŠธํ•˜๊ฒŒ ์ปคํ”Œ๋ง๊ด€๊ณ„๊ฐ€ ์•„๋‹Œ ์ด์ƒ)
    • ์ƒˆ ๋ชจ๋“ˆ์„ ์ž‘์„ฑํ• ๋•Œ ๊ทธ๋ฃจํ„ฐ๊ธฐ ํ•จ์ˆ˜๋“ค์„ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ , ๋Œ์•„์™€์„œ ๊ทธ ๊ฒƒ๋“ค์„ ์ฑ„์›Œ๋„ฃ๋Š”๋‹ค.
    • ํ•ญ์ƒ API๋ ˆ๋ฒจ์˜ ํ•จ์ˆ˜๋“ค์„ ์ž‘์„ฑํ•˜๊ณ  ์ปค๋ฐ‹ํ•œ๋‹ค. (๊ทธ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ์ž‘์„ฑํ•˜๊ณ  ์ปค๋ฐ‹ํ•˜๊ธฐ์ „์—)
    • ๋ธŒ๋žœ์น˜์™€ ๊ด€๋ จ์—†๋Š” ๋ฒ„๊ทธ ํ”ฝ์Šค๋“ค์„ ์ƒˆ ๋ธŒ๋žœ์น˜์˜ ๋ณ„๋„์˜ ์ปค๋ฐ‹์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
  1. ๋ช…๋ น์–ด๋ฅผ ์œ„ํ•œ alise๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ (~/.gitconfig์— ์ถ”๊ฐ€)
[alias]
lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr, %cn)%Creset' --abbrev-commit --date=relative
hist = log --graph --pretty=format:'%h %ad | %s%d [%an]' --date=short
last = log -1 HEAD
unstage = reset HEAD --
amend = commit --amend -C HEAD
co = checkout
ci = commit
st = status
br = branch
  1. ๊นจ๋—ํ•œ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‚จ๊ฒจ๋ผ git merge๋ฅผ ๋งŽ์ด ์“ฐ๊ฒŒ๋˜๋ฉด ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ฝ๊ธฐ ์–ด๋ ค์›Œ์ง (git rebase์™€ git merge์˜ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•  ๊ฒƒ)
  • push ์ „์— rebase
  1. ์šฉ๋„์— ์•Œ๋งž๊ฒŒ pull request๋ฅผ ์‚ฌ์šฉํ•˜๋ผ.
  • ํŒ€์›๋“ค์ด ๋ฌด์—‡์ด ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์คŒ (๋ณ€๊ฒฝ์‚ฌํ•ญ ์ถ”์ , ์ปค๋ฐ‹ ์—ฐ๊ณ„, ๊ฐœ๋ฐœ ์ค‘ ํ˜‘์—…, ๋จธ์ง€ ์ „ ์ฝ”๋“œ ๋ฆฌ๋ทฐ)
  • ๋จธ์ง€ ์ปค๋ฐ‹์ด ๋ˆˆ์— ๋„๋Š”๊ฒŒ ์œ ์ผํ•œ ๋‹จ์ ์ด๊ธด ํ•˜์ง€๋งŒ, ํŒ€์œผ๋กœ ์ผํ•  ๋•Œ ์ด ์ ์€ ์ƒ์‡„๋œ๋‹ค.
  1. ์ ˆ๋Œ€ ๊ณต์œ ๋œ ์ปค๋ฐ‹์€ ๋ฆฌ๋ฒ ์ด์Šค ํ•˜์ง€ ๋ง๋ผ
  • ๊ทœ์น™ : ํ•œ ๋ฒˆ ์›๊ฒฉ ์ €์žฅ์†Œ์— ํ‘ธ์‰ฌํ•œ ์ปค๋ฐ‹์€ ๋ฆฌ๋ฒ ์ด์Šคํ•˜์ง€ ์•Š๊ธฐ
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆฌ์ง€ ์•Š๊ฒŒ ํ•ด์ฃผ๊ณ , ๋‚ด๊ฐ€ ์ˆ˜์ •ํ•œ ๋ฒ„๊ทธ๋‚˜ ์‹ค์ˆ˜์˜ ๋กœ๊ทธ๋„ ๋ณด์กด์‹œ์ผœ์ค€๋‹ค.

--

http://kentnguyen.com/development/visualized-git-practices-for-team/

rebase ์˜ ์‰ฌ์šด ์ •์˜ : ๋งˆ์ง€๋ง‰ ํ‘ธ์‰ฌ ๋ถ€ํ„ฐ ๋กœ์ปฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค ์•ž์— ๋†“๋Š”๊ฒƒ. ๋ธŒ๋žœ์น˜ ๋‚˜๋ˆ„๊ธฐ, ์ž์ฃผ ๋จธ์ง€ํ•˜๊ณ , ์‹ฑํฌ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ

  • ๋‚˜์ค‘์— ๋จธ์ง€ํ• ๋•Œ ๋ณต์žกํ•จ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์†์ ์œผ๋กœ master๋ฅผ ๋จธ์ง€
  • ์ปค๋ฐ‹, ๋จธ์ง€๋ฅผ ์ž์ฃผ ํ•  ๊ฒƒ http://kentnguyen.com/wp-content/uploads/2012/01/git_merge_often.png

์ข€ ๋” ๋‚˜์€ Git ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ช…๋ น์–ด๋“ค

merging vs rebasing

git rebase๋Š” git merge์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ. ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ. https://www.atlassian.com/git/images/tutorials/advanced/merging-vs-rebasing/01.svg ์œ„ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ master branch์—์„œ ๊ฐˆ๋ผ์ ธ ๋‚˜์˜จ ์ด์Šˆ ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, Master ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ๋‹ค๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋ฐ˜์˜์„ ์œ„ํ•ด rebase ๋˜๋Š” merge๋ฅผ ํƒํ•  ์ˆ˜ ์žˆ์Œ

git checkout feature git merge master

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋จธ์ง€๋จ https://www.atlassian.com/git/images/tutorials/advanced/merging-vs-rebasing/02.svg

์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์ถ”๊ฐ€์ ์ธ ์ปค๋ฐ‹์ด ํ•˜๋‚˜ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ ๋จธ์ง€์˜ ์žฅ์ ์€ ๋น„ํŒŒ๊ดด์ , ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ๋ธŒ๋žœ์น˜๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ฐ”๋€Œ์ง€ ์•Š์•˜์Œ.

rebasing์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ž ์žฌ์  ์œ„ํ—˜ ์š”์ธ์„ ๋ฐฉ์ง€ํ•จ. ๋ฐ˜๋ฉด์— ์ •๋ˆ๋˜์ง€ ์•Š์€ ๋จธ์ง€ ์ปค๋ฐ‹๋“ค์ด ๋Š˜์–ด๋‚˜๋ฉด ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๊ฐ€ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ฝ๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜๋„ ์žˆ์Œ.

๋ฆฌ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ

git checkout feature git rebase master

feature ๋ธŒ๋žœ์น˜ ์ „์ฒด๋ฅผ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์˜ ๋์œผ๋กœ ์ด๋™ํ•˜๊ณ , ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์˜ ๋ชจ๋“  ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ๋ฐ˜์˜ํ•จ. ๋จธ์ง€์™€ ๋‹ฌ๋ฆฌ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹๋“ค์„ ์ƒ์„ฑํ•˜๋ฉด์„œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์“ฐ๊ฒŒ๋จ

https://www.atlassian.com/git/images/tutorials/advanced/merging-vs-rebasing/03.svg ์ด๋ฏธ์ง€๋Š” ์ด์™€ ๊ฐ™์Œ

์žฅ์ ์€ ๊นจ๋—ํ•œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์–ป๊ฒŒ๋จ, ์™„์ „ํžˆ ์„ ํ˜•์ ์ธ ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— git log, git bisect, git gitk๋“ฑ์œผ๋กœ ํƒ์ƒ‰ํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›€

์ด๋ ‡๊ฒŒ ์ƒˆ ๊ฒƒ๊ฐ™์€ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ์—๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ์žˆ์Œ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋‹ค์‹œ ์”€์œผ๋กœ ์ž ์žฌ์ ์œผ๋กœ ํ˜‘์—… ์›Œํฌํ”Œ๋กœ์šฐ์— ํฐ ์ง€์žฅ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Œ

--

์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฆฌ๋ฒ ์ด์‹ฑ https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC-%EB%8B%A8%EC%9E%A5%ED%95%98%EA%B8%B0#_squashing

--

commit ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒ๋Œ€์ ์ธ ๋ฐฉ๋ฒ• ^ : ๋ถ€๋ชจ ^์ˆซ์ž : ์ˆซ์ž๋ฒˆ์งธ ๋ถ€๋ชจ (๋จธ์ง€ ์ปค๋ฐ‹์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) ~ : ๋ถ€๋ชจ ~์ˆซ์ž : ์ˆซ์ž๋ฒˆ์งธ ๋ถ€๋ชจ (์กฐ๋ถ€๋ชจ) ์˜ˆ์ œ : https://www.atlassian.com/git/images/tutorials/advanced/refs-and-the-reflog/02.svg

--

๋˜๋Œ๋ฆฌ๊ธฐ (reset, checkout, revert)

reset ๋ธŒ๋žœ์น˜์˜ ๋์„ ๋‹ค๋ฅด ์ปค๋ฐ‹์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปค๋ฐ‹๋“ค์„ ์ง€์šฐ๋Š”๋ฐ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•จ.

git checkout hotfix

git reset HEAD~2

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋์˜ ๋‘ ์ปค๋ฐ‹์€ ๋Œ•๊ธ€๋ง ์ปค๋ฐ‹(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ๋Œ€์ƒ)์ด ๋œ๋‹ค. https://www.atlassian.com/git/images/tutorials/advanced/resetting-checking-out-and-reverting/02.svg

--soft : ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ์—๋งŒ ์˜ํ–ฅ์„ ์ฃผ๊ณ , ์Šคํ…Œ์ด์ง€๋‚˜ ์›Œํ‚น ๋””๋ ‰ ํ† ๋ฆฌ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€์•Š์Œ --mixed : ๊ธฐ๋ณธ๊ฐ’, ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ์™€ ์Šคํ…Œ์ด์ง€ ์˜ํ–ฅ์„ ์คŒ --hard : ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ, ์Šคํ…Œ์ด์ง€, ์›Œํ‚น๋””๋ ‰ํ† ๋ฆฌ ๋ชจ๋‘์— ์˜ํ–ฅ์„ ์คŒ .

๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ๊ฒฝ์šฐ

  • git reset --mixed HEAD^ : ์ตœ๊ทผ ์ปค๋ฐ‹ ์ทจ์†Œ (์Šคํ…Œ์ด์ง•๋„ ํ•จ๊ป˜ ์ทจ์†Œ)

--

checkout ๋ธŒ๋žœ์น˜ ๋Œ€์‹  ์ปค๋ฐ‹ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด check out ๊ฐ€๋Šฅ. ๋ธŒ๋žœ์น˜์˜ ๊ฒฝ์šฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋˜‘ ๊ฐ™์€ ์ผ์„ ํ•จ. HEAD์ฐธ์กฐ๋ฅผ ํŠน์ •ํ•œ ์ปค๋ฐ‹์œผ๋กœ ์˜ฎ๊น€. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์€ ํ˜„์žฌ ์ปค๋ฐ‹์˜ ์กฐ๋ถ€๋ชจ๋กœ ์ฒดํฌ์•„์›ƒ ํ•จ.

git checkout HEAD~2

https://www.atlassian.com/git/images/tutorials/advanced/resetting-checking-out-and-reverting/05.svg

์˜ค๋ž˜๋œ ๋ฒ„์ „์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ดํŽด๋ณผ๋•Œ ์œ ์šฉํ•˜์ง€๋งŒ, ํ˜„์žฌ HEAD๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ธŒ๋žœ์น˜ ์ฐธ์กฐ๊ฐ€ ์—†์–ด์„œ deteched HEAD ์ƒํƒœ๊ฐ€ ๋จ. ์ปค๋ฐ‹์„ ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์Šค์œ„์นญ์„ ํ•˜๋ฉด ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์„ ์žƒ์–ด๋ฒ„๋ฆด ์ˆ˜๊ฐ€ ์žˆ์Œ, ๋•Œ๋ฌธ์— ์ปค๋ฐ‹ํ• ๋•Œ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๋Š”๊ฒŒ ์ข‹์Œ.

--

revert ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜์—ฌ ๋˜๋Œ๋ฆฌ๊ธฐ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „

git revert HEAD~2

https://www.atlassian.com/git/images/tutorials/advanced/resetting-checking-out-and-reverting/06.svg

--

stash https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Stashing%EA%B3%BC-Cleaning

--

์ฐธ๊ณ ์ž๋ฃŒ