Skip to content

Latest commit

Β 

History

History
945 lines (803 loc) Β· 47.9 KB

recording-changes.asc

File metadata and controls

945 lines (803 loc) Β· 47.9 KB

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

만질 수 μžˆλŠ” Git μ €μž₯μ†Œλ₯Ό ν•˜λ‚˜ λ§Œλ“€μ—ˆκ³  μ›Œν‚Ή 디렉토리에 Checkout도 ν–ˆλ‹€. μ΄μ œλŠ” νŒŒμΌμ„ μˆ˜μ •ν•˜κ³  파일의 μŠ€λƒ…μƒ·μ„ 컀밋해 보자. νŒŒμΌμ„ μˆ˜μ •ν•˜λ‹€κ°€ μ €μž₯ν•˜κ³  μ‹ΆμœΌλ©΄ μŠ€λƒ…μƒ·μ„ μ»€λ°‹ν•œλ‹€.

μ›Œν‚Ή λ””λ ‰ν† λ¦¬μ˜ λͺ¨λ“  νŒŒμΌμ€ 크게 Tracked(κ΄€λ¦¬λŒ€μƒμž„)와 Untracked(κ΄€λ¦¬λŒ€μƒμ΄ μ•„λ‹˜)둜 λ‚˜λˆˆλ‹€. Tracked νŒŒμΌμ€ 이미 μŠ€λƒ…μƒ·μ— 포함돼 있던 νŒŒμΌμ΄λ‹€. Tracked νŒŒμΌμ€ 또 Unmodified(μˆ˜μ •ν•˜μ§€ μ•ŠμŒ)와 Modified(μˆ˜μ •ν•¨) 그리고 Staged(μ»€λ°‹μœΌλ‘œ μ €μž₯μ†Œμ— 기둝할) μƒνƒœ 쀑 ν•˜λ‚˜μ΄λ‹€. κ°„λ‹¨νžˆ λ§ν•˜μžλ©΄ Git이 μ•Œκ³  μžˆλŠ” νŒŒμΌμ΄λΌλŠ” 것이닀.

그리고 λ‚˜λ¨Έμ§€ νŒŒμΌμ€ λͺ¨λ‘ Untracked νŒŒμΌμ΄λ‹€. Untracked νŒŒμΌμ€ μ›Œν‚Ή 디렉토리에 μžˆλŠ” 파일 쀑 μŠ€λƒ…μƒ·μ—λ„ Staging Area에도 ν¬ν•¨λ˜μ§€ μ•Šμ€ νŒŒμΌμ΄λ‹€. 처음 μ €μž₯μ†Œλ₯Ό Clone ν•˜λ©΄ λͺ¨λ“  νŒŒμΌμ€ Trackedμ΄λ©΄μ„œ Unmodified μƒνƒœμ΄λ‹€. νŒŒμΌμ„ Checkout ν•˜κ³  λ‚˜μ„œ 아무것도 μˆ˜μ •ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— κ·Έλ ‡λ‹€.

λ§ˆμ§€λ§‰ 컀밋 이후 아직 아무것도 μˆ˜μ •ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ μ–΄λ–€ νŒŒμΌμ„ μˆ˜μ •ν•˜λ©΄ Git은 κ·Έ νŒŒμΌμ„ Modified μƒνƒœλ‘œ μΈμ‹ν•œλ‹€. μ‹€μ œλ‘œ 컀밋을 ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이 μˆ˜μ •ν•œ νŒŒμΌμ„ Staged μƒνƒœλ‘œ λ§Œλ“€κ³ , Staged μƒνƒœμ˜ νŒŒμΌμ„ μ»€λ°‹ν•œλ‹€. 이런 라이프사이클을 계속 λ°˜λ³΅ν•œλ‹€.

파일의 라이프사이클.
Figure 1. 파일의 라이프사이클.

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

파일의 μƒνƒœλ₯Ό ν™•μΈν•˜λ €λ©΄ 보톡 git status λͺ…령을 μ‚¬μš©ν•œλ‹€. Clone ν•œ 후에 λ°”λ‘œ 이 λͺ…령을 μ‹€ν–‰ν•˜λ©΄ μ•„λž˜κ³Ό 같은 λ©”μ‹œμ§€λ₯Ό λ³Ό 수 μžˆλ‹€.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

μœ„μ˜ λ‚΄μš©μ€ νŒŒμΌμ„ ν•˜λ‚˜λ„ μˆ˜μ •ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” 것을 말해쀀닀. Tracked νŒŒμΌμ€ ν•˜λ‚˜λ„ μˆ˜μ •λ˜μ§€ μ•Šμ•˜λ‹€λŠ” μ˜λ―Έλ‹€. Untracked νŒŒμΌμ€ 아직 μ—†μ–΄μ„œ λͺ©λ‘μ— λ‚˜νƒ€λ‚˜μ§€ μ•ŠλŠ”λ‹€. 그리고 ν˜„μž¬ μž‘μ—… 쀑인 브랜치λ₯Ό μ•Œλ €μ£Όλ©° μ„œλ²„μ˜ 같은 λΈŒλžœμΉ˜λ‘œλΆ€ν„° μ§„ν–‰λœ μž‘μ—…μ΄ μ—†λŠ” 것을 λ‚˜νƒ€λ‚Έλ‹€. κΈ°λ³Έ λΈŒλžœμΉ˜κ°€ master이기 λ•Œλ¬Έμ— ν˜„μž¬ 브랜치 이름이 β€œmaster” 둜 λ‚˜μ˜¨λ‹€. 브랜치 κ΄€λ ¨ λ‚΄μš©μ€ μ°¨μ°¨ μ•Œμ•„κ°€μž. ch03-git-branching.asc μ—μ„œ λΈŒλžœμΉ˜μ™€ Refs에 λŒ€ν•΄ μžμ„Ένžˆ 닀룬닀.

ν”„λ‘œμ νŠΈμ— README νŒŒμΌμ„ λ§Œλ“€μ–΄λ³΄μž. README νŒŒμΌμ€ μƒˆλ‘œ λ§Œλ“  파일이기 λ•Œλ¬Έμ— git status λ₯Ό μ‹€ν–‰ν•˜λ©΄ 'Untracked files’에 λ“€μ–΄ μžˆλ‹€:

$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    README

nothing added to commit but untracked files present (use "git add" to track)

README νŒŒμΌμ€ β€œUntracked files” 뢀뢄에 속해 μžˆλŠ”λ° 이것은 README 파일이 Untracked μƒνƒœλΌλŠ” 것을 λ§ν•œλ‹€. Git은 Untracked νŒŒμΌμ„ 아직 μŠ€λƒ…μƒ·(컀밋)에 넣어지지 μ•Šμ€ 파일이라고 λ³Έλ‹€. 파일이 Tracked μƒνƒœκ°€ 되기 μ „κΉŒμ§€λŠ” Git은 μ ˆλŒ€ κ·Έ νŒŒμΌμ„ μ»€λ°‹ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·Έλž˜μ„œ μΌν•˜λ©΄μ„œ μƒμ„±ν•˜λŠ” λ°”μ΄λ„ˆλ¦¬ 파일 같은 것을 μ»€λ°‹ν•˜λŠ” μ‹€μˆ˜λŠ” ν•˜μ§€ μ•Šκ²Œ λœλ‹€. README νŒŒμΌμ„ μΆ”κ°€ν•΄μ„œ 직접 Tracked μƒνƒœλ‘œ λ§Œλ“€μ–΄ 보자.

νŒŒμΌμ„ μƒˆλ‘œ μΆ”μ ν•˜κΈ°

git add λͺ…λ ΉμœΌλ‘œ νŒŒμΌμ„ μƒˆλ‘œ 좔적할 수 μžˆλ‹€. μ•„λž˜ λͺ…령을 μ‹€ν–‰ν•˜λ©΄ Git은 README νŒŒμΌμ„ μΆ”μ ν•œλ‹€.

$ git add README

git status λͺ…령을 λ‹€μ‹œ μ‹€ν–‰ν•˜λ©΄ README 파일이 Tracked μƒνƒœμ΄λ©΄μ„œ 컀밋에 좔가될 Staged μƒνƒœλΌλŠ” 것을 확인할 수 μžˆλ‹€.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

β€œChanges to be committed” 에 λ“€μ–΄ μžˆλŠ” νŒŒμΌμ€ Staged μƒνƒœλΌλŠ” 것을 μ˜λ―Έν•œλ‹€. μ»€λ°‹ν•˜λ©΄ git add λ₯Ό μ‹€ν–‰ν•œ μ‹œμ μ˜ 파일이 μ»€λ°‹λ˜μ–΄ μ €μž₯μ†Œ νžˆμŠ€ν† λ¦¬μ— λ‚¨λŠ”λ‹€. μ•žμ—μ„œ git init λͺ…령을 μ‹€ν–‰ν•œ ν›„, git add (files) λͺ…령을 μ‹€ν–‰ν–ˆλ˜ κ±Έ κΈ°μ–΅ν•  것이닀. 이 λͺ…령을 톡해 디렉토리에 μžˆλŠ” νŒŒμΌμ„ μΆ”μ ν•˜κ³  κ΄€λ¦¬ν•˜λ„λ‘ ν•œλ‹€. git add λͺ…령은 파일 λ˜λŠ” λ””λ ‰ν† λ¦¬μ˜ 경둜λ₯Ό μ•„κ·œλ¨ΌνŠΈλ‘œ λ°›λŠ”λ‹€. 디렉토리면 μ•„λž˜μ— μžˆλŠ” λͺ¨λ“  νŒŒμΌλ“€κΉŒμ§€ μž¬κ·€μ μœΌλ‘œ μΆ”κ°€ν•œλ‹€.

Modified μƒνƒœμ˜ νŒŒμΌμ„ Stage ν•˜κΈ°

이미 Tracked μƒνƒœμΈ νŒŒμΌμ„ μˆ˜μ •ν•˜λŠ” 법을 μ•Œμ•„λ³΄μž. CONTRIBUTING.md λΌλŠ” νŒŒμΌμ„ μˆ˜μ •ν•˜κ³  λ‚˜μ„œ git status λͺ…령을 λ‹€μ‹œ μ‹€ν–‰ν•˜λ©΄ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™λ‹€.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

이 CONTRIBUTING.md νŒŒμΌμ€ β€œChanges not staged for commit” 에 μžˆλ‹€. 이것은 μˆ˜μ •ν•œ 파일이 Tracked μƒνƒœμ΄μ§€λ§Œ 아직 Staged μƒνƒœλŠ” μ•„λ‹ˆλΌλŠ” 것이닀. Staged μƒνƒœλ‘œ λ§Œλ“€λ €λ©΄ git add λͺ…령을 μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€. git add λͺ…령은 νŒŒμΌμ„ μƒˆλ‘œ 좔적할 λ•Œλ„ μ‚¬μš©ν•˜κ³  μˆ˜μ •ν•œ νŒŒμΌμ„ Staged μƒνƒœλ‘œ λ§Œλ“€ λ•Œλ„ μ‚¬μš©ν•œλ‹€. Merge ν•  λ•Œ μΆ©λŒλ‚œ μƒνƒœμ˜ νŒŒμΌμ„ Resolve μƒνƒœλ‘œ λ§Œλ“€λ•Œλ„ μ‚¬μš©ν•œλ‹€. add의 μ˜λ―ΈλŠ” ν”„λ‘œμ νŠΈμ— νŒŒμΌμ„ μΆ”κ°€ν•œλ‹€κΈ° λ³΄λ‹€λŠ” λ‹€μŒ 컀밋에 μΆ”κ°€ν•œλ‹€κ³  λ°›μ•„λ“€μ΄λŠ”κ²Œ μ’‹λ‹€. git add λͺ…령을 μ‹€ν–‰ν•˜μ—¬ CONTRIBUTING.md νŒŒμΌμ„ Staged μƒνƒœλ‘œ λ§Œλ“€κ³  git status λͺ…λ ΉμœΌλ‘œ κ²°κ³Όλ₯Ό ν™•μΈν•΄λ³΄μž.

$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

두 파일 λͺ¨λ‘ Staged μƒνƒœμ΄λ―€λ‘œ λ‹€μŒ 컀밋에 ν¬ν•¨λœλ‹€. ν•˜μ§€λ§Œ 아직 더 μˆ˜μ •ν•΄μ•Ό ν•œλ‹€λŠ” 것을 μ•Œκ²Œ λ˜μ–΄ λ°”λ‘œ μ»€λ°‹ν•˜μ§€ λͺ»ν•˜λŠ” 상황이 λ˜μ—ˆλ‹€κ³  μƒκ°ν•΄λ³΄μž. 이 μƒν™©μ—μ„œ CONTRIBUTING.md νŒŒμΌμ„ μ—΄κ³  μˆ˜μ •ν•œλ‹€. 이제 컀밋할 μ€€λΉ„κ°€ λ‹€ 됐닀고 생각할 ν…Œμ§€λ§Œ, Git은 그렇지 μ•Šλ‹€. git status λͺ…λ ΉμœΌλ‘œ 파일의 μƒνƒœλ₯Ό λ‹€μ‹œ ν™•μΈν•΄λ³΄μž.

$ vim CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

ν—‰! CONTRIBUTING.md κ°€ Staged μƒνƒœμ΄λ©΄μ„œ λ™μ‹œμ— Unstaged μƒνƒœλ‘œ λ‚˜μ˜¨λ‹€. μ–΄λ–»κ²Œ 이런 일이 κ°€λŠ₯ν• κΉŒ? git add λͺ…령을 μ‹€ν–‰ν•˜λ©΄ Git은 νŒŒμΌμ„ λ°”λ‘œ Staged μƒνƒœλ‘œ λ§Œλ“ λ‹€. μ§€κΈˆ 이 μ‹œμ μ—μ„œ 컀밋을 ν•˜λ©΄ git commit λͺ…령을 μ‹€ν–‰ν•˜λŠ” μ‹œμ μ˜ 버전이 μ»€λ°‹λ˜λŠ” 것이 μ•„λ‹ˆλΌ λ§ˆμ§€λ§‰μœΌλ‘œ git add λͺ…령을 μ‹€ν–‰ν–ˆμ„ λ•Œμ˜ 버전이 μ»€λ°‹λœλ‹€. κ·ΈλŸ¬λ‹ˆκΉŒ git add λͺ…령을 μ‹€ν–‰ν•œ 후에 또 νŒŒμΌμ„ μˆ˜μ •ν•˜λ©΄ git add λͺ…령을 λ‹€μ‹œ μ‹€ν–‰ν•΄μ„œ μ΅œμ‹  버전을 Staged μƒνƒœλ‘œ λ§Œλ“€μ–΄μ•Ό ν•œλ‹€.

$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   README
    modified:   CONTRIBUTING.md

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

git status λͺ…λ ΉμœΌλ‘œ 확인할 수 μžˆλŠ” λ‚΄μš©μ΄ μ’€ λ§Žμ•„ 보일 수 μžˆλ‹€. 사싀 κ·Έλ ‡λ‹€. μ’€ 더 κ°„λ‹¨ν•˜κ²Œ λ³€κ²½ λ‚΄μš©μ„ λ³΄μ—¬μ£ΌλŠ” μ˜΅μ…˜μ΄ μžˆλ‹€. git status -s λ˜λŠ” git status --short 처럼 μ˜΅μ…˜μ„ μ£Όλ©΄ ν˜„μž¬ λ³€κ²½ν•œ μƒνƒœλ₯Ό μ§€λ§‰ν•˜κ²Œ 보여쀀닀.

$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

아직 μΆ”μ ν•˜μ§€ μ•ŠλŠ” μƒˆ 파일 μ•žμ—λŠ” ?? ν‘œμ‹œκ°€ λΆ™λŠ”λ‹€. Staged μƒνƒœλ‘œ μΆ”κ°€ν•œ 파일 쀑 μƒˆλ‘œ μƒμ„±ν•œ 파일 μ•žμ—λŠ” A ν‘œμ‹œκ°€, μˆ˜μ •ν•œ 파일 μ•žμ—λŠ” M ν‘œμ‹œκ°€ λΆ™λŠ”λ‹€. μœ„ λͺ…λ Ήμ˜ κ²°κ³Όμ—μ„œ μƒνƒœμ •λ³΄ μ»¬λŸΌμ—λŠ” 두 가지 정보λ₯Ό 보여쀀닀. μ™Όμͺ½μ—λŠ” Staging Areaμ—μ„œμ˜ μƒνƒœλ₯Ό, 였λ₯Έμͺ½μ—λŠ” Working Treeμ—μ„œμ˜ μƒνƒœλ₯Ό ν‘œμ‹œν•œλ‹€. README 파일 같은 경우 λ‚΄μš©μ„ λ³€κ²½ν–ˆμ§€λ§Œ 아직 Staged μƒνƒœλ‘œ μΆ”κ°€ν•˜μ§€λŠ” μ•Šμ•˜λ‹€. lib/simplegit.rb νŒŒμΌμ€ λ‚΄μš©μ„ λ³€κ²½ν•˜κ³  Staged μƒνƒœλ‘œ μΆ”κ°€κΉŒμ§€ ν•œ μƒνƒœμ΄λ‹€. μœ„ κ²°κ³Όμ—μ„œ 차이점을 λΉ„κ΅ν•΄λ³΄μž. Rakefile 은 λ³€κ²½ν•˜κ³  Staged μƒνƒœλ‘œ μΆ”κ°€ν•œ ν›„ 또 λ‚΄μš©μ„ λ³€κ²½ν•΄μ„œ Staged μ΄λ©΄μ„œ Unstaged μƒνƒœμΈ νŒŒμΌμ΄λ‹€.

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

μ–΄λ–€ νŒŒμΌμ€ Git이 관리할 ν•„μš”κ°€ μ—†λ‹€. 보톡 둜그 νŒŒμΌμ΄λ‚˜ λΉŒλ“œ μ‹œμŠ€ν…œμ΄ μžλ™μœΌλ‘œ μƒμ„±ν•œ 파일이 κ·Έλ ‡λ‹€. 그런 νŒŒμΌμ„ λ¬΄μ‹œν•˜λ €λ©΄ .gitignore νŒŒμΌμ„ λ§Œλ“€κ³  κ·Έ μ•ˆμ— λ¬΄μ‹œν•  파일 νŒ¨ν„΄μ„ μ λŠ”λ‹€. μ•„λž˜λŠ” .gitignore 파일의 μ˜ˆμ΄λ‹€.

$ cat .gitignore
*.[oa]
*~

첫번째 라인은 ν™•μž₯μžκ°€ β€œ.o” λ‚˜ β€œ.a” 인 νŒŒμΌμ„ Git이 λ¬΄μ‹œν•˜λΌλŠ” 것이고 λ‘˜μ§Έ 라인은 ~ 둜 λλ‚˜λŠ” λͺ¨λ“  νŒŒμΌμ„ λ¬΄μ‹œν•˜λΌλŠ” 것이닀. 보톡 λŒ€λΆ€λΆ„μ˜ ν…μŠ€νŠΈ νŽΈμ§‘κΈ°μ—μ„œ μž„μ‹œνŒŒμΌλ‘œ μ‚¬μš©ν•˜λŠ” 파일 이름이기 λ•Œλ¬Έμ΄λ‹€. β€œ.o” 와 β€œ.a” λŠ” 각각 λΉŒλ“œ μ‹œμŠ€ν…œμ΄ λ§Œλ“€μ–΄λ‚΄λŠ” μ˜€λΈŒμ νŠΈμ™€ μ•„μΉ΄μ΄λΈŒ 파일이고 ~ 둜 λλ‚˜λŠ” νŒŒμΌμ€ Emacsλ‚˜ VI 같은 ν…μŠ€νŠΈ νŽΈμ§‘κΈ°κ°€ μž„μ‹œλ‘œ λ§Œλ“€μ–΄λ‚΄λŠ” νŒŒμΌμ΄λ‹€. 또 log, tmp, pid 같은 λ””λ ‰ν† λ¦¬λ‚˜, μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” λ¬Έμ„œ 같은 것듀도 μΆ”κ°€ν•  수 μžˆλ‹€. .gitignore νŒŒμΌμ€ 보톡 μ²˜μŒμ— λ§Œλ“€μ–΄ λ‘λŠ” 것이 νŽΈλ¦¬ν•˜λ‹€. κ·Έλž˜μ„œ Git μ €μž₯μ†Œμ— μ»€λ°‹ν•˜κ³  싢지 μ•Šμ€ νŒŒμΌμ„ μ‹€μˆ˜λ‘œ μ»€λ°‹ν•˜λŠ” 일을 방지할 수 μžˆλ‹€.

.gitignore νŒŒμΌμ— μž…λ ₯ν•˜λŠ” νŒ¨ν„΄μ€ μ•„λž˜ κ·œμΉ™μ„ λ”°λ₯Έλ‹€.

  • 아무것도 μ—†λŠ” λΌμΈμ΄λ‚˜, # 둜 μ‹œμž‘ν•˜λŠ” 라인은 λ¬΄μ‹œν•œλ‹€.

  • ν‘œμ€€ Glob νŒ¨ν„΄μ„ μ‚¬μš©ν•œλ‹€. μ΄λŠ” ν”„λ‘œμ νŠΈ 전체에 μ μš©λœλ‹€.

  • μŠ¬λž˜μ‹œ(/)둜 μ‹œμž‘ν•˜λ©΄ ν•˜μœ„ 디렉토리에 μ μš©λ˜μ§€(Recursivity) μ•ŠλŠ”λ‹€.

  • λ””λ ‰ν† λ¦¬λŠ” μŠ¬λž˜μ‹œ(/)λ₯Ό 끝에 μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ ν‘œν˜„ν•œλ‹€.

  • λŠλ‚Œν‘œ(!)둜 μ‹œμž‘ν•˜λŠ” νŒ¨ν„΄μ˜ νŒŒμΌμ€ λ¬΄μ‹œν•˜μ§€ μ•ŠλŠ”λ‹€.

Glob νŒ¨ν„΄μ€ μ •κ·œν‘œν˜„μ‹μ„ λ‹¨μˆœν•˜κ²Œ λ§Œλ“  κ²ƒμœΌλ‘œ μƒκ°ν•˜λ©΄ 되고 보톡 μ‰˜μ—μ„œ 많이 μ‚¬μš©ν•œλ‹€. μ• μŠ€ν„°λ¦¬μŠ€ν¬(*)λŠ” λ¬Έμžκ°€ ν•˜λ‚˜λ„ μ—†κ±°λ‚˜ ν•˜λ‚˜ 이상을 μ˜λ―Έν•˜κ³ , [abc] λŠ” μ€‘κ΄„ν˜Έ μ•ˆμ— μžˆλŠ” 문자 쀑 ν•˜λ‚˜λ₯Ό μ˜λ―Έν•œλ‹€(κ·ΈλŸ¬λ‹ˆκΉŒ 이 κ²½μš°μ—λŠ” a, b, c). λ¬ΌμŒν‘œ(?)λŠ” 문자 ν•˜λ‚˜λ₯Ό λ§ν•˜κ³ , [0-9] 처럼 μ€‘κ΄„ν˜Έ μ•ˆμ˜ 캐릭터 사이에 ν•˜μ΄ν”ˆ(-)을 μ‚¬μš©ν•˜λ©΄ κ·Έ 캐릭터 사이에 μžˆλŠ” 문자 ν•˜λ‚˜λ₯Ό λ§ν•œλ‹€. μ• μŠ€ν„°λ¦¬μŠ€ν¬ 2개λ₯Ό μ‚¬μš©ν•˜μ—¬ 디렉토리 μ•ˆμ˜ 디렉토리 κΉŒμ§€ 지정할 수 μžˆλ‹€. a/**/z νŒ¨ν„΄μ€ a/z, a/b/z, a/b/c/z 디렉토리에 μ‚¬μš©ν•  수 μžˆλ‹€.

μ•„λž˜λŠ” .gitignore 파일의 μ˜ˆμ΄λ‹€.

# ν™•μž₯μžκ°€ .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
Tip

GitHub은 λ‹€μ–‘ν•œ ν”„λ‘œμ νŠΈμ—μ„œ 자주 μ‚¬μš©ν•˜λŠ” .gitignore 예제λ₯Ό κ΄€λ¦¬ν•˜κ³  μžˆλ‹€. μ–΄λ–€ λ‚΄μš©μ„ 넣을지 λ§‰λ§‰ν•˜λ‹€λ©΄ https://github.com/github/gitignore μ‚¬μ΄νŠΈμ—μ„œ μ λ‹Ήν•œ 예제λ₯Ό 찾을 수 μžˆλ‹€.

Note

.gitignore λ₯Ό μ‚¬μš©ν•˜λŠ” κ°„λ‹¨ν•œ 방식은 ν•˜λ‚˜μ˜ .gitignore νŒŒμΌμ„ μ΅œμƒμœ„ 디렉토리에 ν•˜λ‚˜ 두고 λͺ¨λ“  ν•˜μœ„ λ””λ ‰ν† λ¦¬μ—κΉŒμ§€ μ μš©μ‹œν‚€λŠ” 방식이닀. λ¬Όλ‘  .gitignore νŒŒμΌμ„ ν•˜λ‚˜λ§Œ λ‘λŠ” 것이 μ•„λ‹ˆλΌ ν•˜μœ„ 디렉토리에도 μΆ”κ°€λ‘œ λ‘˜ μˆ˜λ„ μžˆλ‹€. .gitignore 정책은 ν˜„μž¬ .gitignore 파일이 μœ„μΉ˜ν•œ 디렉토리와 κ·Έ ν•˜μœ„ 디렉토리에 μ μš©λœλ‹€. (λ¦¬λˆ…μŠ€ 컀널 μ†ŒμŠ€ μ €μž₯μ†Œμ—λŠ” .gitignore 파일이 206κ°œλ‚˜ 있음)

λ‹€μˆ˜μ˜ .gitignore νŒŒμΌμ„ 두고 정책을 μ μš©ν•˜λŠ” 뢀뢄은 이 μ±…μ—μ„œ λ‹€λ£¨λŠ” λ²”μœ„λ₯Ό λ²—μ–΄λ‚œλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ man gitignore μ—μ„œ 확인할 수 μžˆλ‹€.

Staged와 Unstaged μƒνƒœμ˜ λ³€κ²½ λ‚΄μš©μ„ 보기

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

README νŒŒμΌμ„ μˆ˜μ •ν•΄μ„œ Staged μƒνƒœλ‘œ λ§Œλ“€κ³  CONTRIBUTING.md νŒŒμΌμ€ κ·Έλƒ₯ μˆ˜μ •λ§Œ ν•΄λ‘”λ‹€. 이 μƒνƒœμ—μ„œ git status λͺ…령을 μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ 같은 λ©”μ‹œμ§€λ₯Ό λ³Ό 수 μžˆλ‹€.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

git diff λͺ…령을 μ‹€ν–‰ν•˜λ©΄ μˆ˜μ •ν–ˆμ§€λ§Œ 아직 staged μƒνƒœκ°€ μ•„λ‹Œ νŒŒμΌμ„ 비ꡐ해 λ³Ό 수 μžˆλ‹€.

$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
 Please include a nice description of your changes when you submit your PR;
 if we have to read the whole diff to figure out why you're contributing
 in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.

 If you are starting to work on a particular area, feel free to submit a PR
 that highlights your work in progress (and note in the PR title that it's

이 λͺ…령은 μ›Œν‚Ή 디렉토리에 μžˆλŠ” 것과 Staging Area에 μžˆλŠ” 것을 λΉ„κ΅ν•œλ‹€. κ·Έλž˜μ„œ μˆ˜μ •ν•˜κ³  아직 Stage ν•˜μ§€ μ•Šμ€ 것을 보여쀀닀.

λ§Œμ•½ μ»€λ°‹ν•˜λ €κ³  Staging Area에 넣은 파일의 λ³€κ²½ 뢀뢄을 보고 μ‹ΆμœΌλ©΄ git diff --staged μ˜΅μ…˜μ„ μ‚¬μš©ν•œλ‹€. 이 λͺ…령은 μ €μž₯μ†Œμ— μ»€λ°‹ν•œ 것과 Staging Area에 μžˆλŠ” 것을 λΉ„κ΅ν•œλ‹€.

$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project

κΌ­ μžŠμ§€ 말아야 ν•  것이 μžˆλŠ”λ° git diff λͺ…령은 λ§ˆμ§€λ§‰μœΌλ‘œ μ»€λ°‹ν•œ 후에 μˆ˜μ •ν•œ 것듀 μ „λΆ€λ₯Ό 보여주지 μ•ŠλŠ”λ‹€. git diff λŠ” Unstaged μƒνƒœμΈ κ²ƒλ“€λ§Œ 보여쀀닀. μˆ˜μ •ν•œ νŒŒμΌμ„ λͺ¨λ‘ Staging Area에 λ„£μ—ˆλ‹€λ©΄ git diff λͺ…령은 아무것도 좜λ ₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

CONTRIBUTING.md νŒŒμΌμ„ Stage ν•œ 후에 λ‹€μ‹œ μˆ˜μ •ν•΄λ„ git diff λͺ…령을 μ‚¬μš©ν•  수 μžˆλ‹€. μ΄λ•ŒλŠ” Staged μƒνƒœμΈ 것과 Unstaged μƒνƒœμΈ 것을 λΉ„κ΅ν•œλ‹€.

$ git add CONTRIBUTING.md
$ echo '# test line' >> CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   CONTRIBUTING.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

git diff λͺ…λ ΉμœΌλ‘œ Unstaged μƒνƒœμΈ λ³€κ²½ 뢀뢄을 확인할 수 μžˆλ‹€.

$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 643e24f..87f08c8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -119,3 +119,4 @@ at the
 ## Starter Projects

 See our [projects list](https://github.com/libgit2/libgit2/blob/development/PROJECTS.md).
+# test line

Staged μƒνƒœμΈ νŒŒμΌμ€ git diff --cached μ˜΅μ…˜μœΌλ‘œ ν™•μΈν•œλ‹€. --staged 와 --cached λŠ” 같은 μ˜΅μ…˜μ΄λ‹€.

$ git diff --cached
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
 Please include a nice description of your changes when you submit your PR;
 if we have to read the whole diff to figure out why you're contributing
 in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.

 If you are starting to work on a particular area, feel free to submit a PR
 that highlights your work in progress (and note in the PR title that it's
Note
μ™ΈλΆ€ λ„κ΅¬λ‘œ λΉ„κ΅ν•˜κΈ°

이 μ±…μ—μ„œλŠ” 계속 git diff λͺ…λ ΉμœΌλ‘œ μ—¬κΈ°μ €κΈ°μ„œ 써 λ¨ΉλŠ”λ‹€. 즐겨 μ“°κ±°λ‚˜ κ²°κ³Όλ₯Ό μ•„λ¦„λ‹΅κ²Œ λ³΄μ—¬μ£ΌλŠ” Diff 도ꡬ가 있으면 μ‚¬μš©ν•  수 μžˆλ‹€. git diff λŒ€μ‹  git difftool λͺ…령을 μ‚¬μš©ν•΄μ„œ emerge, vimdiff 같은 λ„κ΅¬λ‘œ 비ꡐ할 수 μžˆλ‹€. μƒμš© μ œν’ˆλ„ μ‚¬μš©ν•  수 μžˆλ‹€. git difftool --tool-help λΌλŠ” λͺ…령은 μ‚¬μš©κ°€λŠ₯ν•œ 도ꡬλ₯Ό 보여쀀닀.

변경사항 μ»€λ°‹ν•˜κΈ°

μˆ˜μ •ν•œ 것을 μ»€λ°‹ν•˜κΈ° μœ„ν•΄ Staging Area에 νŒŒμΌμ„ μ •λ¦¬ν–ˆλ‹€. Unstaged μƒνƒœμ˜ νŒŒμΌμ€ μ»€λ°‹λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 κΈ°μ–΅ν•΄μ•Ό ν•œλ‹€. Git은 μƒμ„±ν•˜κ±°λ‚˜ μˆ˜μ •ν•˜κ³  λ‚˜μ„œ git add λͺ…λ ΉμœΌλ‘œ μΆ”κ°€ν•˜μ§€ μ•Šμ€ νŒŒμΌμ€ μ»€λ°‹ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·Έ νŒŒμΌμ€ μ—¬μ „νžˆ Modified μƒνƒœλ‘œ 남아 μžˆλ‹€. μ»€λ°‹ν•˜κΈ° 전에 git status λͺ…λ ΉμœΌλ‘œ λͺ¨λ“  것이 Staged μƒνƒœμΈμ§€ 확인할 수 μžˆλ‹€. κ·Έ 후에 git commit 을 μ‹€ν–‰ν•˜μ—¬ μ»€λ°‹ν•œλ‹€.

$ git commit

Git 섀정에 μ§€μ •λœ νŽΈμ§‘κΈ°κ°€ μ‹€ν–‰λ˜κ³ , μ•„λž˜μ™€ 같은 ν…μŠ€νŠΈκ°€ μžλ™μœΌλ‘œ ν¬ν•¨λœλ‹€ (μ•„λž˜ μ˜ˆμ œλŠ” Vim νŽΈμ§‘κΈ°μ˜ 화면이닀. 이 νŽΈμ§‘κΈ°λŠ” μ‰˜μ˜ EDITOR ν™˜κ²½ λ³€μˆ˜μ— λ“±λ‘λœ νŽΈμ§‘κΈ°μ΄κ³  보톡은 Vimμ΄λ‚˜ Emacs을 μ‚¬μš©ν•œλ‹€. 또 ch01-getting-started.asc μ—μ„œ μ„€λͺ…ν–ˆλ“―이 git config --global core.editor λͺ…λ ΉμœΌλ‘œ μ–΄λ–€ νŽΈμ§‘κΈ°λ₯Ό μ‚¬μš©ν• μ§€ μ„€μ •ν•  수 μžˆλ‹€).

νŽΈμ§‘κΈ°λŠ” μ•„λž˜μ™€ 같은 λ‚΄μš©μ„ ν‘œμ‹œν•œλ‹€(μ•„λž˜ μ˜ˆμ œλŠ” Vim νŽΈμ§‘κΈ°).

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
#	new file:   README
#	modified:   CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C

μžλ™μœΌλ‘œ μƒμ„±λ˜λŠ” 컀밋 λ©”μ‹œμ§€μ˜ 첫 라인은 λΉ„μ–΄ 있고 λ‘˜μ§Έ 라인뢀터 git status λͺ…λ Ήμ˜ κ²°κ³Όκ°€ μ±„μ›Œμ§„λ‹€. μ»€λ°‹ν•œ λ‚΄μš©μ„ μ‰½κ²Œ κΈ°μ–΅ν•  수 μžˆλ„λ‘ 이 λ©”μ‹œμ§€λ₯Ό 포함할 μˆ˜λ„ 있고 λ©”μ‹œμ§€λ₯Ό μ „λΆ€ μ§€μš°κ³  μƒˆλ‘œ μž‘μ„±ν•  수 μžˆλ‹€ (μ •ν™•νžˆ 뭘 μˆ˜μ •ν–ˆλŠ”μ§€λ„ 보여쀄 수 μžˆλŠ”λ°, git commit 에 -v μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λ©΄ νŽΈμ§‘κΈ°μ— diff λ©”μ‹œμ§€λ„ μΆ”κ°€λœλ‹€). λ‚΄μš©μ„ μ €μž₯ν•˜κ³  νŽΈμ§‘κΈ°λ₯Ό μ’…λ£Œν•˜λ©΄ Git은 μž…λ ₯된 λ‚΄μš©(#둜 μ‹œμž‘ν•˜λŠ” λ‚΄μš©μ„ μ œμ™Έν•œ)으둜 μƒˆ 컀밋을 ν•˜λ‚˜ μ™„μ„±ν•œλ‹€.

λ©”μ‹œμ§€λ₯Ό 인라인으둜 첨뢀할 μˆ˜λ„ μžˆλ‹€. commit λͺ…령을 μ‹€ν–‰ν•  λ•Œ μ•„λž˜μ™€ 같이 -m μ˜΅μ…˜μ„ μ‚¬μš©ν•œλ‹€.

$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
 2 files changed, 2 insertions(+)
 create mode 100644 README

μ΄λ ‡κ²Œ 첫번째 컀밋을 μž‘μ„±ν•΄λ³΄μ•˜λ‹€. commit λͺ…령은 λͺ‡ 가지 정보λ₯Ό 좜λ ₯ν•˜λŠ”λ° μœ„ μ˜ˆμ œλŠ” (master) λΈŒλžœμΉ˜μ— μ»€λ°‹ν–ˆκ³  체크섬은 (463dc4f)이라고 μ•Œλ €μ€€λ‹€. 그리고 μˆ˜μ •ν•œ 파일이 λͺ‡ 개이고 μ‚­μ œλκ±°λ‚˜ μΆ”κ°€λœ 라인이 λͺ‡ 라인인지 μ•Œλ €μ€€λ‹€.

Git은 Staging Area에 μ†ν•œ μŠ€λƒ…μƒ·μ„ μ»€λ°‹ν•œλ‹€λŠ” 것을 κΈ°μ–΅ν•΄μ•Ό ν•œλ‹€. μˆ˜μ •μ€ ν–ˆμ§€λ§Œ, 아직 Staging Area에 넣지 μ•Šμ€ 것은 λ‹€μŒμ— 컀밋할 수 μžˆλ‹€. 컀밋할 λ•Œλ§ˆλ‹€ ν”„λ‘œμ νŠΈμ˜ μŠ€λƒ…μƒ·μ„ κΈ°λ‘ν•˜κΈ° λ•Œλ¬Έμ— λ‚˜μ€‘μ— μŠ€λƒ…μƒ·λΌλ¦¬ λΉ„κ΅ν•˜κ±°λ‚˜ μ˜ˆμ „ μŠ€λƒ…μƒ·μœΌλ‘œ 되돌릴 수 μžˆλ‹€.

Staging Area μƒλž΅ν•˜κΈ°

Staging AreaλŠ” 컀밋할 νŒŒμΌμ„ μ •λ¦¬ν•œλ‹€λŠ” μ μ—μ„œ 맀우 μœ μš©ν•˜μ§€λ§Œ λ³΅μž‘ν•˜κΈ°λ§Œ ν•˜κ³  ν•„μš”ν•˜μ§€ μ•Šμ€ λ•Œλ„ μžˆλ‹€. μ•„μ£Ό μ‰½κ²Œ Staging Areaλ₯Ό μƒλž΅ν•  수 μžˆλ‹€. git commit λͺ…령을 μ‹€ν–‰ν•  λ•Œ -a μ˜΅μ…˜μ„ μΆ”κ°€ν•˜λ©΄ Git은 Tracked μƒνƒœμ˜ νŒŒμΌμ„ μžλ™μœΌλ‘œ Staging Area에 λ„£λŠ”λ‹€. κ·Έλž˜μ„œ git add λͺ…령을 μ‹€ν–‰ν•˜λŠ” 수고λ₯Ό 덜 수 μžˆλ‹€.

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks
 1 file changed, 5 insertions(+), 0 deletions(-)

이 μ˜ˆμ œμ—μ„œλŠ” μ»€λ°‹ν•˜κΈ° 전에 git add λͺ…λ ΉμœΌλ‘œ CONTRIBUTING.md νŒŒμΌμ„ μΆ”κ°€ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” 점을 λˆˆμ—¬κ²¨λ³΄μž. -a μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λͺ¨λ“  파일이 μžλ™μœΌλ‘œ μΆ”κ°€λœλ‹€. νŽΈλ¦¬ν•œ μ˜΅μ…˜μ΄κΈ΄ ν•˜μ§€λ§Œ 주의 깊게 μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 생각 없이 이 μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ‹€ 보면 μΆ”κ°€ν•˜μ§€ 말아야 ν•  변경사항도 좔가될 수 있기 λ•Œλ¬Έμ΄λ‹€.

파일 μ‚­μ œν•˜κΈ°

Gitμ—μ„œ νŒŒμΌμ„ μ œκ±°ν•˜λ €λ©΄ git rm λͺ…λ ΉμœΌλ‘œ Tracked μƒνƒœμ˜ νŒŒμΌμ„ μ‚­μ œν•œ 후에(μ •ν™•ν•˜κ²ŒλŠ” Staging Areaμ—μ„œ μ‚­μ œν•˜λŠ” 것) 컀밋해야 ν•œλ‹€. 이 λͺ…령은 μ›Œν‚Ή 디렉토리에 μžˆλŠ” νŒŒμΌλ„ μ‚­μ œν•˜κΈ° λ•Œλ¬Έμ— μ‹€μ œλ‘œ νŒŒμΌλ„ μ§€μ›Œμ§„λ‹€.

Git λͺ…령을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ‹¨μˆœνžˆ μ›Œν‚Ή λ””λ ‰ν„°λ¦¬μ—μ„œ νŒŒμΌμ„ μ‚­μ œν•˜κ³  git status λͺ…λ ΉμœΌλ‘œ μƒνƒœλ₯Ό ν™•μΈν•˜λ©΄ Git은 ν˜„μž¬ β€œChanges not staged for commit” (즉, Unstaged μƒνƒœ)라고 ν‘œμ‹œν•΄μ€€λ‹€.

$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    PROJECTS.md

no changes added to commit (use "git add" and/or "git commit -a")

그리고 git rm λͺ…령을 μ‹€ν–‰ν•˜λ©΄ μ‚­μ œν•œ νŒŒμΌμ€ Staged μƒνƒœκ°€ λœλ‹€.

$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    PROJECTS.md

μ»€λ°‹ν•˜λ©΄ νŒŒμΌμ€ μ‚­μ œλ˜κ³  Git은 이 νŒŒμΌμ„ λ”λŠ” μΆ”μ ν•˜μ§€ μ•ŠλŠ”λ‹€. 이미 νŒŒμΌμ„ μˆ˜μ •ν–ˆκ±°λ‚˜ Staging Area에(μ—­μ£Ό - Git Index라고도 λΆ€λ₯Έλ‹€) μΆ”κ°€ν–ˆλ‹€λ©΄ -f μ˜΅μ…˜μ„ μ£Όμ–΄ κ°•μ œλ‘œ μ‚­μ œν•΄μ•Ό ν•œλ‹€. 이 점은 μ‹€μˆ˜λ‘œ 데이터λ₯Ό μ‚­μ œν•˜μ§€ λͺ»ν•˜λ„둝 ν•˜λŠ” μ•ˆμ „μž₯μΉ˜λ‹€. 컀밋 ν•˜μ§€ μ•Šκ³  μˆ˜μ •ν•œ λ°μ΄ν„°λŠ” Git으둜 볡ꡬ할 수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

또 Staging Areaμ—μ„œλ§Œ μ œκ±°ν•˜κ³  μ›Œν‚Ή 디렉토리에 μžˆλŠ” νŒŒμΌμ€ μ§€μš°μ§€ μ•Šκ³  λ‚¨κ²¨λ‘˜ 수 μžˆλ‹€. λ‹€μ‹œ λ§ν•΄μ„œ ν•˜λ“œλ””μŠ€ν¬μ— μžˆλŠ” νŒŒμΌμ€ κ·ΈλŒ€λ‘œ 두고 Git만 μΆ”μ ν•˜μ§€ μ•Šκ²Œ ν•œλ‹€. 이것은 .gitignore νŒŒμΌμ— μΆ”κ°€ν•˜λŠ” 것을 λΉΌλ¨Ήμ—ˆκ±°λ‚˜ λŒ€μš©λŸ‰ 둜그 νŒŒμΌμ΄λ‚˜ 컴파일된 파일인 .a 파일 같은 것을 μ‹€μˆ˜λ‘œ μΆ”κ°€ν–ˆμ„ λ•Œ μ“΄λ‹€. --cached μ˜΅μ…˜μ„ μ‚¬μš©ν•˜μ—¬ λͺ…령을 μ‹€ν–‰ν•œλ‹€.

$ git rm --cached README

μ—¬λŸ¬ 개의 νŒŒμΌμ΄λ‚˜ 디렉토리λ₯Ό ν•œκΊΌλ²ˆμ— μ‚­μ œν•  μˆ˜λ„ μžˆλ‹€. μ•„λž˜μ™€ 같이 git rm λͺ…령에 file-glob νŒ¨ν„΄μ„ μ‚¬μš©ν•œλ‹€.

$ git rm log/\*.log

* μ•žμ— \ 을 μ‚¬μš©ν•œ 것을 κΈ°μ–΅ν•˜μž. 파일λͺ… ν™•μž₯ κΈ°λŠ₯은 μ‰˜μ—λ§Œ μžˆλŠ” 것이 μ•„λ‹ˆλΌ Git μžμ²΄μ—λ„ 있기 λ•Œλ¬Έμ— ν•„μš”ν•˜λ‹€. 이 λͺ…령은 log/ 디렉토리에 μžˆλŠ” .log νŒŒμΌμ„ λͺ¨λ‘ μ‚­μ œν•œλ‹€. μ•„λž˜μ˜ 예제처럼 ν•  μˆ˜λ„ μžˆλ‹€.

$ git rm \*~

이 λͺ…령은 ~ 둜 λλ‚˜λŠ” νŒŒμΌμ„ λͺ¨λ‘ μ‚­μ œν•œλ‹€.

파일 이름 λ³€κ²½ν•˜κΈ°

Git은 λ‹€λ₯Έ VCS μ‹œμŠ€ν…œκ³ΌλŠ” 달리 파일 μ΄λ¦„μ˜ λ³€κ²½μ΄λ‚˜ 파일의 이동을 λͺ…μ‹œμ μœΌλ‘œ κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ”λ‹€. λ‹€μ‹œ λ§ν•΄μ„œ 파일 이름이 λ³€κ²½λλ‹€λŠ” λ³„λ„μ˜ 정보λ₯Ό μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. Git은 λ˜‘λ˜‘ν•΄μ„œ ꡳ이 파일 이름이 λ³€κ²½λ˜μ—ˆλ‹€λŠ” 것을 μΆ”μ ν•˜μ§€ μ•Šμ•„λ„ μ•„λŠ” 방법이 μžˆλ‹€. 파일의 이름이 λ³€κ²½λœ 것을 Git이 μ–΄λ–»κ²Œ μ•Œμ•„λ‚΄λŠ”μ§€ μ‚΄νŽ΄λ³΄μž.

μ΄λ ‡κ²Œ λ§ν•˜κ³  Git에 mv λͺ…령이 μžˆλŠ” 게 μ’€ μ΄μƒν•˜κ² μ§€λ§Œ, μ•„λž˜μ™€ 같이 파일 이름을 λ³€κ²½ν•  수 μžˆλ‹€.

$ git mv file_from file_to

잘 λ™μž‘ν•œλ‹€. 이 λͺ…령을 μ‹€ν–‰ν•˜κ³  Git의 μƒνƒœλ₯Ό 확인해보면 Git은 이름이 바뀐 사싀을 μ•Œκ³  μžˆλ‹€.

$ git mv README.md README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

사싀 git mv λͺ…령은 μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•œ 것과 μ™„μ „ λ˜‘κ°™λ‹€.

$ mv README.md README
$ git rm README.md
$ git add README

git mv λͺ…령은 μΌμ’…μ˜ 단좕 λͺ…령어이닀. 이 λͺ…λ ΉμœΌλ‘œ 파일 이름을 바꿔도 되고 mv λͺ…λ ΉμœΌλ‘œ 파일 이름을 직접 바꿔도 λœλ‹€. 단지 git mv λͺ…령은 νŽΈλ¦¬ν•˜κ²Œ λͺ…령을 μ„Έ 번 μ‹€ν–‰ν•΄μ£ΌλŠ” 것 뿐이닀. μ–΄λ–€ λ„κ΅¬λ‘œ 이름을 바꿔도 상관없닀. μ€‘μš”ν•œ 것은 이름을 λ³€κ²½ν•˜κ³  λ‚˜μ„œ κΌ­ rm/add λͺ…령을 μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€λŠ” 것 뿐이닀.