Stage it! Commit할 파일을 선택해보자 :: git add [파일명]
Git 튜토리얼 4
Commit할 파일을 선택해보자!
Git의 핵심은 Commit입니다. Commit한다는 것은 실제로 그 버전을 기록한다는 뜻입니다.
Commit하기 전에 우리는 먼저 Commit할 파일을 선택해줘야 합니다. 우리는 그것을 Stage에 올린다고 표현합니다. 무대에 있는 주인공들만 실제로 기록이 되는 것입니다.
바로 Commit하면 되지 왜 굳이 Commit할 파일을 선택하는 단계가 있을까요?
다음의 상황을 가정해봅시다.
git-practice라는 Git 저장소를 만들었습니다. 그 저장소에 실제 프로그램인 Program_A.txt, Program_B 파일과 제가 임의로 여러 가지를 시도해보려고 만든 테스트용으로 만든 Test.txt 파일이 있습니다.
Commit할 파일을 선택하지 않고 파일을 모두 저장하게 한다면?
저장소 안의 모든 파일을 Commit하게 되면 프로그램과 전혀 관계없는 Test.txt와 같은 파일도 저장하게 됩니다. 나중에 이게 쌓이고 쌓인다면 저장소도 난잡해지고 협업할 때도 이상한 파일이 보이면 불편합니다. 그렇다고 Test.txt 파일을 Commit할 때 저장소 밖으로 계속 옮기는 것도 귀찮습니다. Git은 이것을 Commit하기 전에 Stage라는 별도의 단계를 둬서 해결했습니다.
Git의 방식: 먼저 필요한 파일을 선택하고 그 파일만 Commit합니다
Git은 Commit할 파일을 선택해서 Staging Area에 올립니다. 그리고 Staging Area에 있는 파일만 Commit합니다.
한번 직접 Staging Area에 올려서 Commit할 파일을 선택해봅시다
Staging Area에 올리는 것을 Stage한다라고 합니다. 파일을 Stage하는 여러 가지 방법을 알려드리겠습니다. 핵심은 git add
명령어입니다.
파일을 하나씩 Stage하는 Git 명령어
git add [파일명]
git status
명령어로 현재 저장소의 상황을 알아봅시다.
현재 Program_A.txt, Program_B.txt, Test.txt라는 파일들이 새로 들어와서 Untracked files로 분류되어 있는 것을 확인할 수 있습니다.
저는 테스트용으로 만든 Test.txt를 관리하고 싶지 않습니다. Program_A.txt와 Program_B.txt만 Commit하고 싶습니다. 그래서 Program_A.txt와 Program_B.txt만 Stage하겠습니다.
다음처럼 git add
명령어로 파일을 하나하나 Stage할 수 있습니다.
Staging Area에 있는 파일은 Changes to be committed로 분류되고 이제 막 관리되기 시작한 파일이기 때문에 new file로 앞에 출력됩니다.
Stage한 파일을 Staging Area에서 내리는 Git 명령어
Staging Area의 어떤 파일 다시 내리는 것을 Unstage한다라고 합니다. 방금 Stage한 Program_A.txt, Program_B.txt를 Unstage해보겠습니다.
Program_A.txt, Program_B.txt가 다시 Untracked file로 돌아간 것을 볼 수 있습니다.
파일 여러 개를 Stage하는 Git 명령어
Program_A.txt, Program_B.txt 두 개만 있다 상관없지만 만약에 Program이 여러 개라면 일일이 Stage를 해주는 것이 상당히 귀찮은 작업일 것입니다. 아래의 형태로 git add
를 하면 여러 파일을 한방에 Stage할 수도 있습니다.
git add [파일명1] [파일명2] ... [파일명n]
한번 Program_A.txt, Program_B.txt 모두 한방에 Stage해보겠습니다.
git status
명령어를 통해 두 파일 다 잘 Stage된 것을 확인할 수 있습니다.
그 외의 Stage할 때 자주 쓰는 Git 명령어
1. 저장소 안의 모든 파일을 Commit하고 싶을 때도 많습니다. 파일이 10개가 넘어가면 매번 git add
명령어로 파일들을 명시해주는 것도 귀찮습니다. 그럴 때 자주 사용하는 저장소 안에 모든 파일들을 Stage하는 명령어입니다. (아마 가장 많이 사용할 명령어일겁니다)
git add -A
저장소 안에 있는 모든 파일들이 Stage된 것을 확인할 수 있습니다.
2. 어떤 폴더 안의 파일들을 모두 Stage하고 싶을 때도 많습니다. 그럴 때 자주 사용하는 명령어입니다.
git add [폴더명]
새로운 상황을 가정해서 설명해보겠습니다.
기존의 Git 저장소의 모든 파일을 Unstage하고 NewFolder 폴더를 생성했습니다. 그리고 그 폴더 안에 Program_C.txt와 Program_D.txt를 새로 추가했습니다.
현재 저장소의 상태를 먼저 보여드리겠습니다.
기존의 상황에 추가로 NewFolder 안에는 Program_C.txt, Program_D.txt도 Untracked된 상태로 존재합니다.
만약 저장소 안의 모든 파일을 Stage하고 싶으면 git add -A
명령어를 사용하면 됩니다. 하지만 NewFolder 안의 파일들만 사용하고 싶다면 다음과 같이 명령어를 사용하면 됩니다.
git add ./NewFolder/
.
은 현재 디렉터리를 뜻합니다. 따라서 위 명령어는 현재 디렉터리 아래에 NewFolder 아래에 있는 모든 파일을 Stage하라는 명령어입니다.
실행 결과를 git status
로 확인해보니 NewFolder 아래의 파일인 Program_C.txt와 Program_D.txt만 Stage된 것을 알 수 있습니다.
3. 이 명령어는 뭘까요?
git add .
현재 Working Directory 아래의 모든 파일을 Stage하라는 명령어입니다. 현재 Working Directory가 Root(Git 저장소의 최상위 디렉터리, 즉 .../git-practice/
)이면 git add -A
와 동일한 역할을 합니다. 만약 현재 Working Directory에서 cd NewFolder
를 해서 .../git-practice/NewFolder/
이면 git add ./NewFolder/
와 동일한 역할을 합니다.
Staging Area와 index 파일
Staging Area를 index라고도 부릅니다. 왜 그럴까요?
Commit될 파일들의 목록은 실제로 .git 폴더 안의 index 파일에 저장됩니다. 그래서 흔히 git add [파일명]
또는 Stage한다는 것을 index에 기록한다고 표현합니다. index는 그냥 출력해서 읽은 순 없기 때문에 git이 제공해주는 특별한 명령어로 읽어야 합니다.
index 파일을 출력하는 명령어입니다.
git ls-files --stage
한번 직접 .git/index 파일을 출력해봅시다.
git status
명령어의 결과를 보면 현재 Program_C.txt와 Program_D.txt 파일이 Stage된 것을 알 수 있습니다.
cat
명령어(일반적인 Text 파일의 내용을 출력해주는 명령어)로는 index 파일을 읽을 수 없습니다.
git ls-files --stage
명령어를 사용하면 index 파일을 Git이 잘 읽어줍니다. 결과를 보시면 현재 Commit하려고 추적 중인 파일인 Program_C.txt와 Program_D.txt 파일의 목록을 index가 가지고 있다는 것을 알 수 있습니다.
글을 적다 보니 너무 깊게 설명한 것 같습니다ㅜㅜ. "아! index 파일은 파일에 대한 목록들을 기록하는구나", "Staging Area는 저렇게 되어있구나"라는 사실만 대략적으로 감을 잡으면 좋을 것 같아서 설명했습니다. 만약 index 파일의 내용이 잘 이해가 안 되신다면 그것은 제가 감만 잡을 수 있도록 간단히 설명했기 때문입니다. 혹시 더 이해를 하고 싶으시다면 이 글을 참고해주세요.
댓글
이 글 공유하기
다른 글
-
Git과 GitHub를 사용하기 전에 알아야 할 개념들 :: Remote, Push, Pull, Clone
Git과 GitHub를 사용하기 전에 알아야 할 개념들 :: Remote, Push, Pull, Clone
2020.07.18 -
변경한 파일을 저장해보자 :: git commit
변경한 파일을 저장해보자 :: git commit
2020.07.13 -
Commit하기 위해 필요한 Git 설정하기 :: git config (system vs global vs local)
Commit하기 위해 필요한 Git 설정하기 :: git config (system vs global vs local)
2020.07.06 -
저장소 안의 파일들의 상태를 확인해보자 :: git status
저장소 안의 파일들의 상태를 확인해보자 :: git status
2020.07.06