Opensource SW #03 | Git

Git introduction

๐Ÿ“Œ git

๊นƒ์€ ์˜คํ”ˆ์†Œ์Šค๋กœ ์ œ๊ณต์ด ๋˜๋Š” ๋ถ„์‚ฐํ˜• ๋ฒ„์ „๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‹ค.

SVN : ์ค‘์•™ ์„œ๋ฒ„์— ์†Œ์Šค์ฝ”๋“œ์™€ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ €์žฅ

Git : ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ PC์™€ ์ €์žฅ์†Œ์— ๋ถ„์‚ฐํ•ด์„œ ์ €์žฅ


๐Ÿ“Œ git vs github

git: ๋กœ์ปฌ ์‹œ์Šคํ…œ์— ์„ค์น˜๋˜์–ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ„์ „๊ด€๋ฆฌ ์‹œ์Šคํ…œ์œผ๋กœ CLI๋กœ ์ œ๊ณต์ด ๋œ๋‹ค.

github: ํ˜‘์—…์„ ์œ„ํ•ด ์›๊ฒฉ์œผ๋กœ ๊นƒ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ˜ธ์ŠคํŒ… ์„œ๋น„์Šค์ด๋‹ค. GUI๋กœ ์ œ๊ณต์ด ๋œ๋‹ค.


๐Ÿ“Œ git์ด ์ œ๊ณตํ•˜๋Š” 3๊ฐ€์ง€ ๊ธฐ๋Šฅ

  1. ๋ฒ„์ „๊ด€๋ฆฌ: ๋ˆ„๊ฐ€, ์–ธ์ œ, ๋ฌด์—‡์„ ์ˆ˜์ •ํ–ˆ๋Š”์ง€์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ฐฑ์—…: github์—์„œ ์›๊ฒฉ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ฐฑ์—…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  3. ํ˜‘์—…: ์—ฌ๋Ÿฌ๋ช…์ด ๊ฐ™์€ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์›Œ์•ผ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค.

Git Version Control

git์—์„œ๋Š” ๋ฒ„์ „์— ๋”ฐ๋ผ ํŒŒ์ผ์„ ๋‹ค๋ฅด๊ฒŒ ์ €์žฅํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ฐ ๋ฒ„์ „์— ๋”ฐ๋ฅธ ์ž‘์—…๋‚ด์šฉ์„ ์ €์žฅํ•˜์—ฌ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•œ๋‹ค.

git์ด ์–ด๋–ป๊ฒŒ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š”์ง€ ์˜์—ญ๊ณผ ์ƒํƒœ, ๊ทธ๋ฆฌ๊ณ  ํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์•Œ์•„๋ณด๊ณ , ๊ด€๋ จ ๋ช…๋ น์–ด๋ฅผ ์ตํ˜€๋ณด์ž.


๐Ÿ“Œ git์ด ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• - ์˜์—ญ

git์—๋Š” ์•„๋ž˜์˜ 3๊ฐœ์˜ ์˜์—ญ์ด ์žˆ๋‹ค.

img
git의 버전 관리
  • Working tree(Working directory): git repository๊ฐ€ ์กด์žฌํ•˜๋Š” ํ˜„์žฌ directory๋กœ ํ˜„์žฌ ํŒŒ์ผ์ด ์ €์žฅ๋˜๋Š” ํด๋”์ด๋‹ค.
  • Stage(Staging area): ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š๋Š” ๋‹จ๊ณ„๋กœ ๋ฒ„์ „์œผ๋กœ ๋งŒ๋“ค ํŒŒ์ผ๋“ค์ด ๋Œ€๊ธฐํ•˜๋Š” ์ค‘๊ฐ„ ์˜์—ญ์ด๋‹ค. git add
  • Repository: Stage์— ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋˜ ํŒŒ์ผ๋“ค์„ ๋ฒ„์ „์œผ๋กœ ๋งŒ๋“ค์–ด ์ €์žฅํ•˜๋Š” ์˜์—ญ์ด๋‹ค. git commit

๐Ÿ“Œ git์ด ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• - ์ƒํƒœ

Working tree์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์€ ํฌ๊ฒŒ trakedํŒŒ์ผ๊ณผ untrackedํŒŒ์ผ๋กœ ๋‚˜๋‰œ๋‹ค.

img
파일의 상태
  • Untracked: git์„ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ์„ ์ƒˆ๋กœ ๋งŒ๋“ค ๋•Œ, ์•„์ง git์— ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š์€ ํŒŒ์ผ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค.
  • Traked: Stage ์˜์—ญ์— ํ•œ ๋ฒˆ์ด๋ผ๋„ ๊ฐ„ ํŒŒ์ผ๋“ค์€ TrakedํŒŒ์ผ์ด๋ฉฐ ํฌ๊ฒŒ Unmodified์™€ Modified๋กœ ๋‚˜๋‰œ๋‹ค.

    • Unmodified: commitํ•œ ํ›„ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ํŒŒ์ผ๋“ค
    • Modified: ํŒŒ์ผ๋“ค์„ ์ˆ˜์ •ํ•˜๊ณ  ์•„์ง staged ๋˜์ง€ ์•Š์€ ํŒŒ์ผ๋“ค
    • Staged: ์ˆ˜์ •ํ•˜๊ณ  git add ๋ช…๋ น์–ด๊ฐ€ ์ž…๋ ฅ๋œ ์ƒํƒœ์˜ ํŒŒ์ผ๋“ค

๐Ÿ“Œ git์ด ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• - ํŒŒ์ผ

git์€ ๋‚ด๋ถ€์ ์œผ๋กœ commit, tree, blob, tag์˜ 4๊ฐ€์ง€ ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž…์„ ๊ด€๋ฆฌํ•œ๋‹ค.

์ด๋Ÿฐ ์˜ค๋ธŒ์ ํŠธ๋Š” .git/objects์— ๊ฐœ๋ณ„์ ์ธ ํŒŒ์ผ๋“ค๋กœ ์กด์žฌํ•˜๋ฉฐ, ๊ฐ๊ฐ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ์ด๋‹ค.

git์— โ€œhello.txtโ€๋ผ๋Š” ํŒŒ์ผ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•˜๋ฉด, ๋‚ด์šฉ ์ „๋ถ€๋ฅผ ํ•ด์‹œํ…Œ์ด๋ธ”์— ๋„ฃ์–ด, 40์ž๋ฆฌ์˜ ํ•ด์‹œ๊ฐ’์„ ๋ฝ‘์•„๋‚ด์–ด ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ์˜ ํŒŒ์ผ์ด๋ฆ„ ์ค‘ ์•ž 2๊ธ€์ž๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ ,๋‚˜๋จธ์ง€ 38๊ธ€์ž๋ฅผ ํŒŒ์ผ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ“Œ git ๋ช…๋ น์–ด - ๋ฒ„์ „๊ด€๋ฆฌ

  • git init: ์ƒˆ๋กœ์šด git repository(.git)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • git status: ํ˜„์žฌ git์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด๋กœ ํ˜„์žฌ ์–ด๋–ค ํŒŒ์ผ์ด ์ถ”์ ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • git log: ์ปค๋ฐ‹ํ•œ ๋ฒ„์ „๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ ๋ฒ„์ „๋ณ„๋กœ[40๊ธ€์ž์˜ commit hash, commit message, Author, Date]๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

    • --stat: ๊ฐ commit๋งˆ๋‹ค ์–ด๋–ค ํŒŒ์ผ์ด ์—ฐ๊ด€๋˜์–ด ์žˆ๋Š”์ง€ ํ•จ๊ป˜ ์ถœ๋ ฅ
    • --oneline: ํ•˜๋‚˜์˜ ๋ผ์ธ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถœ๋ ฅ
  • git diff: modifiedํŒŒ์ผ๋“ค์„ ์ตœ์‹ ๋ฒ„์ „๊ณผ ๋น„๊ตํ•˜์—ฌ ์ฐจ์ด์ ์„ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด
  • git add: Untracked ํŒŒ์ผ๋“ค ๋˜๋Š” Tracked์ค‘์— Modified ํŒŒ์ผ๋“ค์„ Stage์˜์—ญ์— ์ €์žฅํ•œ๋‹ค.
  • git commit: staging area์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ repository์— ์ €์žฅํ•œ๋‹ค.

    • -m: ์—๋””ํ„ฐ๊ฐ€ ์—ด๋ฆฌ์ง€ ์•Š๊ณ , ๋ฐ”๋กœ commit ํ—ค๋”๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
    • -a: add์™€ ๋™์‹œ์— commit์„ ์ง„ํ–‰ํ•œ๋‹ค.
  • git revert -- [file]: ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋˜๋Œ์•„๊ฐ€ ์ˆ˜์ •๋œ ํŒŒ์ผ์„ ๋˜๋Œ๋ฆฐ๋‹ค.(modified ์ƒํƒœ์— ์žˆ๋Š” ํŒŒ์ผ์ด unmodified์ƒํƒœ๊ฐ€ ๋œ๋‹ค.)

    • revert [์ปค๋ฐ‹ hash]: git reset --hard๋Š” ๋„ˆ๋ฌด ์œ„ํ—˜ํ•ด์„œ revertํ•œ ์ปค๋ฐ‹์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ํ•ด๋‹น ์ปค๋ฐ‹์œผ๋กœ ๋˜๋Œ์•„๊ฐ„๋‹ค.
  • git reset HEAD [file]: ํ•ด๋‹น ํŒŒ์ผ์˜ ๊ฐ€์žฅ ์ตœ๊ทผ staging์„ ์ทจ์†Œํ•œ๋‹ค.

    • HEAD^: ๊ฐ€์žฅ ์ตœ๊ทผ commit์„ ์ทจ์†Œํ•œ๋‹ค.
    • --hard [์ปค๋ฐ‹ hash]: ํ•ด๋‹น ์ปค๋ฐ‹์œผ๋กœ ๋˜๋Œ์•„๊ฐ„๋‹ค. ์ด๋•Œ๊นŒ์ง€์˜ ๋ชจ๋“  ์ปค๋ฐ‹๋“ค์ด ์‚ญ์ œ๋˜๊ณ  ํŒŒ์ผ์ˆ˜์ •๋„ ์ทจ์†Œ๋œ๋‹ค.
  • git restore:

    • --staged: git reset HEAD [file]๊ณผ ๋™์ผํ•˜๊ฒŒ ํ•ด๋‹น staging์ด ์ทจ์†Œ๊ฐ€ ๋œ๋‹ค.

Git Branch

๋ธŒ๋žœ์น˜๋Š” git๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฑฐ์˜ ๋ชจ๋“  version๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด main์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๋‘” ์ฑ„๋กœ main์ฝ”๋“œ์— ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋™์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

img
git의 branch

๐Ÿ“Œ Branch๊ด€๋ จ ๋ช…๋ น์–ด

  • ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ: git branch sub
  • ๋ธŒ๋žœ์น˜ ์‚ญ์ œ: main๋ธŒ๋žœ์น˜์—์„œ git branch -d sub
  • ๋ธŒ๋žœ์น˜ ์ด๋™: git checkout sub
  • ๋ธŒ๋žœ์น˜ merge: main๋ธŒ๋žœ์น˜์—์„œ git merge sub
  • ๋ชจ๋“  ๋ธŒ๋žœ์น˜ ์ƒํƒœ: git log --branches
  • ํŠธ๋ฆฌ๊ตฌ์กฐ์˜ ๋ชจ๋“  ๋ธŒ๋žœ์น˜ ์ƒํƒœ: git log --branches --graph
  • branch1์—๋Š” ์—†๊ณ , branch2์— ์žˆ๋Š” commit ํ™•์ธ: git log <branch1>..<branch2>
  • ์ž ๊น ๊ฐ์ถ˜๋‹ค: git stash

Github

๐Ÿ“Œ Remote & Local repository

๋ฐฑ์—…๊ณผ ํ˜‘์—…์„ ์œ„ํ•ด ๋‘๊ฐœ๋ฅผ ๋‚˜๋ˆˆ๋‹ค.

Remote repository(GitHub): ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ์›๊ฒฉ ์ €์žฅ์†Œ

Local repository(Git): ํ˜„์žฌ ์ž‘์—…์ค‘์ธ ์ปดํ“จํ„ฐ์˜ git repository


๐Ÿ“Œ Github๊ด€๋ จ ๋ช…๋ น์–ด

  • remote์™€ local ์—ฐ๊ฒฐ: git remote add origin "์ฃผ์†Œ"

git clone [์›๊ฒฉ์ €์žฅ์†Œurl]์„ ํ†ตํ•ด ์›๊ฒฉ์ €์žฅ์†Œ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค๋ฉด ์ž๋™์œผ๋กœ origin์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ [์›๊ฒฉ์ €์žฅ์†Œurl]์ฃผ์†Œ๊ฐ€ ์›๊ฒฉ์ €์žฅ์†Œ๋กœ ๋“ฑ๋ก๋˜๊ฒŒ๋œ๋‹ค

  • ์—ฐ๊ฒฐ๋œ remote repository ํ™•์ธ: git remote -v
  • local์„ Remote Repository๋กœ ์—…๋กœ๋“œ: git push origin ๋ธŒ๋žœ์น˜์ด๋ฆ„
  • remote๋ฅผ Local Repository๋กœ ๋‹ค์šด๋กœ๋“œ: git pull origin ๋ธŒ๋žœ์น˜์ด๋ฆ„