πŸ‘Ύ git μ™„λ²½ 정볡 - git의 기초

2021λ…„ 3μ›” 30일

λ“€μ–΄κ°€λ©°

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μ €μž₯μ†Œλ₯Ό λ§Œλ“€κ³  μ„€μ •ν•˜λŠ” 방법, νŒŒμΌμ„ 좔적(Track)ν•˜κ±°λ‚˜ 좔적을 그만 λ‘λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„ λ³΄κ² μŠ΅λ‹ˆλ‹€ !

Git의 기초

Git μ €μž₯μ†Œ λ§Œλ“€κΈ°

Git의 μ €μž₯μ†Œλ₯Ό λ§Œλ“œλŠ” 방법은 두 가지 μž…λ‹ˆλ‹€.

  1. κΈ°μ‘΄ ν”„λ‘œμ νŠΈλ‚˜ 디렉토리λ₯Ό Git μ €μž₯μ†Œλ‘œ λ§Œλ“œλŠ” 방법
  2. λ‹€λ₯Έ μ„œλ²„μ— μžˆλŠ” μ €μž₯μ†Œλ₯Ό Cloneν•˜λŠ” 방법
κΈ°μ‘΄ 디렉토리λ₯Ό Git μ €μž₯μ†Œλ‘œ λ§Œλ“œλŠ” 방법

기쑴의 ν”„λ‘œμ νŠΈλ₯Ό Git으둜 κ΄€λ¦¬ν•˜κ³  μ‹Άλ‹€λ©΄, ν”„λ‘œμ νŠΈμ˜ λ””λ ‰ν† λ¦¬λ‘œ μ΄λ™ν•΄μ„œ μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ λ©λ‹ˆλ‹€.

$ git init

μœ„μ˜ λͺ…λ Ήμ–΄λŠ” .git μ΄λΌλŠ” ν•˜μœ„ 디렉토리λ₯Ό λ§Œλ“€κ²Œ λ©λ‹ˆλ‹€. (ν•˜μ§€λ§Œ 이 λͺ…λ Ήλ§Œλ“œλ‘œλŠ” 아직 ν”„λ‘œμ νŠΈμ˜ μ–΄λ– ν•œ 관리도 ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ !)

κΈ°μ‘΄ μ €μž₯μ†Œλ₯Ό Clone ν•˜κΈ°

λ‹€λ₯Έ ν”„λ‘œμ νŠΈμ— μ°Έμ—¬ν•˜λ €ν•˜κ±°λ‚˜(contribute) Git μ €μž₯μ†Œλ₯Ό λ³΅μ‚¬ν•˜κ³  싢을 λ•Œ git clone λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

git은 μ„œλ²„μ— μžˆλŠ” 거의 λͺ¨λ“  데이터λ₯Ό λ³΅μ‚¬ν•˜κ²Œ λ©λ‹ˆλ‹€. (ν”„λ‘œμ νŠΈμ˜ νžˆμŠ€ν† λ¦¬κΉŒμ§€ !)

$ git clone url myName

μœ„μ™€ 같이 λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜λ©΄ ν•΄λ‹Ή ν”„λ‘œμ νŠΈλ₯Ό λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œ clone ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μˆ˜μ •ν•˜κ³  μ €μž₯μ†Œμ— μ €μž₯ν•˜κΈ°

λ¨Όμ € μ•žμ„œ git directory에 파일이 μ“°μ—¬μ§€λŠ” 과정을 λ¨Όμ € μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

life_cycle

Working Directory의 λͺ¨λ“  νŒŒμΌμ€ 크게 Tracked(κ΄€λ¦¬λŒ€μƒ)와 Untracked(κ΄€λ¦¬λŒ€μƒμ΄ μ•„λ‹˜)으둜 λ‚˜λˆ μ§‘λ‹ˆλ‹€.

Tracked νŒŒμΌμ€ 이미 μŠ€λƒ…μƒ·μ— ν¬ν•¨λ˜μ–΄μžˆλŠ” 파일이며 Unmodified(μˆ˜μ •ν•˜μ§€ μ•ŠμŒ)와 Modified(μˆ˜μ •ν•¨), Staged(μ»€λ°‹μœΌλ‘œ μ €μž₯μ†Œμ— 기둝)ν•˜λŠ” μƒνƒœλ‘œ λ‚˜λˆ μ§‘λ‹ˆλ‹€. 그리고 λ‚˜λ¨Έμ§€λŠ” λͺ¨λ‘ Untracked νŒŒμΌμž…λ‹ˆλ‹€.

즉, Untracked νŒŒμΌμ€ Working Directory에 μžˆλŠ” 파일 쀑 μŠ€λƒ…μƒ·μ—λ„, Staging Area`에도 ν¬ν•¨λ˜μ§€ μ•Šμ€ νŒŒμΌμž…λ‹ˆλ‹€.

처음 μ €μž₯μ†Œλ₯Ό Cloneν•˜λ©΄ λͺ¨λ“  νŒŒμΌμ€ Trackedμ΄λ©΄μ„œ Unmodified μƒνƒœμž…λ‹ˆλ‹€.

λ‚˜μ•„κ°€ λ§ˆμ§€λ§‰ 컀밋 이후 아무것도 μˆ˜μ •ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ μ–΄λ–€ νŒŒμΌμ„ μˆ˜μ •ν•˜κ²Œλ˜λ©΄ κ·Έ νŒŒμΌμ€ Modified μƒνƒœκ°€ λ©λ‹ˆλ‹€.

μ‹€μ œλ‘œ 컀밋을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이 μˆ˜μ •ν•œ νŒŒμΌμ„ Staged μƒνƒœλ‘œ λ§Œλ“€κ³ , Staged μƒνƒœμΈ νŒŒμΌμ„ μ»€λ°‹ν•©λ‹ˆλ‹€.

예제λ₯Ό 톡해 κ³΅λΆ€ν•˜κΈ°

μ΄μ œλŠ” νŒŒμΌμ„ μˆ˜μ •ν•˜κ³  파일의 μŠ€λƒ…μƒ·μ„ μ»€λ°‹ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€~! (μ‹€μŠ΅ !!)

λ¨Όμ €! 빈 디렉토리λ₯Ό λ§Œλ“€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

$ mkdir git_pratice

이 디렉토리λ₯Ό git directory둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ μ΄ˆκΈ°ν™”λ₯Ό ν•΄μ€λ‹ˆλ‹€.

$ git init

init

파일의 μƒνƒœ ν™•μΈν•˜κΈ°

Git μ΄ˆκΈ°ν™”λ₯Ό μ‹œμΌœμ£Όκ³  λ¨Όμ € μƒνƒœλ₯Ό ν™•μΈν•΄μ€λ‹ˆλ‹€.

$ git status

status_1

μœ„μ˜ λ‚΄μš©μ€ νŒŒμΌμ„ ν•˜λ‚˜λ„ μˆ˜μ •ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” 것을 λ§ν•΄μ€λ‹ˆλ‹€. Trackedλ‚˜ Modified μƒνƒœμΈ 파일이 μ—†λ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μƒˆλ‘­κ²Œ νŒŒμΌμ„ λ§Œλ“€κ³  μƒνƒœλ₯Ό ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

$ touch pratice_1.md
$ git status

status_2

pratice_1.md 파일이 UnTracked files 뢀뢄에 속해 μžˆμŠ΅λ‹ˆλ‹€. 즉, Git은 Untracked νŒŒμΌμ„ 아직 컀밋에 넣어지지 μ•Šμ€ 파일이라고 λ³΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

νŒŒμΌμ„ μΆ”μ ν•˜κΈ°

Git이 νŒŒμΌμ„ μΆ”μ ν•˜κ²Œ λ§Œλ“€κΈ° μœ„ν•΄ add λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜κ³  μƒνƒœλ₯Ό ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

$ git add pratice_1.md
$ git status

add

Tracked μƒνƒœμ΄λ©΄μ„œ 컀밋에 좔가될 Staged μƒνƒœλΌλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

Changes to be committed 에 λ“€μ–΄ μžˆλŠ” νŒŒμΌμ€ Staged μƒνƒœλΌλŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ»€λ°‹ν•˜κ²Œλ˜λ©΄ git addλ₯Ό μ‹€ν–‰ν•œ μ‹œμ μ˜ 파일이 μ»€λ°‹λ˜μ–΄ μ €μž₯μ†Œ νžˆμŠ€ν† λ¦¬μ— λ‚¨κ²Œλ©λ‹ˆλ‹€.

이 λͺ…령을 톡해 디렉토리에 μžˆλŠ” νŒŒμΌμ„ μΆ”μ ν•˜κ³  관리할 수 μžˆμŠ΅λ‹ˆλ‹€.

Modifed μƒνƒœμ˜ 파일 Staged ν•˜κΈ°

이미 Tracked μƒνƒœμΈ νŒŒμΌμ„ μˆ˜μ •ν•˜λŠ” 법을 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ¨Όμ € pratice_1.md νŒŒμΌμ„ μˆ˜μ • ν›„ μƒνƒœλ₯Ό ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€!

$ vim ./pratice_1.md
$ git status

git_status_3

Changed not staged for commit μ΄λΌλŠ” μƒνƒœλŠ” μˆ˜μ •ν•œ 파일이 Tracked μƒνƒœμ΄μ§€λ§Œ 아직 Staged μƒνƒœλŠ” μ•„λ‹ˆλΌλŠ” λœ»μž…λ‹ˆλ‹€. Stagedμƒνƒœλ‘œ λ§Œλ“€κ³  μ‹Άλ‹€λ©΄ git add λͺ…령을 μ‹€ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

add의 μ˜λ―ΈλŠ” ν”„λ‘œμ νŠΈμ— νŒŒμΌμ„ μΆ”κ°€ν•œλ‹€κΈ° 보닀 λ‹€μŒ 컀밋에 μΆ”κ°€ν•œλ‹€κ³  μƒκ°ν•˜λŠ”κ²Œ μ’‹μŠ΅λ‹ˆλ‹€.

add λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ—¬ Staged μƒνƒœλ‘œ λ§Œλ“€κ³  μƒνƒœλ₯Ό ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

$ git add ./pratice_1.md
$ git status

git_status_4

μ§€κΈˆ 이 μ‹œμ μ—μ„œ 컀밋을 ν•˜λ©΄ git commit λͺ…령을 μ‹€ν–‰ν•˜λŠ” μ‹œμ μ˜ 버전이 μ»€λ°‹λ˜λŠ” 것이 μ•„λ‹ˆλΌ λ§ˆμ§€λ§‰μœΌλ‘œ git add λͺ…령을 μ‹€ν–‰ν–ˆμ„ λ•Œμ˜ 버전이 μ»€λ°‹λ©λ‹ˆλ‹€. 즉, git add λͺ…령을 ν•œ ν›„ 또 νŒŒμΌμ„ μˆ˜μ •ν•˜λ©΄ git add λͺ…령을 λ‹€μ‹œ μ‹€ν–‰ν•΄μ„œ μ΅œμ‹  버전을 Staged μƒνƒœλ‘œ λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€!

파일 μƒνƒœλ₯Ό μ§€λ§‰ν•˜κ²Œ ν™•μΈν•˜κΈ°

git status λͺ…λ ΉμœΌλ‘œ 확인할 수 μžˆλŠ” λ‚΄μš©μ΄ 많기 λ•Œλ¬Έμ— 쑰금 더 κ°„λ‹¨ν•˜κ²Œ λ³΄μ—¬μ£ΌλŠ” μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

$ git status -s

git_status_s

아직 μΆ”μ ν•˜μ§€ μ•Šμ€ μƒˆ 파일 μ•žμ—λŠ” ??ν‘œμ‹œκ°€ λΆ™μŠ΅λ‹ˆλ‹€. Staged μƒνƒœλ‘œ ν‘Έκ°€ν•œ 파일 쀑 μƒˆλ‘œ μƒμ„±ν•œ 파일 μ•žμ—λŠ” A ν‘œμ‹œκ°€, μˆ˜μ •ν•œ νŒŒμΌμ—λŠ” M ν‘œμ‹œκ°€ λΆ™μŠ΅λ‹ˆλ‹€.

파일 λ¬΄μ‹œν•˜κΈ°

보톡 λ‘œκ·ΈνŒŒμΌμ΄λ‚˜ λΉŒλ“œ μ‹œμŠ€ν…œμ΄ μžλ™μœΌλ‘œ μƒμ„±ν•œ νŒŒμΌλ“€μ€ Git이 관리할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

κΌ­ μœ„μ™€ 같은 파일 λΏλ§Œμ•„λ‹ˆλΌ Git으둜 관리할 ν•„μš”κ°€ μ—†λ‹€κ³  μƒκ°λ˜λŠ” νŒŒμΌλ“€μ€ .gitignore νŒŒμΌμ„ λ§Œλ“€κ³  κ·Έμ•ˆμ— λ¬΄μ‹œν•  파일의 νŒ¨ν„΄μ„ μ μŠ΅λ‹ˆλ‹€.

$ touch .gitignore
$ cat .gitingnore

git_ignore

.gitignore νŒŒμΌμ€ μ•„λž˜μ˜ κ·œμΉ™μ„ λ”°λ¦…λ‹ˆλ‹€.

  • 아무것도 μ—†λŠ” λΌμΈμ΄λ‚˜, #으둜 μ‹œμž‘ν•˜λŠ” 라인은 λ¬΄μ‹œν•©λ‹ˆλ‹€.
  • ν‘œμ€€ Glob νŒ¨ν„΄μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
  • μŠ¬λž˜μ‹œ (/)둜 μ‹œμž‘ν•˜λ©΄ ν•˜μœ„ 디렉토리에 μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ””λ ‰ν† λ¦¬λŠ” μŠ¬λž˜μ‹œλ₯Ό 끝에 μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€.
  • λŠλ‚Œν‘œλ‘œ μ‹œμž‘ν•˜λŠ” νŒ¨ν„΄μ˜ νŒŒμΌμ€ λ¬΄μ‹œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
# ν™•μž₯μžκ°€ .a인 파일 λ¬΄μ‹œ
*.a

# μœ— λΌμΈμ—μ„œ ν™•μž₯μžκ°€ .a인 νŒŒμΌμ€ λ¬΄μ‹œν•˜κ²Œ ν–ˆμ§€λ§Œ lib.aλŠ” λ¬΄μ‹œν•˜μ§€ μ•ŠμŒ
!lib.a

# ν˜„μž¬ 디렉토리에 μžˆλŠ” TODO νŒŒμΌμ€ λ¬΄μ‹œν•˜κ³  subdir/TODO처럼 ν•˜μœ„ 디렉토리에 μžˆλŠ” νŒŒμΌμ€ λ¬΄μ‹œν•˜μ§€ μ•ŠμŒ
/TODO

# build/ 디렉토리에 μžˆλŠ” λͺ¨λ“  νŒŒμΌμ€ λ¬΄μ‹œ 
build/

# doc/notes.txt νŒŒμΌμ€ λ¬΄μ‹œν•˜κ³  doc/server/arch.txt νŒŒμΌμ€ λ¬΄μ‹œν•˜μ§€ μ•ŠμŒ
doc/*.txt

# doc 디렉토리 μ•„λž˜μ˜ λͺ¨λ“  .pdf νŒŒμΌμ„ λ¬΄μ‹œ
doc/**/*.pdf
Staged 와 Unstaged μƒνƒœμ˜ λ³€κ²½ λ‚΄μš©μ„ 보기

λ‹¨μˆœνžˆ 파일이 λ³€κ²½λλ‹€λŠ” 사싀이 μ•„λ‹ˆλΌ μ–΄λ–€ λ‚΄μš©μ΄ λ³€κ²½λλŠ”μ§€ μ‚΄νŽ΄λ³΄λ €λ©΄ git status λͺ…령이 μ•„λ‹ˆλΌ git diff λͺ…령을 μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€. 보톡 Staged 파일인 것과 μ•„λ‹Œκ²ƒλ§Œ νŒŒμ•…ν•΄λ„ 되기 λ•Œλ¬Έμ— git status으둜 μΆ©λΆ„ν•©λ‹ˆλ‹€. 더 μžμ„Έν•˜κ²Œ λ³Ό λ•ŒλŠ” git diff λͺ…령을 μ‚¬μš©ν•˜λŠ”λ° Patch처럼 μ–΄λ–€ 라인을 μΆ”κ°€ν–ˆκ³  μ‚­μ œν–ˆλŠ”μ§€κ°€ κΆκΈˆν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

$ git diff

git_diff

git diff λŠ” Unstaged μƒνƒœμΈ κ²ƒλ“€λ§Œ λ³΄μ—¬μ€λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μˆ˜μ •ν•œ νŒŒμΌμ„ λͺ¨λ‘ Staging Area에 λ„£λŠ”λ‹€λ©΄ git diff λͺ…령은 아무것도 보여주지 μ•ŠμŠ΅λ‹ˆλ‹€.