Logo

git add 기본 개념/사용법

git add는 작업 디렉토리(working directory) 상의 변경 내용을 스테이징 영역(staging area)에 추가하기 위해서 사용하는 Git 명령어입니다.

git commit vs. git add

git add 명령어는 다음 변경(commit)을 기록할 때까지 변경분을 모아놓기 위해서 사용합니다. 따라서, git commit 명령어를 통해 명시적으로 기록을 남기기 전까지는 아무리 git add 명령어를 많이 실행해도 Git 저장소의 변경 이력에는 어떤 영향도 주지 않습니다.

git status

git add 명령어를 사용할 때, 항상 함께 사용하게 되는 명령어가 git status 입니다. git status 명령어는 작업 디렉토리(working directory)와 스테이징 영역(staging area)의 상태를 확인하기 위해서 사용합니다.

예를 들어, 다음 git status의 결과를 보면 크게 3개의 영역으로 구분이 되어 있는 것을 볼 수 있습니다.

$ git status
On branch search3
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   src/components/Control/Control.jsx
        modified:   src/components/Input/Input.jsx
        modified:   src/components/List/ListItem.jsx

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/components/Search/Search.jsx
        modified:   src/components/Search/Search.stories.jsx

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

        src/components/Search/useSearch.js
  • Changes to be committed: 이 영역은 스테이징 영역에 넘어가 있는 변경 내용을 보여줍니다.
  • Changes not staged for commit: 이 영역은 아직 워킹 디렉토리에 있는 변경 내용을 보여줍니다.
  • Untracked files: 이 영역도 아직 워킹 디렉토리에 있는 아직 한 번도 해당 Git 저장소가 관리한 적이 없는 새로운 파일을 보여줍니다.

Staging Area

git add 명령어를 사용할 때 반드시 숙지해야하는 개념이 바로 스테이징 영역(staging area)입니다. SVN와 같은 기존 버전 관리 시스템에서는 없던 개념이기 때문에 Git으로 처음 넘어오신 분들이 햇갈려하는 부분이기도 합니다.

스테이징 영역은 작업 디렉토리와 Git 저장소의 변경 이력 사이에 징검다리 역할을 하는데요. 작업 디렉토리는 아직 커밋할 준비가 안된 변경 내용을 자유롭게 수정할 수 있는 공간인 반면에, 스테이징 영역은 커밋할 준비가 된 변경 내용이 Git 저장소에 기록되기 전에 대기하는 장소라고 생각할 수 있습니다. git add 명령어를 사용하면 현재 작업 디렉토리에 있는 모든 또는 일부 변경 내용을 스테이징 영역으로 이동시킬 수 있습니다.

git commit 명령어가 변경 이력을 남길 사점에는 작업 디렉토리에 있는 변경 내용은 고려하지 않고, 스테이징 영역에 넘어온 변경 내용만 사용되기 때문에 이 두 개의 공간을 서로 햇갈려 하신다면 난감한 상황에 빠질 수 있습니다.

이렇게 작업 디렉토리와 스테이징을 구분하면 변경 이력을 남길 때 작업 디렉토리에 있는 변경 내용을 한 번에 몽땅 기록하지 않고, 조금씩 나누어서 기록할 수 있다는 장점이 있습니다. 이를 통해, 각 변경 기록(commit)에 논리적으로 하나의 변경 사항을 담기가 용이한데 이렇게 하면 나중에 버그를 추적하거나 변경 이력을 롤백(roll back)할 때도 이점이 있습니다.

기본 사용법

지금까지 많은 서론이 있었지만, 사실 git add 명령어를 사용하는 방법 자체는 매우 간단합니다. 가장 많이 사용되는 형태를 소개해드리면,

첫번째, 작업 디렉토리의 변경 내용의 일부만 스테이징 영역에 넘기고 싶을 때는 수정한 파일이나 디렉토리의 경로를 인자로 넘깁니다.

$ git add <파일/디렉토리 경로>

두번째, 현재 디렉토리의 모든 변경 내용을 스테이징 영역으로 넘기고 싶을 때는, .을 인자로 넘김니다.

$ git add .

세번째, 작업 디렉토리 내의 모든 변경 내용을 몽땅 스테이징 영역으로 넘기고 싶을 때는, -A 옵션을 사용합니다.

$ git add -A

git add -A는 작업 디렉토리 상에 어디에 위치하든 항상 동일하게 모든 변경 내용을 스테이징으로 넘깁니다. 반면에 git add .는 명령어를 실행한 디렉토리 이하에서 발생한 변경 내용만 포함하며, 해당 디렉토리 기준으로 상위 디렉토리의 변경 내용을 포함하지 않습니다. 만약에 git add .를 프로젝트 최상위 디렉토리에서 실행한다면 git add -A와 동일한 효과를 낼 것입니다.

$ git add -p

마지막으로 소개해드릴 옵션은 제가 개인적으로 유용하고 쓰고 있는 -p 인데요. 이 옵션을 사용하면, 각 변경 사항을 터미널에서 직접 눈으로 하나씩 확인하면서 스테이징 영역으로 넘기거나 또는 제외할 수가 있습니다. 많은 변경 내용을 여러 개의 변경 기록으로 나누어서 남기고 싶을 때 유용하게 사용할 수 있습니다.

마치면서

이상으로 git add 명령어와 관련된 기본 개념과 간단한 사용법에 대해서 알아보았습니다.