πŸ‘Ύ git μ™„λ²½ 정볡 - commit

2021λ…„ 5μ›” 9일

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

이번 ν¬μŠ€νŒ…μ—λŠ” Staged μƒνƒœμΈ νŒŒμΌλ“€μ„ μ €μž₯μ†Œμ— commit ν•˜κ³  κ΄€λ¦¬ν•΄λ³΄λŠ” λ‚΄μš©μ„ ν¬μŠ€νŒ…ν•˜λ €κ³ ν•©λ‹ˆλ‹€ !

Git Commit

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

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

$ git commit

git_commit

μžλ™μœΌλ‘œ μƒμ„±λ˜λŠ” 컀밋 λ©”μ‹œμ§€μ˜ 첫 라인은 λΉ„μ–΄ 있고 λ‘˜μ§Έ 라인뢀터 git status λͺ…λ Ήμ˜ κ²°κ³Όκ°€ μ±„μ›Œμ§‘λ‹ˆλ‹€. μ»€λ°‹ν•œ λ‚΄μš©μ„ μ‰½κ²Œ κΈ°μ–΅ν•  수 μžˆλ„λ‘ 이 λ©”μ‹œμ§€λ₯Ό 포함할 μˆ˜λ„ 있고 λ©”μ‹œμ§€λ₯Ό μ „λΆ€ μ§€μš°κ³  μƒˆλ‘œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄μš©μ„ μ €μž₯ν•˜κ³  νŽΈμ§‘κΈ°λ₯Ό μ’…λ£Œν•˜λ©΄ Git은 μž…λ ₯된 λ‚΄μš©μœΌλ‘œ μƒˆ 컀밋을 ν•˜λ‚˜ μ™„μ„±ν•©λ‹ˆλ‹€.

git_commit1

λ©”μ‹œμ§€λ₯Ό 직접 인라인으둜 μ²¨λΆ€ν•˜κ³  μ‹Άλ‹€λ©΄ -m μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.

$ git commit -m "message"

git_commit2

μœ„μ™€ 같이 첫번째 컀밋을 μž‘μ„±ν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€. commit λͺ…령은 λͺ‡ 가지 정보λ₯Ό 좜λ ₯ν•˜λŠ”λ° 1) master branch에 컀밋을 ν–ˆκ³ , 2) 체크섬은 2305efd λΌλŠ” 것을 μ•Œλ €μ€λ‹ˆλ‹€. 그리고 μˆ˜μ •ν•œ 파일이 λͺ‡κ°œμ΄κ³  μ‚­μ œλκ±°λ‚˜ μΆ”κ°€λœ 라인이 λͺ‡ 라인인지 μ•Œλ €μ€λ‹ˆλ‹€.

Git은 Staging Area에 μ†ν•œ μŠ€λƒ…μƒ·λ§Œμ„ μ»€λ°‹ν•΄μ•Όν•œλ‹€λŠ” 것을 λͺ…심해야 ν•©λ‹ˆλ‹€. 즉, μˆ˜μ •μ€ ν–ˆμ§€λ§Œ 아직 Staging Area에 넣지 μ•Šμ€ 것은 λ‹€μŒμ— 컀밋을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μΆ”κ°€λ‘œ 컀밋할 λ•Œλ§ˆλ‹€ ν”„λ‘œμ νŠΈμ˜ μŠ€νƒ­μƒ·μ„ κΈ°λ‘ν•˜κΈ° λ•Œλ¬Έμ— λ‚˜μ€‘μ— μŠ€λƒ…μƒ·λΌλ¦¬ λΉ„κ΅ν•˜κ±°λ‚˜ μ˜ˆμ „ μŠ€λƒ…μƒ·μœΌλ‘œ 되돌릴 수 μžˆμŠ΅λ‹ˆλ‹€.

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

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

git_commit_3

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

Git μ—μ„œ νŒŒμΌμ„ μ œκ±°ν•˜λ €λ©΄ git rm λͺ…λ ΉμœΌλ‘œ Tracked μƒνƒœμ˜ νŒŒμΌμ„ μ‚­μ œν•œ ν›„ 컀밋해야 ν•©λ‹ˆλ‹€. 이 λͺ…령은 working directory에 μžˆλŠ” νŒŒμΌλ„ μ‚­μ œν•˜κΈ° λ•Œλ¬Έμ— μ‹€μ œλ‘œ νŒŒμΌλ„ μ§€μ›Œμ§‘λ‹ˆλ‹€.

μ»€λ°‹ν•˜λ©΄ νŒŒμΌμ€ μ‚­μ œλ˜κ³  Git은 이 νŒŒμΌμ„ 더이상 μΆ”μ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이미 νŒŒμΌμ„ μˆ˜μ •ν–ˆκ±°λ‚˜, μˆ˜μ •ν•œ νŒŒμΌμ„ μΆ”μ ν•˜κ³  μžˆλ‹€λ©΄ -f μ˜΅μ…˜μ„ μ£Όμ–΄ κ°•μ œλ‘œ μ‚­μ œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

또, Staging Areaμ—μ„œλ§Œ μ œκ±°ν•˜κ³  working Directory에 μžˆλŠ” νŒŒμΌμ€ μ§€μš°μ§€ μ•Šκ³  λ‚¨κ²¨λ‘˜ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œλ§ν•΄μ„œ ν•˜λ“œλ””μŠ€ν¬μ— μžˆλŠ” νŒŒμΌμ€ κ·ΈλŒ€λ‘œ 두고 Git만 μΆ”μ ν•˜μ§€ μ•Šκ²Œ ν•©λ‹ˆλ‹€.

=> .gitignore νŒŒμΌμ— μΆ”κ°€ν•˜λŠ” 것을 λΉΌλ¨Ήμ—ˆλ‹€κ±°λ‚˜, λŒ€μš©λŸ‰ 둜그 νŒŒμΌμ΄λ‚˜ 컴파일된 파일인 .a 파일 같은 것을 μ‹€μˆ˜λ‘œ μΆ”κ°€ν–ˆμ„ λ•Œ μ•„μ£Ό μœ μš©ν•©λ‹ˆλ‹€.

$ git rm --cached 파일λͺ…

git_rm

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

Git은 파일 μ΄λ¦„μ˜ λ³€κ²½μ΄λ‚˜ 파일의 이동을 λͺ…μ‹œμ μœΌλ‘œ κ΄€λ¦¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ λ§ν•΄μ„œ 파일 이름이 λ³€κ²½λ˜μ—ˆλ‹€λŠ” λ³„λ„μ˜ 정보λ₯Ό μ €μž₯ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

$ git mv file_from file_to

μœ„μ˜ λͺ…λ Ήμ–΄λŠ” μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μˆ˜ν–‰ν•œ 것과 μ™„μ „ λ˜‘κ°™μŠ΅λ‹ˆλ‹€.

$ mv file_from file_to
$ git rm file_from
$ git add file_to

컀밋 νžˆμŠ€ν† λ¦¬ μ‘°νšŒν•˜κΈ°

μƒˆλ‘œ μ €μž₯μ†Œλ₯Ό λ§Œλ“€μ–΄μ„œ λͺ‡ 번 μ»€λ°‹ν–ˆμ„ μˆ˜λ„ 있고, 컀밋 νžˆμŠ€ν† λ¦¬κ°€ μžˆλŠ” μ €μž₯μ†Œλ₯Ό cloneν–ˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ΄λ•Œ 쑰회λ₯Ό ν•  수 μžˆλŠ” git log λͺ…λ Ήμ–΄κ°€ μžˆμŠ΅λ‹ˆλ‹€.

예제
$ git clone https://github.com/schacon/simplegit-progit

μœ„μ˜ ν”„λ‘œμ νŠΈλ₯Ό cloneν•΄μ„œ λ°›μ•„μ˜¨ ν›„ git log λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ μ•„λž˜μ™€ 같이 좜λ ₯λ©λ‹ˆλ‹€.

git_log

νŠΉλ³„ν•œ μ˜΅μ…˜μ—†μ΄ git log λͺ…령을 μ‹€ν–‰ν•˜λ©΄ μ €μž₯μ†Œμ˜ 컀밋 νžˆμŠ€ν† λ¦¬λ₯Ό μ‹œκ°„ 순으둜 λ³΄μ—¬μ€λ‹ˆλ‹€. 그리고 각 μ»€λ°‹μ˜ SHA-1 체크섬, μ €μž 이름, μ €μž 이메일, μ»€λ°‹ν•œ λ‚ μ§œ, 컀밋 λ©”μ‹œμ§€λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

μ›ν•˜λŠ” νžˆμŠ€ν† λ¦¬λ₯Ό 검색할 수 μžˆλ„λ‘ git log λͺ…령은 맀우 λ‹€μ–‘ν•œ μ˜΅μ…˜μ„ μ§€μ›ν•©λ‹ˆλ‹€.

$ git log -p
$ git log -p -2

git_log_p_2

-p μ˜΅μ…˜μ€ 각 μ»€λ°‹μ˜ diff κ²°κ³Όλ§Œμ„ 보여주고 -2 μ˜΅μ…˜μ€ 졜근 2개의 결과만 λ³΄μ—¬μ£ΌλŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.

직접 diffλ₯Ό μ‹€ν–‰ν•œ 것과 같은 κ²°κ³Όλ₯Ό 좜λ ₯ν•˜κΈ° λ•Œλ¬Έμ— λ™λ£Œκ°€ 무엇을 μ»€λ°‹ν–ˆλŠ”μ§€ λ¦¬λ·°ν•˜κ³  μ‘°νšŒν•˜λŠ”λ° μœ μš©ν•©λ‹ˆλ‹€.

또, git log λͺ…λ Ήμ—λŠ” νžˆμŠ€ν† λ¦¬μ˜ 톡계λ₯Ό λ³΄μ—¬μ£ΌλŠ” μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

$ git log --stat

git_log_stat

쑰회 μ œν•œ 쑰건
  1. -n : 졜근 n개의 μ»€λ°‹λ§Œ μ‘°νšŒν•œλ‹€.
  2. --since , --after : λͺ…μ‹œν•œ λ‚ μ§œ μ΄ν›„μ˜ μ»€λ°‹λ§Œ κ²€μƒ‰ν•œλ‹€.
  3. --until, --before : λͺ…μ‹œν•œ λ‚ μ§œ μ΄μ „μ˜ μ»€λ°‹λ§Œ κ²€μƒ‰ν•œλ‹€.
  4. --author : μž…λ ₯ν•œ μ €μžμ˜ μ»€λ°‹λ§Œ 보여쀀닀.
  5. --committer : μž…λ ₯ν•œ μ»€λ―Έν„°μ˜ μ»€λ°‹λ§Œ 보여쀀닀.
  6. --grep : 컀밋 λ©”μ‹œμ§€ μ•ˆμ˜ ν…μŠ€νŠΈλ₯Ό κ²€μƒ‰ν•œλ‹€.
  7. -S: 컀밋 λ³€κ²½(μΆ”κ°€/μ‚­μ œ)λ‚΄μš© μ•ˆμ˜ ν…μŠ€νŠΈλ₯Ό κ²€μƒ‰ν•œλ‹€.

Git 되돌리기

λ§Œμ•½ commit ν•œ λ‚΄μš©μ„ μˆ˜μ •ν•˜κ³  μ‹Άλ‹€λ©΄ --amend μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€. λ°”λ‘œ μ•žμ˜ commit을 μˆ˜μ •ν•  수 μžˆλŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.

$ git commit -m "user info update"
$ git add userInfo
$ git commit --amend 

μ—¬κΈ°μ„œ μ‹€ν–‰ν•œ 3개의 λͺ…λ Ήμ–΄λŠ” λͺ¨λ‘ ν•˜λ‚˜μ˜ commit으둜 κΈ°λ‘λ©λ‹ˆλ‹€.

파일 μƒνƒœλ₯Ό Unstage둜 λ³€κ²½ν•˜κΈ°

이 방법은 Staged Area와 Working Directory 사이λ₯Ό μ œμ–΄ν•  수 μžˆλŠ” λ°©λ²•μž…λ‹ˆλ‹€.

$ git resert HEAD <file> ...

μœ„μ˜ λͺ…λ Ήμ–΄λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή νŒŒμΌμ€ staged μƒνƒœμ—μ„œ unstaged μƒνƒœλ‘œ λ³€κ²½λ©λ‹ˆλ‹€.

λ§Œμ•½ commit ν›„ ν•΄λ‹Ή νŒŒμΌμ„ μˆ˜μ •ν•΄μ•Όν•œλ‹€κ±°λ‚˜, ν•΄λ‹Ή commitμ—μ„œ μ œμ™Έν•΄μ•Όν• λ•Œ μ‚¬μš©ν•˜λ©΄ μœ μš©ν•œ μ˜΅μ…˜μž…λ‹ˆλ‹€!

Modified 파일 되돌리기

μ–΄λ–€ νŒŒμΌμ„ μˆ˜μ •ν–ˆλŠ”λ°, λ‹€μ‹œ 초기 μƒνƒœλ‘œ 되돌리고 싢을 λ–„ μ‚¬μš©ν•˜λŠ” μ˜΅μ…˜μž…λ‹ˆλ‹€.

$ git checkout -- <file>