내가 처음 Git을 접했을 때 제일 당혹스러웠던 것이 Staging의 개념이다. 그리고 그 개념을 알고나서 "Git이 정말 똑똑하구나!"하고 느꼈던 지점도 Staging이었다.
평소 우리가 단순히 사용하는 파일 업로드/다운로드 개념과 가장 큰 차이를 가지고 있는게 이 부분일 것 같다.
그럼, Git의 status 개념에 대해 자세히 알아보도록 하자.
local에 git 저장소를 하나 만들고 git remote add를 통해 저장소를 연결하고나면 레파지토리에 있던 모든 파일들이 로컬과 연동된다.
워킹 디렉토리에 있는 모든 파일들은 크게 두 가지 상태로 나뉜다.
- Tracked(관리 대상)
- Untracked(비관리 대상)
저장소에서 관리하고 있는, 즉 git이 알고있는 모든 상태, push하기 전의 모든 상태들은 tracked 상태라고 보면 된다.
Tracked 상태는 또 3가지로 나뉘게 된다.
- Unmodified(수정되지 않음)
- Modified(수정중)
- Staged(커밋으로 저장소에 기록하기 전)
파일을 수정하고 나면, add -> commit -> push 의 과정을 거쳐야 웹과 동기화가 된다. 그 과정을 거치면서 하나하나 상태를 설명해 보려고 한다.
git pull
명령어를 실행한 직후의 모든 파일의 상태는 Unmodified 상태가 된다.
이 때 하나의 파일을 수정/생성과정을 진행하면 그 파일은 Modified(수정 중) 상태로 인식된다.
이 파일을 웹으로 올리기 위해 "git add
"를 진행하면, 해당 파일은 Staged(커밋으로 저장소에 기록할) 상태가 된다. 쉽게 생각하면 "git에 업로드 대기 상태"라고 봐도 될 듯 하다.
그리고 나서 해당 파일을 commit 하면 Unmodified(수정되지 않음) 상태가 된다. 수정을 완료한 상태라고 봐도 무관하다.
이러한 라이프 사이클을 계속 반복하게 되는데, 그걸 가장 잘 표현한 그림이 아래 그림이 아닐까 싶다.
commit까지 했을 때는 아직 서버의 git과는 동기화되지 않았다. 전부 진행하고 나서 git push를 해야만 해당 파일을든 Untracked 상태가 되면서 서버와 동기화된다.
백문이 불여일견, 실습을 통해서 조금 더 자세히 설명해 보는 것으로 한다.
실습
먼저, 레파지토리를 생성하고 git remote와 git pull을 진행하고 난 뒤 해당 실습을 진행해야한다.
git remote add, "git pull origin master" 를 실행하면 git repository와 local repository가 동기화된다.
그 상태에서 현재 내 local repository의 파일의 상태를 확인하려면 "git status"를 입력한다.
$ git status
On branch master
nothing to commit, working tree clean
위의 내용은 파일이 수정된 것이 하나도 없다는 의미이다. Tracked 파일들은 하나도 수정이 되지 않았고, untracked 파일은 아직 없어 목록에 나타나지 않는다.
현재 레파지토리에 README.md 파일을 만들어본다.
다시 git status를 실행시키면 아까와는 다른 상태로 보여짐을 알 수 있다.
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
현재 README.md 가 기존에 없다가 새로 생성되어 아직 Tracked 파일이 아니기 때문에 untracked file 목록에 있는 것이다.
그럼 test 기존에 있던 test 파일을 수정하면 어떻게 될까?
$ 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: test.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
no changes added to commit (use "git add" and/or "git commit -a")
기존에 존재하는 file을 수정하고 나니, test.txt 파일은 tracked 목록에 아직 staged되지 않은 상태라고 나온다.
관리하고 있는 Tracked 상태의 파일이나, 관리대상이 아닌 Untracked 상태인 파일이나 Commit 과정을 거쳐야 Git에 업로드 할 수 있는 상태가 된다. 그러기 위해서는 'git add' 명령어를 사용한다.
- git add . : 모든 파일을 staging 상태로 만들기
- git add <특정 경로 파일> : 특정 파일만 staging 상태로 만들기
$ git add .
모든 파일을 staging 하면 git은 파일들을 추적하는 상태가 된다. 다시 git status 로 해당 파일들의 상태를 확인해보면 아래와 같이 staging 상태임이 나타난다. (commit할 준비가 되어있다고 나타난다.). 만일 add를 마쳤는데 추가로 수정할 부분이 있다면, 반드시 다시 git add 를 실행시켜야 한다.
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: README.md
modified: test.txt
해당 파일들을 commit 을 할 때에는 'git commit -m'이라는 명령어로 변경사항에 대한 간략한 설명이 필요하다. commit을 하고 나면 commit을 추적할 수 있는 스냅샷 번호(체크섬이라고 부른다)와 파일이 수정된 내역들이 나온다. 몇개의 코드줄이 변경되었고, 몇개의 파일들이 수정되었는지 등. 체크섬 번호 때문에 이력 관리와 같은 버전 관리가 가능해진다.
$ git commit -m 'edit and add files'
[master 63d3f22] edit and add files
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 README.md
현재 상태는 commit이 되었지만 아직 git에 업로드가 되지 않은 상태이다. git과 동기화를 하려면 git push를 실행해야 한다.
$ git push origin master
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 351 bytes | 117.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/********/temp.git
44de8f6..63d3f22 master -> master
그럼 맨 아래 체크섬 번호로 push가 완료되었다고 나온다.
실제 github 사이트에 들어가면 아래와 같이 변경된 것이 보인다.
이정도만 알면 git 관리의 기초는 다 알게 된 것 같다고 생각한다. 제일 많이 사용하는 명령어는 방금 다 설명했다.
이 다음부터는 특정한 상황 속에서 나 또한 필요하다고 생각되는 부분의 git 명령어들을 살펴볼 계획이다.
참조 사이트
'Code > Git' 카테고리의 다른 글
[Git] git bash 한글이름 파일 깨짐 해결 (0) | 2020.11.19 |
---|---|
[Git] git commit 히스토리 조회하기 (0) | 2020.11.19 |
[Git] local 상에서 git repository 관리하기( github와 local 동기화) (0) | 2020.11.17 |
[Git] window에서 git bash 설치하기 (0) | 2020.11.17 |
[Git] 깃허브 레파지토리(repository) 만들기 (0) | 2020.11.16 |