Skip to content

Git & GitHub โ€‹

Git & GitHub โ€‹

๐Ÿ”— Git โ€‹

  • ๐Ÿ“Ž Git: ๋ถ„์‚ฐํ˜• ๋ฒ„์ „ ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๊ณ  ํ˜‘์—…์„ ๋•๋Š”๋‹ค.
  • ์‰ฝ๊ฒŒ ๋งํ•ด, ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ๊ธฐ๋กํ•˜๋Š” ๋„๊ตฌ๋‹ค.

๐Ÿ™ GitHub โ€‹

  • ๐Ÿ“Ž GitHub: Git ์ €์žฅ์†Œ๋ฅผ ์˜จ๋ผ์ธ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํด๋ผ์šฐ๋“œ ํ˜ธ์ŠคํŒ… ํ”Œ๋žซํผ

  • ์˜จ๋ผ์ธ ๋ฐฑ์—…๊ณผ ๊ณต์œ , ํ˜‘์—…์ด ๊ฐ€๋Šฅํ•œ ์˜จ๋ผ์ธ ์ฝ”๋“œ ์ €์žฅ์†Œ


Git GUI โ€‹

Git ๊ธฐ๋ณธ ํ๋ฆ„ โ€‹

bash
# (1) ํด๋” ์ดˆ๊ธฐํ™”
$ git init

# (2) ํŒŒ์ผ ์ถ”๊ฐ€
$ git add .       # ์ „์ฒด ํŒŒ์ผ ์ถ”๊ฐ€
$ git add ํŒŒ์ผ๋ช…   # ํŠน์ • ํŒŒ์ผ๋งŒ ์ถ”๊ฐ€

# (3) ์ปค๋ฐ‹ (์Šค๋ƒ…์ƒท ์ €์žฅ)
$ git commit -m "์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€"

# (4) GitHub ์›๊ฒฉ ์ €์žฅ์†Œ ์—ฐ๊ฒฐ
$ git remote add origin https://github.com/์•„์ด๋””/๋ ˆํฌ๋ช….git

# (5) GitHub๋กœ ์—…๋กœ๋“œ (์—…์ŠคํŠธ๋ฆผ ์ง€์ • ํฌํ•จ)
$ git push -u origin main

# (6) ์ƒํƒœ ํ™•์ธ
$ git status

๐Ÿช git init

์ง€๊ธˆ ์ด ํด๋”๋ถ€ํ„ฐ Git์œผ๋กœ ๊ด€๋ฆฌํ• ๊ฒŒ์š”!๋ผ๊ณ  ์„ ์–ธํ•˜๋Š” ๋ช…๋ น์–ด

  • ๊ฐœ๋ฐœ ํ”„๋กœ์ ํŠธ๋ฅผ Git์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌํ•  ์ค€๋น„๋ฅผ ํ•  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
  • ์‹คํ–‰ํ•˜๋ฉด .git์ด๋ผ๋Š” ์ˆจ๊น€ ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜์–ด, ์ด ํด๋” ์•ˆ์—์„œ Git์ด ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์ „์—๋Š” ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ์œ„์น˜๋ฅผ ๊ผญ ํ™•์ธํ•˜์ž! (์›์น˜ ์•Š๋Š” ํด๋”์—์„œ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜)

โฌ†๏ธ git push

  • -u ์˜ต์…˜์€ "์—…์ŠคํŠธ๋ฆผ(๊ธฐ๋ณธ ์›๊ฒฉ ๋ธŒ๋žœ์น˜)"์„ ์„ค์ •ํ•˜๋Š” ์—ญํ• ์ด๋‹ค.
  • ์ดํ›„๋ถ€ํ„ฐ๋Š” git push๋งŒ ์ž…๋ ฅํ•ด๋„ origin/main์œผ๋กœ ํ‘ธ์‹œ๋œ๋‹ค.

Git ์„ค์ • โ€‹

Git ์„ค์ • ๋ฒ”์œ„์™€ ์„ค์ • ํŒŒ์ผ

Git์€ ์ง€์—ญ(Local), ์ „์—ญ(Global), ์‹œ์Šคํ…œ(System) 3๊ฐ€์ง€ ๋ฒ”์œ„๋กœ ์„ค์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์ง€์—ญ(Local): ํŠน์ • ์ €์žฅ์†Œ์—๋งŒ ์ ์šฉ โ†’ ํ•ด๋‹น ํด๋” ์•ˆ์—์„œ๋งŒ ์œ ํšจ (.git/config)
  • ์ „์—ญ(Global): ํ˜„์žฌ ์‚ฌ์šฉ์ž ๊ณ„์ • ์ „์ฒด์— ์ ์šฉ โ†’ ๋Œ€๋ถ€๋ถ„ ์ด๊ฑธ ์‚ฌ์šฉ (~/.gitconfig)
  • ์‹œ์Šคํ…œ(System): ์ปดํ“จํ„ฐ ์ „์ฒด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ์šฉ โ†’ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ (/etc/gitconfig)
  • ์ „์—ญ์„ค์ • โ€‹

bash
# ์ „์—ญ ์„ค์ • (์‚ฌ์šฉ์ž ์ •๋ณด)
$ git config --global user.name ์ด๋ฆ„
$ git config --global user.email ์ด๋ฉ”์ผ
  • ์„ค์ • ํ™•์ธ/์‚ญ์ œ โ€‹

bash
# ์„ค์ • ์ „์ฒด ๋ณด๊ธฐ
$ git config --list

# ์ด๋ฆ„๋งŒ ๋ณด๊ธฐ
$ git config --global user.name

# ์ด๋ฉ”์ผ๋งŒ ๋ณด๊ธฐ
$ git config --global user.email

# ์ด๋ฆ„ ์‚ญ์ œ
$ git config --global --unset user.name

# ์ด๋ฉ”์ผ ์‚ญ์ œ
$ git config --global --unset user.email
  • ๋กœ์ปฌ ์„ค์ • (ํ•ด๋‹น ๋ ˆํฌ์—๋งŒ ์ ์šฉ) โ€‹

bash
# ์ด๋ฆ„ ์„ค์ •
$ git config user.name ์ด๋ฆ„

# ์ด๋ฉ”์ผ ์„ค์ •
$ git config user.email ์ด๋ฉ”์ผ

Git ํ•„์ˆ˜ ๋ช…๋ น์–ด โ€‹

  • ์ปค๋ฐ‹ ๋กœ๊ทธ ํ™•์ธ โ€‹

bash
# ์ „์ฒด ๋กœ๊ทธ
$ git log

# ํ•œ ์ค„ ์š”์•ฝ
$ git log --oneline
  • ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋กœ ์ฝ”๋“œ ๋ณ€๊ฒฝ์  ์ถ”์ธก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ โ€‹

bash
# ํ˜„์žฌ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ ๋ชฉ๋ก ํ™•์ธ
$ git status

# ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ ํ™•์ธ
$ git diff
  • ์Šคํ…Œ์ด์ง• & ์ปค๋ฐ‹ โ€‹

bash
# ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์„ ์Šคํ…Œ์ด์ง• ์˜์—ญ์— ์ถ”๊ฐ€
$ git add ํŒŒ์ผ๋ช…      # ํŠน์ • ํŒŒ์ผ๋งŒ ์ถ”๊ฐ€
$ git add .           # ์ „์ฒด ๋ณ€๊ฒฝ ํŒŒ์ผ ์ถ”๊ฐ€

# ์ปค๋ฐ‹ ์ƒ์„ฑ (ํ˜„์žฌ ์Šคํ…Œ์ด์ง•๋œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํ•˜๋‚˜์˜ ๋ฒ„์ „ ๊ธฐ๋ก์œผ๋กœ ์ €์žฅ)
$ git commit -m "์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€"

# ๊ธฐ๋ณธ ์ปค๋ฐ‹ (ํŽธ์ง‘๊ธฐ ์—ด๋ฆผ)
$ git commit
  • ๋˜๋Œ๋ฆฌ๊ธฐ โ€‹

bash
# ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹ ์ทจ์†Œ (์Šคํ…Œ์ด์ง•๊นŒ์ง€ ๋ณต์›)
$ git reset HEAD~1

# ์ˆ˜์ • ์ „ ์ƒํƒœ๋กœ ๋ณต์›
$ git restore ํŒŒ์ผ๋ช…
  • ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋ณต์‚ฌ & ๋ณ€๊ฒฝ ๊ฐ€์ ธ์˜ค๊ธฐ โ€‹

bash
# ์ €์žฅ์†Œ ๋ณต์ œ
$ git clone URL

# ๋ณ€๊ฒฝ์‚ฌํ•ญ ๊ฐ€์ ธ์˜ค๊ธฐ
$ git pull

๐Ÿงฉ git pull ์‚ฌ์šฉ ์˜ˆ์‹œ

main ๋ธŒ๋žœ์น˜์—์„œ ์ตœ์‹  ๋‚ด์šฉ ๊ฐ€์ ธ์˜ฌ ๋•Œ โ€‹

bash
$ git checkout main
$ git pull           # == git pull origin main

feature/login ๋ธŒ๋žœ์น˜์— main์˜ ์ตœ์‹  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณ‘ํ•ฉํ•  ๋•Œ โ€‹

bash
$ git checkout feature/login
$ git pull origin main

๐ŸŽฃ git pull

git pull์˜ ๋‚ด๋ถ€ ์ž‘๋™ โ€‹

bash
$ git pull

# git pull์€ ์•„๋ž˜ ๋‘ ๋ช…๋ น์–ด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
$ git fetch
$ git merge

๐Ÿ” git fetch โ€‹

bash
$ git fetch origin
  • origin ์ €์žฅ์†Œ์˜ ์ตœ์‹  ์ปค๋ฐ‹์„ ๊ฐ€์ ธ์˜ค์ง€๋งŒ, ๋‚ด ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์—๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ดํ›„ merge ๋˜๋Š” rebase๋ฅผ ํ†ตํ•ด ์ง์ ‘ ๋‚ด ๋ธŒ๋žœ์น˜์— ๋ฐ˜์˜ํ•ด์•ผ ํ•œ๋‹ค.

๐Ÿ”€ git merge โ€‹

bash
$ git merge origin/main
plaintext
A---B         โ† main (origin)
     \
      C---D---M   โ† feature (merge ์™„๋ฃŒ)
  • fetch๋กœ ๊ฐ€์ ธ์˜จ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋‚ด ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•œ๋‹ค.
  • ๋ณ€๊ฒฝ์ ์ด ๊ฒน์น˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณ‘ํ•ฉ ์‹œ merge commit์ด ์ƒ์„ฑ๋˜์–ด, ๋ธŒ๋žœ์น˜๊ฐ€ ํ•ฉ์ณ์กŒ๋‹ค๋Š” ๊ธฐ๋ก์ด ๋‚จ๋Š”๋‹ค.

๐Ÿ” git rebase โ€‹

bash
$ git rebase origin/main
  • ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ง์„ ์œผ๋กœ ์ •๋ฆฌํ•œ๋‹ค.
  • ๋งˆ์น˜ ์ตœ์‹  ์ปค๋ฐ‹ ์ดํ›„์— ์ž‘์—…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, ๋‚ด ์ปค๋ฐ‹์„ ๊ทธ ๋’ค์— ๋‹ค์‹œ ์Œ“๋Š”๋‹ค.
  • ์ถฉ๋Œ ๋ฐœ์ƒ ์‹œ ํ•ด๊ฒฐ ํ›„ git rebase --continue ๋ช…๋ น์–ด๋กœ ์ด์–ด์„œ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.
plaintext
# rebase ์ „
A---B---C---D   โ† origin/main
         \
          C'---D'   โ† feature (rebase ์ค‘)
  • A, B: ๊ณตํ†ต ์กฐ์ƒ ์ปค๋ฐ‹
  • C, D: ์›๋ž˜ feature ๋ธŒ๋žœ์น˜์—์„œ ๋งŒ๋“  ์ปค๋ฐ‹
  • C', D': git rebase origin/main์„ ์‹คํ–‰ํ•˜๋ฉด ๋งŒ๋“ค์–ด์ง€๋Š” ์ƒˆ ์ปค๋ฐ‹(rebased ์ปค๋ฐ‹)
plaintext
# rebase ํ›„
A---B---C'---D' (rebased feature ์™„๋ฃŒ)
  • C, D: ์‚ญ์ œ๋˜์ง€ ์•Š์ง€๋งŒ ํžˆ์Šคํ† ๋ฆฌ์—์„œ ์‚ฌ๋ผ์ง (git reflog์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ)
  • C', D': origin/main ์ตœ์‹  ์ปค๋ฐ‹ ์ดํ›„์— ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ปค๋ฐ‹ (๋‚ด์šฉ ์œ ์‚ฌ, ID๋Š” ๋‹ค๋ฆ„)

Git Branch โ€‹

  • ๋ธŒ๋žœ์น˜ ๊ธฐ๋ณธ โ€‹

bash
 # ๋ธŒ๋žœ์น˜ ๋ชฉ๋ก
$ git branch

# ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
$ git branch ๋ธŒ๋žœ์น˜๋ช…

# ๋ธŒ๋žœ์น˜ ์ด๋™ (switch ๊ถŒ์žฅ / checkout ๊ตฌ๋ฒ„์ „)
$ git switch ๋ธŒ๋žœ์น˜๋ช…
$ git checkout ๋ธŒ๋žœ์น˜์ด๋ฆ„

# ์ƒ์„ฑ + ์ด๋™
$ git switch -c ๋ธŒ๋žœ์น˜๋ช…
$ git checkout -b ๋ธŒ๋žœ์น˜์ด๋ฆ„
  • ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ โ€‹

bash
# ๋ณ‘ํ•ฉ ๋Œ€์ƒ(main)์œผ๋กœ ์ด๋™
$ git switch main

# ๋ณ‘ํ•ฉํ•  ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฐ€์ ธ์˜ด
$ git merge ๋ธŒ๋žœ์น˜
  • ๋ณ‘ํ•ฉ์€ main โฌ…๏ธ ๋ธŒ๋žœ์น˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
    ์ฆ‰, ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด main ๋ธŒ๋žœ์น˜์— ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค.
  • ์‹ค๋ฌด์—์„œ๋Š” ๋ธŒ๋žœ์น˜๋ฅผ ์ง์ ‘ ๋ณ‘ํ•ฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” GitHub์˜ Pull Request๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ›„ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹์ด ์ผ๋ฐ˜์ ์ด๋‹ค.

GitHub Pull Request โ€‹

bash
$ git push origin ๋ธŒ๋žœ์น˜๋ช…
  • GitHub Repository๋กœ ์ด๋™ > Compare & pull request
  • Open a pull request > base(์ตœ์ข… ๋ธŒ๋žœ์น˜) & compare(๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜) ์„ค์ •

๐Ÿง Linux ๋ช…๋ น์–ด โ€‹

  • ๋””๋ ‰ํ† ๋ฆฌ ์ด๋™ ๊ด€๋ จ โ€‹

bash
# ํ•ด๋‹น ํด๋”๋กœ ์ด๋™ (change directory)
$ cd ํด๋”๋ช…

# ํ•˜์œ„ ํด๋”๋กœ ํ•œ ๋ฒˆ์— ์ด๋™
$ cd ํด๋”๋ช…/ํด๋”๋ช…

# ์ƒ์œ„ ํด๋”๋กœ ์ด๋™
$ cd ..

# ์ƒ์œ„ ํด๋” 2๋‹จ๊ณ„ ์ด๋™
$ cd ../..
  • ํด๋” ๋ฐ ํŒŒ์ผ ํ™•์ธ โ€‹

bash
# ํ˜„์žฌ ์œ„์น˜, ๊ฒฝ๋กœ (print working directory)
$ pwd

# ํ˜„์žฌ ์œ„์น˜์˜ ํŒŒ์ผ ๋ชฉ๋ก ๋ณด๊ธฐ (list)
$ ls

# ์ˆจ๊น€ ํŒŒ์ผ ํฌํ•จ ์ „์ฒด ๋ชฉ๋ก (list all)
$ ls -a

# ์ƒ์„ธ ์ •๋ณด ํฌํ•จ ๋ชฉ๋ก
$ ls -l

# ํŒŒ์ผ ํฌ๊ธฐ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ์ถœ๋ ฅ
$ ls -lh
  • ํŒŒ์ผ ๋ฐ ํด๋” ์ƒ์„ฑ โ€‹

bash
# ์ƒˆ ํด๋” ์ƒ์„ฑ (make directory)
$ mkdir ํด๋”๋ช…

# ์ƒˆ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ
$ touch ํŒŒ์ผ๋ช…
  • ํŒŒ์ผ ๋ฐ ํด๋” ์‚ญ์ œ โ€‹

bash
# ํŒŒ์ผ ์‚ญ์ œ (Remove)
$ rm ํŒŒ์ผ๋ช…

# ํด๋” ์‚ญ์ œ - ์žฌ๊ท€์ ์œผ๋กœ ๋‚ด๋ถ€๊นŒ์ง€ ์‚ญ์ œ (Recursive)
$ rm -r ํด๋”๋ช…

# ๐Ÿšจ ํด๋” ๊ฐ•์ œ ์‚ญ์ œ (Recursive + Force)
# ์‚ญ์ œ ์ „ ๋ฌผ์–ด๋ณด์ง€ ์•Š๊ณ , ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ๋„ ์—๋Ÿฌ ์—†์ด ๋„˜์–ด๊ฐ
$ rm -rf ํด๋”๋ช…

# ํด๋” ์‚ญ์ œ (Recursive + interactive)
# ํด๋” ๋‚ด๋ถ€ ํ•ญ๋ชฉ๋งˆ๋‹ค ์‚ญ์ œ ์—ฌ๋ถ€ ํ•˜๋‚˜์”ฉ ๋ฌผ์–ด๋ด„
$ rm -ri ํด๋”๋ช…
bash
# ํ‹ฐ๋ฏธ๋„ ํ™”๋ฉด ์ •๋ฆฌ
$ clear