본문 바로가기
기타/Git

[Git] add

by 코딩하는 랄로 2023. 11. 26.
728x90

파일의 life cycle

Git의 working directory의 모든 파일은 Tracked(관리하고 있는 파일)와 Untracked(관리하지 않는 파일)로 나눈다. 여기서 Tracked 파일이 관리되고 있는 파일이라는 의미는 이미 해당 파일이 스냅샷에 포함된 파일임을 뜻한다.

 

Tracked 파일은 또 Unmodified(수정되지 않음)와 Modified(수정됨) 그리고 Staged 중 하나의 상태를 가진다. 간단하게 staging area에서 커밋을 기다리는 파일이 staged, 커밋 후 수정되지 않은 파일이 unmodified, 커밋 후 수정된 파일이 modified 인 것이다.

 

이 외의 모든 파일은 Untracked 파일로서, working directory 에 있는 파일 중 스냇샵에도 staging area에도 포함되지 않은 파일을 의미한다. Git에서 파일을 관리하다 보면 untracked, unmodified, modified, staged 를 계속 도는 life cycle을 가진다.

 

 

 

git status

git은 현재 워킹 디렉토리에 있는 파일들이 어떠한 상태인지를 확인하기 위한 status 명령어를 제공하고 있다. 먼저 디렉토리를  git init을 통해 git 로컬 저장소로 초기화하고 바로 git status를 출력해보자.( status에 대한 여러 옵션들은 추후에 따로 공부하겠다. )

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy
$ git init
Initialized empty Git repository in D:/GitStudy/.git/

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

 

git status를 출력해보면, 먼저 현재 checkout된 branch는 master임을 출력하고 아직 git init 이후 어떤 것도 하지 않았기 때문에 커밋이 존재하지 않는다고 출력한다. 또한 현재 commit할 파일 또한 없음을 나타내는 nothing to commit을 출력하고 파일을 track 하기 위해서는 git add 를 사용하라는 문구를 띄워주는 것을 볼 수 있다.

 

 

 

git add

git add에 대해서 알아보기 전에 먼저 파일을 하나 생성 후 git status를 통해 출력해보자.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ echo 'Git Status' > file.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        file.txt

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

 

이전과는 다른 메세지를 출력하는 것을 볼 수 있다!! 바뀐 부분을 보면, untracked file에 현재 방금 생성한 file.txt 가 포함된 것을 볼 수 있고 해당 파일을 커밋될 것에 포함시키기 위해서는(= staging area에 올리기 위해서는) git add <file>... 을 사용하라는 문구 또한 볼 수 있다. 아래 문구는 현재 untracked 파일이 존재하지만 커밋하기 위해 추가된 건 아무것도 없음을 의미한다.

 

위의 문구에서도 알 수 있듯이, git add는 워킹 디렉토리의 git이 관리하지 않는 untracked 파일을 git이 관리하는 파일인 tracked 파일에 포함시키기 위한 명령어이다. 즉, untracked 파일을 add하게 되면 staging area에 올라가게 되고 staged 상태로 변경되는 것이다. 

 

기본적인 add 사용법은 git add 뒤에 파일명을 나열하면 된다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git add file.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   file.txt

 

바뀐 부분을 보면 현재 커밋되기 위한 변화가 있고 그 변화는 file.txt가 새로운 파일로서 생성된 변화라는 것을 보여준다. 괄호안에는 해당 파일을 다시 unstage, 즉 untracked 파일로 만들기 위해서는 git rm --cached <file> 명령어를 사용하라는 의미인데 이는 추후에 따로 다루겠다. 

 

 

 

Modified 상태의 파일 add

이제, 커밋되어 unmodified한 파일을 변경한 후 status를 출력하여 보겠다.

// commit
user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git commit -m 'file added'
[master (root-commit) bff73a8] file added
 1 file changed, 1 insertion(+)
 create mode 100644 file.txt

// 변경
user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ echo 'modified file' > file.txt

// status
user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git status
On branch master
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:   file.txt

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

 

file.txt를 commit하여 staged에서 unmodified로 변경이 되었고 이 파일을 변경하였을 때 status를 보면 modified : file.txt를 통해 해당 파일이 변경된 상태임을 출력한다. 이 때 위의 문구를 살펴보면, 해당 파일을 변경 전으로 돌리기 위한 restore 명령어를 볼 수 있고, 해당 파일을 staged 상태로 만들기 위해서 add를 사용하라는 문구도 보인다.

 

즉, add는 staging area에 파일을 포함시킬 때 사용되는 명령어이다. 단순히, untracked 파일을 staging area에 올릴 때만 사용되는 것이 아닌 파일을 staged 상태로 만들기 위한 명령어인 것이다!! 이제 modified 파일을 add를 사용하여 staging area에 포함시키면 아래의 결과를 볼 수 있다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git add file.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   file.txt

 

만약, 여기서 커밋을 하지않고 다시 file.txt 파일을 변경한다면 어떻게 될까??

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ echo 'modified again' > file.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   file.txt

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:   file.txt

 

staged 된 파일을 수정하니 아래와 같이 file.txt가 staged 상태이면서 동시에 unstaged 상태로 출력되는 것을 볼 수 있다. 이러한 현상을 이해하기 위해서는 git이 commit을 통해 스냅샷을 생성하기 위해서 staging area에 있는 파일의 버전을 언제 확정 짓는가를 알아야 한다.

 

대부분이 commit을 할 때의 staging area에 있는 파일 버전들을 이용하여 스냅샷을 생성한다고 생각하지만, git은 add 명령어를 통해 파일을 staged 상태로 만들 때, 해당 파일의 버전을 확정짓는다. 그렇기 때문에 위와 같이 staged 후 파일을 수정할 경우, 커밋을 위한 파일의 버전은 여전히 남아있기 때문에 위와 같이 staged와 unstaged 상태가 둘 다 출력되는 것이다. (unstaged 상태는 당연히 변경된 file.txt)

 

이 상태에서 commit을 하면, 수정되지 않은 file.txt가 커밋되기 때문에 다시 한번 git add  명령어를 통해 수정된 file.txt의 버전으로 바꿔주면 된다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git add .
warning: in the working copy of 'file.txt', LF will be replaced by CRLF the next time Git touches it

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   file.txt

 

 

 

모든 파일 add

git add에는 여러 옵션이 있지만 그 중 많이 사용하는 옵션으로 -a 옵션이 있다. -a 옵션은 all의 앞 글자를 따온 옵션으로 모든 untracked, modified 파일을 staging area에 추가하는 옵션이다. -a 옵션 대신에 dot(.)을 사용하여 표시하는 것도 가능하다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ echo 'file2' > file2.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git add .

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   file.txt
        new file:   file2.txt

 

file2를 추가하고 git add . 명령어를 사용하였을 때, file2.txt 파일이 staging area에 추가된 것을 확인 할 수 있다. 이 외에도 여러 add 옵션이 있기 때문에, git add --help 명령어를 통해서 확인할 수 있다.

 

 

 

 

reference : git

 

 

728x90

'기타 > Git' 카테고리의 다른 글

[Git] .gitignore  (2) 2023.11.26
[Git] status --short  (1) 2023.11.26
[Git] Git 개체 - Commit  (2) 2023.11.22
[Git] Git 개체 - Tree  (2) 2023.11.21
[Git] Git 개체 - Blob  (1) 2023.11.21