Git 에서 파일 상태 ◀ [관련 상세 포스팅]
- 우리가 작업하는 Working Directory의 모든 파일은 크게 Tracked(관리대상임)와 Untracked(관리대상이 아님)로 나뉜다.
이 중 'Tracked 파일'만 파일 상태를 가진다.
파일 상태의 종류 3가지
1. Unmodified상태 : 마지막 커밋 이후 아직 아무것도 수정하지 않은 파일의 상태
ㄴ> 처음 저장소를 Clone 하면 모든 파일은 Tracked이면서 Unmodified 상태
2. Modified상태 : Unmodified 상태 파일을 수정하면 Git은 알아서 그 파일을 Modified 상태로 인식
3. Staged상태 : Modified상태 파일을 "Staging Area에 추가"하면 Staged 상태
ㄴ> Staged 상태의 파일만 커밋가능하다.
ㄴ> "Staging Area에 추가" = "파일을 (add = stage = 스테이징 = Index에 등록 = 추가)한다."
Git 에서 파일 상태 확인하기 : $ git status
- 우리가 작업하는 Working Directory에서 $ git status 명령어를 사용하여 확인 가능
$ git status |
ㄴ> 명령어 실행 결과 메시지에서
- 'Untracked files' 부분에 속해 있는 파일은 Untracked 상태라는 것을 의미한다.
- 'Changes to be committed' 에 들어 있는 파일은 Staged 상태라는 것
- 'Changes not staged for commit' 에 들어 있는 파일은 수정한 파일이 Tracked 상태이지만 아직 Staged 상태는 아니라는 것
- Ex1) Clone 한 후에 바로 이 명령을 실행
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
ㄴ> 파일을 하나도 수정하지 않았다는 것을 말해준다.
ㄴ> '현재 작업 중인 브랜치'를 알려주며 서버의 같은 브랜치로부터 진행된 작업이 없는 것을 나타낸다.
- Ex1-1) Ex1에서 README 파일 생성
$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add ..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
ㄴ> 5line : 'Untracked files' 부분에 속해 있는 파일은 Untracked 상태라는 것을 말한다.
(README 파일은 새로 만든 파일이기 때문에 'Untracked files’에 들어 있다)
Git은 Untracked 파일을 아직 스냅샷(커밋)에 넣어지지 않은 파일이라고 본다.
파일이 Tracked 상태가 되기 전까지는절대 그 파일을 커밋하지 않는다. 그래서
일하면서 생성하는 바이너리 파일 같은 것을 커밋하는 실수는 하지 않게 된다
Git 에서 파일 상태 '짧게' 확인하기 : $ git status -s
- '-s', '--short' 옵션 : $ git status 명령 간단하게 보여주는 옵션
$ git config -s |
$ git config --short |
ㄴ> $ git status -s 명령어 실행 시 결과에 '상태정보 컬럼'에 2개의 상태가 표시되는데,
[왼쪽에는 'Staging Area에서의 상태']를, [오른쪽에는 'Working Tree에서의 상태']를 나타낸 것이다.
각 상태표시의 각 의미는 아래와 같다.
[상태표시 종류]
- ?? 표시 : 추적하지 않는 새 파일
- A 표시 : Staged 상태로 추가한 파일 중 새로 생성한 파일
- M 표시 : 수정한 파일
- 상태 비었으면 그 상태의 파일이 없는 것
ㄴ> Ex)
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
ㄴ> 명령의 결과에서 상태정보 컬럼에는 두 가지 정보를 보여준다.
파일 | Staging Area 상태표시 |
Working Tree 상태표시 |
|
README | M | 내용을 변경했지만 아직 Staged 상태로 추가하지는 않음 | |
Rakefile | M | M | 변경하고 Staged 상태로 추가한 후 또 내용을 변경해서 Staged 이면서 Unstaged 상태 |
lib/git.rb | A | 파일이 생성되어 Staged 상태로 추가까지 한 상태 | |
lib/simplegit.rb | M | 내용을 변경하고 Staged 상태로 추가까지 한 상태 | |
LICENSE.txt | ? | ? | 추적하지 않는 새 파일 |
Git 에서 파일 추가/수정(add)하기 : $ git add <파일 또는 디렉토리의 경로>
- $ git add <파일 또는 디렉토리의 경로> 명령어를 사용하는 CASE
CASE1) 새 파일을 Git에 등록(=Tracked)할 때
ㄴ> 즉, 새로 만든 파일을 Git이 관리할 수 있도록 추가(=등록=stage=add=스테이징)할 때
ㄴ> Untracked파일을 -> Tracked파일로 바꾼다.
CASE2) 수정한 파일을 커밋가능한 파일로 "Staging Area에 추가"할 때
ㄴ> 즉, 기존 git파일을 수정하여 커밋하기 위해 "Staging Area에 추가"할 때
ㄴ> "Staging Area에 추가한다." = "파일을 (add = stage = 스테이징 = Index에 등록 = 추가)한다."
ㄴ> 파일을 Modified상태에서 -> Staged상태로 바꾼다.
CASE3) Merge할 때 충돌난 상태의 파일을 해결(Resolve 상태)할 만들 때
ㄴ> 즉, 내가 수정한 파일이 원격 Respository에서도 수정되면 보통 Git이 Merge작업을 수행하나
Git이 Merge할 수 없이 동일 부분 수정된 경우엔 두 파일이 충돌되어
Merge(병합)작업을 통해 해결(Resolve 상태)할 만들어야한다.
ㄴ> +) Merge방법 추후 포스팅 예정
- $ git add <파일 또는 디렉토리의 경로> 명령어
$ git add <파일> | 파일만 추가 (Staging Area에 존재 & Staged상태로 만든다.) |
$ git add <디렉토리의 경로> | 디렉토리 경로 아래의 모든 하위 디렉토리와 파일을 모두 추가 |
ㄴ> 'add'의 의미는 "프로젝트에 파일을 추가한다"기 보다는 "다음 커밋에 추가한다"고 받아들이는게 좋다.
ㄴ> 이 명령을 통해 git이 디렉토리에 있는 파일을 추적하고 관리하도록 한다.
ㄴ> ※ 주의 : git add 명령을 실행한 후에 재수정 시, git add 명령을 다시 실행해서
최신 버전을 Staged 상태로 만들어야 한다.
ㄴ> Ex2) 위 'Ex1-1'에서 생성한 README 파일을 추가하기 (<< git add 사용 CASE1)
$ git add README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: README
ㄴ> 5line : 'Changes to be committed' 에 들어 있는 파일은 Staged 상태라는 것을 의미한다.
ㄴ> 커밋하면 'git add 를 실행한 시점(=스냅샷=sanpshot)'의 파일이 커밋되어 저장소 히스토리에 남는다.
ㄴ> Ex3) 기존에 add된 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 ..." to unstage)
new file: README
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: CONTRIBUTING.md
ㄴ> 9line : 'Changes not staged for commit' 에 들어 있는 파일은
수정한 파일이 Tracked 상태이지만 아직 Staged 상태는 아니라는 것을 의미한다.
ㄴ> Staged 상태로 만들려면 `git add 명령을 실행해야 한다.
ㄴ> Ex3-1) Modified상태인 CONTRIBUTING.md 파일을 add하여 Staged 상태로 만든 후 git status 실행
(▲ git add 사용 CASE2)
$ 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 ..." to unstage)
new file: README
modified: CONTRIBUTING.md
ㄴ> 5line : 'Changes to be committed' 에 Staged 상태가 된 두 파일이 존재한다.
- 새로 생성된 후 추가된 README(CASE1)은 'new' 로
- 수정된 후 추가된 CONTRIBUTING.md(CASE2)은 'modified'로 표시
ㄴ> 두 파일 모두 Staged 상태이므로 다음 커밋에 포함된다.
ㄴ> Ex3-2) Staged 상태로 만든 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 ..." to unstage)
new file: README
modified: CONTRIBUTING.md
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: CONTRIBUTING.md
ㄴ> ※ CONTRIBUTING.md 가 Staged 상태이면서 동시에 Modified 상태(Unstaged)로 나온다.
이 시점에서 커밋을 하면 git commit 명령을 실행하는 시점의 버전이 커밋되는 것이 아니라
마지막으로 $ git add 명령을 실행했을 때의 버전이 커밋된다.
ㄴ> Ex3-3) 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 ..." to unstage)
new file: README
modified: CONTRIBUTING.md
ㄴ> 9line : 재수정한 최신 버전 CONTRIBUTING.md 파일이 Staged상태로 'Changes to be committed' 에 존재한다.
END!
스터디 도움 참조 블로그 (References)
- 버전 관리(VC) 위키백과 https://ko.wikipedia.org/wiki/%EB%B2%84%EC%A0%84_%EA%B4%80%EB%A6%AC - 누구나 쉽게 이해할 수 있는 Git 입문 https://backlog.com/git-tutorial/kr/ /입문편/Git의 기본/이력을 관리하는 저장소 https://backlog.com/git-tutorial/kr/intro/intro1_2.html - git--distributed-even-if-your-workflow-isnt (Pro Git Book) https://git-scm.com/book/en/v2 - git--distributed-even-if-your-workflow-isnt (Pro Git Book) / ch2.2 https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EC%88%98%EC%A0%95%ED%95%98%EA%B3%A0-%EC%A0%80%EC%9E%A5%EC%86%8C%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%98%EA%B8%B0 - What is the difference between git clone and checkout? https://stackoverflow.com/a/7298621 - What is the difference between git checkout and git pull? - Quora https://www.quora.com/What-is-the-difference-between-git-checkout-and-git-pull |