[Git] 수정 & 저장소에 저장

Tracked or Untracked

워킹 디렉토리의 모든 파일은 크게 두 가지 상태로 구분할 수 있다.

  • Tracked → 이미 스냅샷에 포함되어 있는 파일이다.
    • Modified → 수정되어 기존 스냅샷과 달라진 파일
    • Unmodified → 수정되지 않아 기존 스냅샷과 동일한 파일.
  • Untracked → 스냅샷에도, Staging 되지도 않은 파일이다.

Untitled

상태의 라이프사이클은 위와 같다. Tracked ↔ Untracked를 제외하면, 나머지 부분에서는 그저 수정과 commit을 반복하는 과정이다.


파일의 상태 확인하기

$ git status

디렉토리의 파일 상태를 확인할 수 있다. 추적되지 않는 파일, 변경 된 파일, 커밋 대기중인 파일 등이 표시된다. 참고로 “Changes to be committed”는 staged 상태임을 의미한다.

git add명령어는 새로운 파일을 추적하거나 수정한 파일을 staged 상태로 변경한다. 다음 커밋에 추가한다는 의미로 받아들이자. 만약 ‘git add’이후에 새로 파일을 수정했다면, 다시 한번 git add명령을 실행해서 최신 버전을 staged 상태로 변경해야한다.

$ git diff

단순히 파일의 상태가 변경되었다는 사실이 아니라, 어떤 내용이 변경되었는지 살펴보고자 한다면 git diff를 사용한다. 변경 전후를 비교할 수 있다.

Untitled

주의할 점은, git diff는 unstaged상태인 것들만 보여준다는 것이다. 커밋을 위해 Staging Area에 넣은 파일의 변경부분을 보고싶다면, git diff --staged or git diff --cached옵션을 사용하면 된다.


.gitignore

굳이 버전관리가 필요하지 않은 로그파일이나 임시 파일들은 gitignore을 통해 무시할 수 있다. 입력 패턴과 규칙은 아래와 같다.

  • 아무것도 없는 라인이나, #로 시작하는 라인은 무시한다.
  • 표준 Glob 패턴을 사용한다. 이는 프로젝트 전체에 적용된다.
  • 슬래시(/)로 시작하면 하위 디렉토리에 적용되지(Recursivity) 않는다.
  • 디렉토리는 슬래시(/)를 끝에 사용하는 것으로 표현한다.
  • 느낌표(!)로 시작하는 패턴의 파일은 무시하지 않는다.

예를 들어보자

# 확장자가 .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

보통은 최상위 디렉토리에 gitignore를 두고 하위 디렉토리에도 적용하여 사용하지만, 하위 디렉토리에도 추가로 gitignore를 둘 수 있다.


Commit

수정사항을 Staging Area에 정리했다면, 이제는 커밋할 차례이다.

# 일반 commit
$ git commit
# diff 옵션을 추가한 commit
$ git commit -v 
# 메세지를 인라인으로 첨가한 commit
$ git commit -m "추가할 메세지" 
# Tracked 상태의 파일을 자동으로 Staging 후 commit
$ git commit -a 

커밋시 git 설정에 지정된 편집기가 실행되는데, 이 때 커밋에 포함할 메세지를 적을 수 있다.


파일 삭제

# tracked된 상태의 파일 삭제(Staging Area에서 삭제)
$ git rm
# 파일의 강제 삭제
$ git rm -f
# Staging area에서는 삭제하되, 디렉토리에는 놔둘 때
$ git rm --cached
# 여러 개의 파일이나 디렉토리를 한 번에 삭제할 때
$ git rm log/\*.log

git rm은 tracked 상태인 파일을 리스트에서 지울 뿐 만 아니라, 워킹 디렉토리에 있는 파일도 삭제한다.

git을 사용하지 않고 해당 디렉토리에서 바로 파일을 삭제하면 어떻게 될까? git status로 확인해보면 Unstaged상태인 것을 확인할 수 있다. 이 상태에서 git rm명령어를 실행하면 파일이 staged상태로 변하는데, 커밋하면 파일은 삭제되고 git은 이 파일을 더 추적하지 않는다.


파일 이름 변경

# 이름을 변경할 때 사용하는 명령어
$ git mv README.md README

# 아래의 명령어들을 차례대로 수행한 것과 같다.
$ mv README.md README
$ git rm README.md
$ git add README

사실 git은 파일의 이름이 변경되었다는 별도의 정보를 저장하지 않는다. 대신에 다른 방법을 사용하여 이름을 변경할 수 있다. 해당 방법을 사용한 후에는 반드시 rm/add 명령어로 추적 정보를 수정해야 한다.

참고자료