[Git] git status, add, commit, rm - Git 기초(3)

파일의 상태 확인하기

git status 명령어를 사용하면 파일의 상태를 확인할 수 있다. 예를 들어 빈 프로젝트에서 이 명령을 실행하면 다음과 같은 메시지를 볼 수 있다.

 

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

 

위의 내용은 파일을 하나도 수정하지 않았다는 뜻이다. 특히 Tracked 파일, 즉 추적 중인 파일이 하나도 수정되지 않았다는 뜻이다. 현재 작업 중인 브랜치는 master 브랜치이며 해당 브랜치에서 진행된 작업이 없다는 것을 알 수 있다. 브랜치 개념은 후에 기술하도록 하겠다.

 

 

프로젝트에 새로운 파일을 하나 만들자. 예를 들어 README 파일을 하나 만들고 git status를 실행하면 다음과 같은 결과가 나온다.

 

$ 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 file로 분류된다. 이전 게시글에서 설명했듯이, 해당 파일이 Untracked 상태라는 뜻이다. Git 은 Tracked 상태의 파일만 Commit하게 된다. 

 

 

파일을 새로 추적하기

git add 명령으로 파일을 새로 추적할 수 있다. 예를 들어 

 

$ git add README

 

위와 같은 명령어를 실행하면 README 파일을 추적할 수 있다. 이때 다시 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 to be committed"는 커밋할 수 있는 상태, 즉 Staged 상태라는 뜻이다. 이 상태로 커밋하게 되면 git add를 실행한 시점의 파일이 커밋되고 저장소 히스토리에 남는다. git add 명령은 파일 또는 디렉터리의 경로를 인자로 받는다. 특히, 디렉터리의 경우 그 아래의 모든 파일들까지 추가한다.

 

 

Modified 상태의 파일 Stage 하기

 

이미 Tracked 상태인 파일을 수정했을 때 Stage하는 방법을 알아보자. 예를 들어 프로젝트에 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 파일을 더 수정할 일이 생겨서 바로 커밋하지 않고 CONTRIBUTING.md 파일을 다시 수정한다면 어떻게 될까?

 

$ 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 add 명령을 다시 실행하면 된다.

 

 

변경사항 커밋하기

Staging Aread에 파일을 정리했다면 이제 커밋할 차례이다. Unstaged 상태의 파일은 커밋되지 않는다는 사실을 유념하자. 

 

$ git commit

 

 위와 같이 git commit 명령을 실행하면 Git 설정에 등록된 편집기가 실행된다. 

 

# 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

 

위 예제는 Vim 편집기의 화면이다. 자동으로 생성되는 커밋 메시지의 첫 라인은 비어있는데, 이곳에 커밋 메시지를 기록할 수 있다. 내용을 저장하고 편집기를 종료하면 Git은 입력된 내용으로 새 커밋을 완성한다.

 

 

-m 옵션을 사용하여 메시지를 인라인으로 첨부할 수도 있다. 보통 이렇게 -m 옵션을 사용하는 경우가 많다. 

 

$ git commit -m "2022.08.22 bug fixed"
[master 463dc4f] 2022.08.22 bug fixed
 2 files changed, 2 insertions(+)
 create mode 100644 README

 

git commit 명령은 어떤 브랜치에 커밋했는지, 체크섬이 무엇인지, 수정한 파일이 몇 개인지, 삭제됐거나 추가된 라인이 몇 라인인지 등의 정보를 출력한다.

 

Git은 Staging Area에 속한 스냅샷(해당 시점)을 커밋한다는 사실을 기억하자. 커밋할 대마다 프로젝트의 스냅숏을 기록하기 때문에 나중에 스냅숏끼리 비교하거나 예전 스냅숏으로 상태를 되돌릴 수 있다.

 

 

 

Staging Area 를 생략하고 아래와 같은 -a 옵션을 사용할 수도 있다.

 

$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks
 1 file changed, 5 insertions(+), 0 deletions(-)

 

-a 옵션을 사용하면 모든 파일이 자동으로 Staging Area에 들어가기 때문에 git add 명령을 실행하지 않아도 된다. 하지만 이 옵션은 추가하지 말아야 할 변경사항도 추가될 수 있으므로 사용에 주의를 기울여야 한다.

 

 

파일 제거하기

Git에서 파일을 제거하려면 git rm 명령을 사용해 Staging Area에서 삭제한 후 커밋해야 한다. 이 명령은  Working directory의 파일도 삭제하므로 실제 파일도 삭제된다.

 

Git 명령을 사용하지 않고 Working Directory에서 바로 파일을 삭제하고 git status 명령을 실행하면 다음과 같은 결과가 나온다.

 

$ 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에 추가했다면

 -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 \*~

 

이 명령은 ~ 로 끝나는 파일을 모두 삭제한다.

 


참고

 

1. https://git-scm.com/book/ko/v2

반응형

댓글

Designed by JB FACTORY