먼저 봐야할 글
Git에서 세 가지 영역
Git 프로젝트 디렉터리에는 .git(이하 Git 디렉터리) 를 포함하여 프로젝트를 구성하는 수많은 파일들이 존재합니다. Git 디렉터리는 Git 프로젝트에서 작업한 수많은 정보들과 여러 버전들에 대한 실제 데이터들을 저장하는 데이터베이스이며, 그 외의 데이터들은 Git 디렉터리에서 특정 버전(특정 시점)의 데이터들을 Checkout 한 것입니다.
이때 우리는 Checkout하여 가져온 버전의 파일들로 프로젝트 작업을 수행하며, 이 Checkout한 파일들이 존재하는 곳을 워킹트리 또는 워킹디렉터리라고 합니다. 물리적으로는 Git 디렉터리나 워킹트리 모두 Git 프로젝트 디렉터리 안에 존재하지만 개념적으로 영역(단계)를 나눈 것입니다.
간단히 설명하자면 Git에는 세 가지 영역이 존재합니다.
-
워킹 디렉터리 - 프로젝트를 진행하는 실제 작업 공간으로 개발한 소스 및 자원이 존재하며 이곳에서 파일을 수정 및 추가합니다.
-
Staging Area - 워킹 디렉터리에서 작업한 내역을 Git 디렉터리로 커밋 하기 위해 커밋 대상 목록으로 담아두는 장바구니 목록 같은 영역입니다.
-
Git 디렉터리 - 실제로는 .git 이라는 이름의 디렉터리이며, 여러가지 버전의 커밋 데이터들과 Git 프로젝트에 대한 모든 정보를 담고 있는 핵심 데이터베이스 디렉터리입니다.
Git 프로젝트에서 파일의 여러가지 상태
Git은 파일들의 버전을 관리하는 버전 관리 도구인 만큼 각각의 파일들이 어떤 상태인지를 여러가지로 분류하여 관리 합니다. 이러한 상태들을 이해하는 것은 어렵고, 세 가지 영역과 추적 여부, 수정 여부에 따라 복합적으로 여러가지 상태를 가지기 때문에 각각을 확실히 이해하는것이 중요합니다.
Untracked와 Tracked 상태
워킹 디렉터리에 있는 여러가지 파일들은 Git의 추적 관리 여부에 따라 각각 크게 두 가지 상태로 나눌 수 있습니다.
Untracked와 Tracked 상태인데 뜻 그대로 Tracked는 Git이 해당 파일을 추적 및 관리하는 상태 이며, Untracked는 반대로 아직 Git이 해당 파일을 추적 및 관리하지 않는 상태를 말합니다.
이는 워킹 디렉터리에 존재하는 파일이라고 해서 모두 Git이 관리하는 파일은 아니라는 뜻이기도 합니다. 따라서 Untracked 파일은 수정이 되거나 삭제가 되어도 Git은 전혀 신경쓰지 않으며, 해당 파일을 어떤 이유로 잃어버려도 복구가 불가능합니다. 대신 이러한 추적관리 시스템을 이용하면 Tracked 상태가 아닌 불필요한 파일들을 커밋하게 되는 실수를 방지할 수 있습니다.
Tracked 상태인 파일은 최소한 한번은 git add 명령을 통해 Staging Area에 포함되거나, Commit을 통해 Git 디렉터리에 저장된 파일입니다.
정리
-
워킹 디렉터리에 있지만 git add나 commit 하지 않은 파일은 Untracked 상태, git add나 commit 했던 적이 있는 파일들은 Tracked 상태입니다.
-
Tracked 상태인 파일들은 Git이 저장 및 관리하며, Untracked 파일은 Git이 신경쓰지 않습니다.
Unmodified와 Modified 상태
Untracked와 Tracked가 추적 관리 여부 관점에서 바라본 상태 였다면, 파일의 변경 여부에 따라 Modified(변경 발생)과 Unmodifed(변경 없음) 상태로 나눌 수 있습니다.
변경 발생 기준은 '파일이 Staged 또는 Commit된 시점 이후로 변경 되었는가' 입니다.
Staged는 git add 명령어를 통해 Staging Area에 내역을 추가한 상태이며, git commit 명령을 통해한 Commit한 경우 Committed 상태입니다.
Git이 관리하지 않는 상태인 Untracked 파일은 두 가지 변경 관련 상태를 갖지 않으며, 이말은 곧 Unmodified 또는 Modified 상태인 파일은 곧 Tracked 상태인 것입니다.
Staged 상태
Staged는 간단하게 Untracked 파일이나 Modified 상태인 파일을 Staging Area에 내역을 등록하지 않은 상태입니다.
백문이 불여일견 이라는 말도 있으니 다음의 git status 명령어 실습을 통해서 이해를 돕도록 하겠습니다.
(이 그림 하나로 모든 상태를 이해할 수 있는것은 아닙니다.)
git status 명령어를 통한 Git 상태 파헤치기 (반복해서 쭉 따라해볼 것)
git status 명령어는 Git 프로젝트의 상태를 확인할 수 있는 명령어입니다.
여기서부터는 위의 그림을 이해할 수 있도록 실습을 해볼것입니다.
Git 프로젝트를 만든 직후에 처음부터 여러가지 명령들을 따라해보면서 파일의 상태가 어떻게 변화하는지 보게되면 이해가 빠를것입니다.
가장 먼저 원하는 경로에 Git 프로젝트 디렉터리를 하나 만들고 git init 명령어로 Git 저장소로 등록합니다.
$ cd c:
$ mkdir gitTest
$ cd gitTest
$ git init
Initialized empty Git repository in C:/gitTest/.git/
git status 명령어로 현재 Git 프로젝트의 명령어를 확인합니다.
현재 master 브랜치로 체크아웃 되어 있으며, 커밋 내역이 없다는 내용입니다.
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
이제 파일을 하나 만들고 다시 상태를 확인해 보겠습니다.
파일을 만든 직후 git satus를 하니 Untracked files 목록에 방금 만든 firstFile.txt 파일이 있습니다.
아직 git add나 git commit을 하지 않았기에 Untracked 상태이며, Git이 추적관리 하고 있지 않은것입니다.
$ echo '파일의 내용' >> firstFile.txt
$ ls
firstFile.txt
$ git status
On branch master
No commits yet
Untracked files:
firstFile.txt
다음으로 git add 명령으로 Stage Area에 만든 파일의 내역을 등록하고 다시 상태를 확인합니다.
CRLF 관련 경고 문구가 나타날 수 있는데 이는 무시해도 무관합니다.
Changes to be committed 목록에 new file(새로운 파일) 이라 하며 firstFile.txt 이 있는것을 볼 수 있습니다.
이때부터는 firstFile.txt 은 Git의 관리 대상인 Tracked 상태이며, Staging Area에 등록 되었으므로 Staged 상태입니다.
다만 파일이 생성된 이후 처음으로 Git이 인식한 상태이므로 변경 여부에 대한 상태는 가지지 않습니다.
$ git add firstFile.txt
$ git status
On branch master
No commits yet
Changes to be committed:
new file: firstFile.txt
다음으로 git commit 명령을 실행하여 버전 스냅샷을 남기고 상태를 확인합니다.
Commit 된 직후 firstFile.txt 파일은 Tracked 이면서, 커밋된 이후로 수정된 적이 없었으므로 Unmodified 이고, 당연히 Committed(커밋된) 상태입니다. (말이 이상하군요..?)
$ git commit -m '첫번째 커밋!'
$ git status
On branch master
nothing to commit, working tree clean
현재 상태를 보자면 Git 디렉터리에 저장된 master 브랜치와 워킹 디렉터리에 Checkout 되어 있는 버전은 완벽히 일치합니다. 그래봤자 firstFile.txt 파일 하나밖에 없지만 아직까지 Modified 상태인 파일은 없습니다.
그럼 이번에 firstFile.txt의 내용을 수정 후 상태를 확인합니다.
Changes not staged for commit 은 변경이 일어났지만 커밋을 위해 Staged 되지 않은(git add 하지 않은) 파일을 의미합니다. 즉 Tracked 상태이면서 Modified 상태이지만 Staged가 아닌 상태를 말합니다.
$ ls
firstFile.txt
$ echo '추가 내용' >> firstFile.txt
$ cat firstFile.txt
파일의 내용
추가 내용
$ git status
On branch master
Changes not staged for commit:
modified: firstFile.txt
파일을 Staged(Staging Area에 등록된 상태) 로 만들기 위해 git add 명령으로 변경된 firstFile.txt를 stage 시키고 상태를 확인합니다.
Changes to be committed 목록에 있으면서 modified 라고 되어 있습니다.
이말은 Staged 상태이면서 Modifed 상태라는 것입니다.
$ git add firstFile.txt
$ git status
On branch master
Changes to be committed:
modified: firstFile.txt
여기서 수정 내역을 완전히 Git 디렉터리에 반영하기 위해 Commit을 한 후에 상태를 확인해 보겠습니다.
커밋 직후에 최초 커밋과 마찬가지로 Git 디렉터리의 버전과 워킹 디렉터리의 버전이 완벽히 일치하며, Untracked 상태의 파일은 없고 Modified 상태인 파일도 없는 깨끗한(clean) 상태입니다.
$ git commit -m '두 번째 커밋'
$ git status
On branch master
nothing to commit, working tree clean
거의 다 왔습니다. 마지막으로 한번만 더 firstFile.txt를 수정합니다.
이제는 말 하지 않아도 어떤 상태인지 알 수 있습니다.
Tracked, Modified, not Staged
$ echo '두 번째 추가 내용' >> firstFile.txt
$ cat firstFile.txt
$ git status
On branch master
Changes not staged for commit:
modified: firstFile.txt
git add를 통해 커밋 목록에 추가하여 Staged 상태로 바꿉니다.
Tracked, Modified, Staged
$ git add firstFile.txt
$ git status
On branch master
Changes to be committed:
modified: firstFile.txt
잠깐! 여기서 firstFile.txt를 다시 한 번 수정하고 상태를 확인합니다.
이번엔 firstFile.txt에 대해 두 가지 상태를 가진 것을 알 수 있습니다.
첫 번째는 Modifed 이면서 Staged 상태
두 번째는 Modifed 상태이면서 not Staged 상태
$ echo '세 번째 추가 내용' >> firstFile.txt
$ cat firstFile.txt
파일의 내용
추가 내용
두 번째 추가 내용
세 번째 추가 내용
$ git status
On branch master
Changes to be committed:
modified: firstFile.txt
Changes not staged for commit:
modified: firstFile.txt
혼란스럽지만 만약 이 상태에서 Commit을 한다면 어떻게 될 지 궁금하니 Git 디렉터리(저장소)에 커밋을 해보고 상태를 확인해 보겠습니다.
$ git commit -m '세 번째 커밋'
$ git status
On branch master
Changes not staged for commit:
modified: firstFile.txt
Staged, Modified 상태는 사라지고 Modifed, not Staged 상태만 남았습니다.
어떻게 된 것일까요? 그렇습니다. Staged 된 내역만을 Commit하기 때문에 Git 저장소에는 '두 번째 추가 내용' 의 변경사항만 커밋 되었고, '세 번째 추가 내용' 의 변경 사항은 워킹 디렉터리의 firstFile.txt에 남아 있는 것입니다.
이제 상태에 대해서 조금은 감이 잡히시나요? 이해가 안돼도 걱정하지 마세요. 한번에 이해가 되기란 어려우며, 몇 번을 반복하다 보면 이해가 될 것입니다.
git status -s 를 통해 상태를 간략하게 확인하기
git status 명령어의 --short 옵션 또는 -s 옵션을 통해 상태를 간략히 볼 수 있습니다.
$ git status -s
?? firstFile.txt
A secondFile.txt
M thirdFile.txt
M fourthFile.txt
MM fifthFile.txt
-s, --short 옵션을 주게 되면 git status 명령만을 사용했을 때 나왔던 상태 메시지들을 두 자리의 문자로 표현합니다.
앞자리는 Staging Area 기준, 뒷 자리 문자는 워킹 디렉터리 기준입니다. 다음의 설명을 참고합니다.
문자 |
설명 |
?? |
Git 프로젝트 디렉터리에 새로운 파일이 추가되었으나, Untracked인 파일입니다. |
A |
새로운 파일이 추가된 후 git add 명령을 통해 Staged 상태가 된 파일입니다. |
M |
앞자리는 공백, 뒷자리는 M 인 경우 워킹 디렉터리의 파일을 수정(Modified)을 했지만 git add 하지 않은 not Staged 상태를 말합니다. (Modified, not Staged) |
M |
워킹 디렉터리에서 파일을 수정하여 Modifed 상태인 파일을 git add로 Staging Area에 등록한 Staged 상태를 말합니다. (Modifed, Staged) |
MM |
따라하기 마지막 예시처럼 수정 후 git add 상태에서 Commit 하지 않고 다시 한 번 수정 후 git add 하지 않은 상태로 첫번째 수정 내역은 Staged 상태이지만, 다시 한 번 수정한 내역은 워킹디렉터리에만 존재하고 git add 되지 않은 상태입니다. 이때 Commit을 하게 되면 Staged된 수정 내역만 저장소에 커밋되며, 두 번째 수정내역은 남게되어 M상태가 됩니다. |
출처 - https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository
'깃(Git)' 카테고리의 다른 글
[Git] Windows 환경 Git에서 줄바꿈 문자(CRLF) 관련 설정 (0) | 2018.04.21 |
---|---|
[Git] .gitignore 설정으로 파일 무시하기 (0) | 2018.04.21 |
[Git] Git 세 가지 영역 및 상태 Committed, Modified, Staged 설명 (0) | 2018.04.20 |
[Git] .gitignore 환경에 맞게 자동으로 만들기 (1) | 2018.04.20 |
[Git] GitHub 저장소(Repository) 삭제하는 방법 (0) | 2018.04.19 |