VCS/Git

[Pro Git] 2-2. Git의 기초: 수정하고 저장소에 저장하기

noahkim_ 2024. 1. 14. 18:14

Scott Chacon & Ben Straub 님의 "Pro Git" 책을 정리한 포스팅 입니다.

 

1. 수정하고 저장소에 저장하기

파일의 상태

파일의 라이프사이클

Tracked (unmodified, modified, staged)
  • 이미 스냅샷에 포함돼 있던 파일입니다.
  • 처음 저장소를 clone하면, 모든 파일은 tracked-unmodifed 상태입니다.

 

Untracked
  • Staging area에 포함되어 있지 않은 파일입니다.

 

상태 확인

git status

 

 

Untracked 상태의 파일을 Stage (새로 추적)

git add README # 파일 또는 디렉토리 경로를 인자로 받습니다.
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   README
'Changes to be committed'
  • staged 상태의 파일을 리스트업 합니다.

 

Tracked-modified 상태의 파일을 Staging

git add CONTRIBUTING.md # 파일 또는 디렉토리 경로를 인자로 받습니다.
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   CONTRIBUTING.md
'Changes not staged for commit'
  • modified 상태의 파일을 리스트업 합니다.
    • Tracked 상태이지만 staged 상태는 아닌 파일

 

파일 상태를 짤막하게 확인

git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt
컬럼
  • 영역별 상태를 표기합니다.
    • 왼쪽 : Working Directory
    • 오른쪽 : Staging Area

 

상태
  • A : Staged 상태 (새로 생성한 파일)
  • M : Modified 상태
  • ?? : git이 추적하지 않는 새 파일입니다.

 

파일 무시

  • git의 관리를 받지 않으려는 파일을 지정할 수 있습니다.
    • 로그파일, 빌드 시스템이 생성한 메타데이터 등
  • .gitignore 파일에 무시할 파일의 패턴을 적습니다.
$ cat .gitignore
*.[oa] # 확장자가 ".o"나 ".a"인 파일을 무시하라 (빌드 시스템이 만드는 오브젝트, 아카이브 파일)
*~     # '~'로 끝나는 모든 파일을 무시하라 (Emacs 같은 텍스트 편집기가 임시로 만드는 파일)

 

 

규칙
  • 슬래시로 시작하면 하위 디렉토리에 적용되지 않는다.
  • 디렉토리는 슬래시를 끝에 사용하는 것으로 표현한다.
  • 느낌표로 시작하는 패턴의 파일은 무시하지 않는다.
# 확장자가 .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 diff
git diff
  • 마지막 커밋된 상태와 modified 상태의 차이를 보는 명령어 입니다.
  • 아직 staging area에 추가되지 않은 파일이 대상입니다.

 

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md 	# 변경전 버전 | 변경후 버전
index 5095bda..771378f 100644			# 변경전 체크섬 | 변경후 체크섬 | 파일 권한
--- a/CONTRIBUTING.md				# --- : 변경전 파일의 경로와 이름
+++ b/CONTRIBUTING.md				# +++ : 변경후 파일의 경로와 이름
@@ -1 +1 @@					# 허프 헤더 : 변경이 발생한 파일 내의 특정 영역
-My Project2-1					# 원본 파일 내용 : 이전 내용
+My Project2					# 새 파일 내용 : 변경된 내용

 

git diff --staged(cached)
git diff --staged
git diff --cached
  • 마지막 커밋된 상태와 staging area에 있는 파일의 차이를 보는 명령어 입니다.

 

커밋

git commit -m "커밋 메시지"
  • staged 파일을 스냅샷을 떠서 데이터베이스에 저장합니다.

 

$ 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
  • 체크섬 : 463dc4f
  • 수정한 파일 및 추가된 라인 : 2 files changed, 2 insertions(+)

 

git commit -am "커밋 메시지"
  • tracked 상태의 파일을 모두 staging area로 옮기고, 커밋을 수행합니다.

 

파일 삭제

git rm
  • 파일을 Working Directory에서 삭제하고 해당 삭제 내용을 Staging Area에 추가합니다.

 

파일 이름 변경

git mv
  • 파일의 이름을 변경하거나 위치를 이동할 때 사용합니다.

 

 

 

출처