Git staging과 commit 제대로 이해하기: add -p · amend · .gitignore

··설명 약 8분·작성: 해비·블로그 소개

Git staging에서 변경을 나누고 amend와 .gitignore를 사용할 때 무엇을 확인하나요?

staging은 다음 커밋에 넣을 변경을 고르는 단계입니다. 목적이 다른 수정은 add -p로 나누고 staged diff를 확인하세요. amend는 기존 커밋을 바꾸며 .gitignore는 이미 추적 중인 파일을 숨기지 않습니다.

본문 근거: git-scm.com/docs/git-add · git-scm.com/docs/git-commit · git-scm.com/docs/gitignore

핵심 원리

commit 품질은 나중에 log와 diff를 읽을 때 드러납니다. staging을 의도적으로 사용하면 한 번에 모든 변경을 넣는 대신 하나의 목적을 가진 변경만 commit으로 만들 수 있습니다.

명령을 실행하기 전에는 항상 현재 상태를 먼저 확인합니다.

git status --short
git branch --show-current
git log --oneline --decorate -5

출력 결과를 보지 않고 다음 명령을 연속으로 입력하면 무엇이 바뀌었는지 추적하기 어렵습니다. 이번 회차에서는 각 명령 뒤에 상태를 다시 확인하면서 작업 전후 차이를 기록합니다.

목적별 commit을 만드는 실습

1편 이후 README.md에 서로 떨어진 두 문단을 수정합니다. 하나는 실행 방법, 다른 하나는 오타 수정으로 구분합니다. 이미 공유한 commit을 재작성하지 않도록 이 실습에서는 아직 push하지 않은 새 변경만 사용합니다.

git diff --stat
git diff -- README.md
git add -p README.md
git diff --cached
git diff -- README.md

대화형 질문에서 y는 현재 hunk를 staging하고 n은 남깁니다. 한 hunk에 섞였으면 s로 분할할 수 있는지 확인하고, 분할되지 않으면 편집기에서 변경을 다시 나눕니다. cached diff에 첫 목적만 남았을 때 commit하고 나머지 변경을 두 번째 commit으로 만듭니다.

git commit -m "docs: clarify TaskFlow startup"
git add README.md
git diff --cached
git commit -m "docs: correct wording"
git log --oneline -2

이어서 README 한 줄을 다시 수정하고 git add README.md로 stage합니다. 이 추가 변경을 다음 명령으로 index에서만 되돌립니다. 작업 트리의 수정은 남아 있는지 status와 diff로 확인합니다.

git add README.md
git restore --staged README.md
git status --short
git diff -- README.md

마지막 commit의 메시지만 바꾸려면 staged 변경이 없는지 확인한 다음 실행합니다. 방금 unstage한 작업 트리 수정은 이 amend에 포함되지 않고 그대로 남습니다. amend는 새 commit을 만들어 ID를 바꾸며 이미 push한 이력에는 기본 절차로 적용하지 않습니다. --no-edit도 staged 내용까지 기존 commit에 합칠 수 있습니다.

git diff --cached
git rev-parse HEAD
git commit --amend -m "docs: fix TaskFlow guide wording"
git rev-parse HEAD
git show --stat HEAD

.gitignore는 미추적 파일의 추가를 막는 규칙입니다. 이미 추적한 일반 파일을 추적에서 빼는 git rm --cached는 별도의 삭제 commit을 만들므로 대상과 영향을 확인해야 합니다. 비밀이 이미 공개됐다면 ignore 변경만으로 과거 이력이 사라지지 않습니다. 우선 자격증명을 폐기·교체하고 저장소 관리 절차로 대응합니다. 학습 중 실제 비밀을 만들거나 commit하지 않습니다.

공식 근거: https://git-scm.com/docs/git-add · https://git-scm.com/docs/git-restore · https://git-scm.com/docs/git-commit · https://git-scm.com/docs/gitignore

직접 확인해야 할 기준

한 파일에 UI 수정과 오타 수정 두 종류의 변경을 만들고 add -p로 서로 다른 commit 두 개로 분리합니다.
마지막 commit 메시지를 amend하고 hash가 바뀌는 것을 확인합니다.

실습에서는 성공 명령만 기록하지 않습니다. 의도적으로 한 번 실패하거나 충돌 상황을 만들고, 오류 메시지와 현재 저장소 상태를 함께 확인합니다. Git 문제는 오류 문구만 검색하기보다 HEAD가 어디를 가리키는지, working tree와 index가 어떤 상태인지, local과 remote history가 어떻게 다른지를 먼저 확인하는 편이 안전합니다.

독자 질문과 결과 확인

질문: 한 파일에 섞인 두 변경을 어떻게 별도 commit으로 남기나요?

본인의 연습용 저장소에서 순서대로 실행합니다.

git status --short
git diff -- README.md
git add -p README.md
git diff --cached -- README.md

예상 결과: 선택한 hunk만 cached diff에 보이고, 아직 고르지 않은 변경은 git diff에 남습니다. 그 상태에서 첫 목적을 commit한 뒤 남은 변경을 따로 commit합니다.

오류 점검: hunk가 분리되지 않으면 편집기에서 변경 범위를 나눈 뒤 다시 add -p를 실행합니다. 이미 push한 commit은 amend하지 않습니다.

검증 기록: 위 명령은 이 편집 작업에서 실행하지 않았습니다. Git 이력과 원격 상태는 독자 환경에서 확인해야 하므로 미확인입니다.

다음 학습: 03회차에서 분리한 commit을 기능 branch에서 병합하며 fast-forward 여부를 확인합니다.

독립 학습 변형 과제: 두 hunk 중 하나만 stage한 뒤 git diff와 git diff --cached에 각각 어떤 수정이 남는지 먼저 적고 결과와 비교합니다.

선택 실습: 같은 프로젝트로 연습하기

이 선택 실습은 TaskFlow 개발 과정을 Git 저장소와 협업 기록으로 남기는 연습입니다. Git 이력은 직접 명령을 실행해 만듭니다.

이번 주제: Git staging과 commit 제대로 이해하기: add -p · amend · .gitignore.

선택: 연재 프로젝트와 전체 자료

연재 프로젝트를 이어 만드는 분을 위한 자료입니다. 이 글의 개념과 예제만 찾으셨다면 필요한 파일과 실행 방법만 펼쳐보세요.

TaskFlow 프로젝트 적용

시작 체크포인트: 이전 글의 프로젝트 적용과 완료 확인을 마친 본인의 Git 저장소에서 이어갑니다. 다운로드 ZIP은 문서·설정 참고 자료이며 commit 이력·branch·remote·PR 상태를 복원하지 않습니다. 현재 저장소의 status·log와 아래 시작 조건을 직접 대조합니다.

1편의 개념과 이전 체크포인트를 확인합니다. ZIP은 Git 이력 자체가 아니므로 Git 상태는 본인의 연습용 저장소에서 준비합니다.

이전 체크포인트:

git-step-01-first-push

TaskFlow의 작은 기능 변경과 문서 변경을 하나의 commit으로 섞지 않고 분리합니다.
.gitignore를 점검해 node_modules, build 산출물, 비밀 환경 파일을 제외합니다.

변경 전후를 다음 기준으로 남깁니다.

Before
- 이전 체크포인트 상태
- 현재 branch와 working tree 확인

Change
- 이번 회차의 Git 작업 수행
- status / diff / log로 변화 확인

After
- 작업 결과 검증
- 다음 회차가 이어받을 상태 저장

자주 발생하는 실수

  • git add . 후 내용 확인 없이 commit
  • 이미 추적된 .env가 .gitignore로 사라질 것이라 착각
  • 이미 push한 commit을 무심코 amend
  • 의미 없는 WIP commit을 main에 누적

문제를 해결할 때는 먼저 git status, git log, git diff, 필요하면 git reflog로 관찰 가능한 사실을 모읍니다. 그다음 변경 범위가 가장 작은 복구 방법을 선택합니다.

학습 완료 체크리스트

  • 변경을 목적별 commit으로 나누고 staging을 되돌리며, amend를 언제 써도 되는지 설명할 수 있어야 합니다.
전체 파일·코드 보기

실습 프로젝트 전체 코드

이 회차는 Git 명령 실습을 위한 문서·설정 자료입니다. ZIP에는 실제 Git 이력이나 앱 전체가 없습니다. 아래 Markdown 문서는 자동 실행 스크립트가 아니며, 각 명령의 전제와 예상 상태를 읽고 본인의 연습 환경에서 단계별로 확인합니다.

README.md

# git-step-02-clean-commit 문서 체크포인트

이 ZIP은 Git·GitHub 실습 안내와 관련 설정 파일을 모은 자료입니다. `.git` 이력, 실제 branch/tag/stash/worktree, 원격 저장소, 사용자 계정이나 TaskFlow 앱 전체를 포함하지 않습니다. 별도의 개발환경 과정 TaskFlow 프로젝트에서 실습 안내를 읽고 명령을 단계별로 적용하세요. 이 폴더 자체를 완성된 Git 저장소로 간주하거나 명령을 한꺼번에 실행하지 마세요.

01~13 필수 과정의 이 회차까지 문서를 누적합니다.

검증 범위는 명령 문법·설정 형식·공식 문서 및 기존 프로젝트 스크립트 대조입니다. 실제 init/commit/branch/stash/worktree/reset/rebase/merge/push/PR/Release/서명 작업을 수행했다는 기록이 아닙니다. 개인 키·토큰·비밀번호는 포함하지 않습니다.

docs/git-step-01.md

# Git·GitHub 01 실습 안내

이 파일은 독자가 상태를 확인하며 따라갈 Markdown 문서입니다. 자동 실행 스크립트나 검수 과정에서 실행한 Git 이력 로그가 아닙니다.

## 첫 저장소부터 원격 연결까지

Git 공식 설치 안내에서 운영체제에 맞는 Git을 설치합니다. Windows 명령 예제는 Git Bash 기준입니다. 이후 회차도 같은 셸을 사용합니다. 먼저 개발환경 과정에서 만든 TaskFlow 폴더를 편집기로 열고 그 폴더에서 터미널을 엽니다. 이미 .git이 있는 프로젝트라면 아래 init을 반복하기보다 현재 이력과 브랜치를 먼저 확인합니다.

```bash
git --version
git init -b main
git status --short
```

이름과 이메일은 이 저장소의 commit 작성자 정보입니다. GitHub 인증 비밀번호가 아닙니다. 공개 이메일을 원하지 않으면 GitHub Settings의 Emails에서 본인의 noreply 주소를 확인합니다. 아래 입력은 실제 값을 화면에 재출력하지 않고 저장소 로컬 설정에만 기록합니다.

```bash
read -r -p "commit 작성자 이름: " GIT_AUTHOR_LABEL
read -r -p "commit 작성자 이메일 또는 본인 noreply 주소: " GIT_AUTHOR_MAIL
if [ -n "$GIT_AUTHOR_LABEL" ] && [ -n "$GIT_AUTHOR_MAIL" ]; then
  git config --local user.name "$GIT_AUTHOR_LABEL"
  git config --local user.email "$GIT_AUTHOR_MAIL"
else
  printf '%s\n' '빈 작성자 정보로 진행하지 않습니다.'
fi
```

편집기에서 README.md에 TaskFlow의 목적 한 줄을 작성합니다. 기존 파일은 덮어쓰지 않고 내용을 읽고 수정합니다. .gitignore에는 기존 개발환경의 node_modules, 빌드 산출물, 실제 환경변수 파일 제외 규칙을 유지합니다. 첫 commit은 README만 명시적으로 선택합니다.

```bash
git status --short
git add README.md
git diff --cached
git commit -m "docs: describe TaskFlow"
git log --oneline -1
```

처음에는 README가 untracked라서 일반 git diff에 나오지 않을 수 있습니다. add 후 cached diff는 첫 commit에 들어갈 내용을 보여 줍니다. 이제 README에 실행 방법 한 줄을 추가해 add하고, commit하기 전에 다른 설명 한 줄을 더 수정합니다.

```bash
git add README.md
git status --short
git diff
git diff --cached
```

이때 예상하는 MM의 첫 M은 staging, 두 번째 M은 staging 이후 작업 트리 변경입니다. 두 diff를 비교한 뒤 두 변경 모두 포함하려면 다시 add하고 두 번째 commit을 만듭니다.

```bash
git add README.md
git diff --cached
git commit -m "docs: add TaskFlow usage"
```

GitHub에서는 본인 계정에 빈 저장소를 만들고 README나 초기 commit을 추가하지 않습니다. 저장소 화면의 HTTPS 또는 SSH 주소를 복사합니다. HTTPS는 Git Credential Manager 등 공식 인증 흐름을, SSH는 이미 등록한 키를 사용합니다. 비밀번호나 토큰을 URL에 넣지 않습니다. 아래는 독자가 본인 원격 저장소를 연결할 때 실행하는 절차이며 이 글의 검수에서 push한 결과가 아닙니다.

```bash
read -r -p "본인의 빈 GitHub 저장소 clone 주소: " TASKFLOW_REMOTE
if [ -n "$TASKFLOW_REMOTE" ]; then
  git remote add origin "$TASKFLOW_REMOTE"
else
  printf '%s\n' '원격 주소가 없어 연결하지 않습니다.'
fi
git remote -v
```

origin이 이미 존재하면 add 실패를 무시하지 말고 기존 주소가 본인의 대상인지 확인합니다. 주소와 commit 내용을 검토한 뒤에만 첫 push를 실행합니다.

```bash
git push -u origin main
git status -sb
git rev-parse HEAD
git ls-remote origin refs/heads/main
```

마지막 두 출력의 commit ID가 같고 GitHub 파일 화면이 일치하면 첫 연결 기준을 충족합니다. 빈 원격이 아니어서 rejected가 발생했다면 강제 push하지 않고 4편의 fetch/이력 비교로 이동합니다. init 전에는 status가 실패하고 첫 commit 전에는 log가 실패하는 것이 정상일 수 있습니다.

공식 근거: https://git-scm.com/docs/git-init · https://git-scm.com/docs/git-add · https://git-scm.com/docs/git-commit · https://docs.github.com/en/get-started/git-basics/set-up-git

## 체크포인트 기준

git-step-01-first-push: 위 실습의 관찰 기준을 본인의 연습 환경에서 확인한 뒤 사용합니다. 이 ZIP을 내려받았다는 사실만으로 실습 완료가 성립하지 않습니다.

docs/git-step-02.md

# Git·GitHub 02 실습 안내

이 파일은 독자가 상태를 확인하며 따라갈 Markdown 문서입니다. 자동 실행 스크립트나 검수 과정에서 실행한 Git 이력 로그가 아닙니다.

## 목적별 commit을 만드는 실습

1편 이후 README.md에 서로 떨어진 두 문단을 수정합니다. 하나는 실행 방법, 다른 하나는 오타 수정으로 구분합니다. 이미 공유한 commit을 재작성하지 않도록 이 실습에서는 아직 push하지 않은 새 변경만 사용합니다.

```bash
git diff --stat
git diff -- README.md
git add -p README.md
git diff --cached
git diff -- README.md
```

대화형 질문에서 y는 현재 hunk를 staging하고 n은 남깁니다. 한 hunk에 섞였으면 s로 분할할 수 있는지 확인하고, 분할되지 않으면 편집기에서 변경을 다시 나눕니다. cached diff에 첫 목적만 남았을 때 commit하고 나머지 변경을 두 번째 commit으로 만듭니다.

```bash
git commit -m "docs: clarify TaskFlow startup"
git add README.md
git diff --cached
git commit -m "docs: correct wording"
git log --oneline -2
```

이어서 README 한 줄을 다시 수정하고 git add README.md로 stage합니다. 이 추가 변경을 다음 명령으로 index에서만 되돌립니다. 작업 트리의 수정은 남아 있는지 status와 diff로 확인합니다.

```bash
git add README.md
git restore --staged README.md
git status --short
git diff -- README.md
```

마지막 commit의 메시지만 바꾸려면 staged 변경이 없는지 확인한 다음 실행합니다. 방금 unstage한 작업 트리 수정은 이 amend에 포함되지 않고 그대로 남습니다. amend는 새 commit을 만들어 ID를 바꾸며 이미 push한 이력에는 기본 절차로 적용하지 않습니다. --no-edit도 staged 내용까지 기존 commit에 합칠 수 있습니다.

```bash
git diff --cached
git rev-parse HEAD
git commit --amend -m "docs: fix TaskFlow guide wording"
git rev-parse HEAD
git show --stat HEAD
```

.gitignore는 미추적 파일의 추가를 막는 규칙입니다. 이미 추적한 일반 파일을 추적에서 빼는 git rm --cached는 별도의 삭제 commit을 만들므로 대상과 영향을 확인해야 합니다. 비밀이 이미 공개됐다면 ignore 변경만으로 과거 이력이 사라지지 않습니다. 우선 자격증명을 폐기·교체하고 저장소 관리 절차로 대응합니다. 학습 중 실제 비밀을 만들거나 commit하지 않습니다.

공식 근거: https://git-scm.com/docs/git-add · https://git-scm.com/docs/git-restore · https://git-scm.com/docs/git-commit · https://git-scm.com/docs/gitignore

## 체크포인트 기준

git-step-02-clean-commit: 위 실습의 관찰 기준을 본인의 연습 환경에서 확인한 뒤 사용합니다. 이 ZIP을 내려받았다는 사실만으로 실습 완료가 성립하지 않습니다.

실행·검증 범위

이 자료는 독자가 실행할 절차와 기대 관찰 기준입니다. 제공 ZIP에는 Git 이력·실제 원격 저장소·CI 성공 기록이 포함되지 않습니다. 이번 원문 검수에서 branch/worktree/stash/reset/삭제/commit/push 또는 보안·서명 설정을 실행하지 않았습니다. 실제 수행 결과는 독자가 자신의 연습용 저장소와 권한을 확인하여 기록합니다.

완료 체크포인트

git-step-02-clean-commit

이 체크포인트는 명령을 한 번 실행했다는 뜻이 아니라, 결과를 status, diff, log 등으로 확인한 상태를 의미합니다.

다음 학습

03 Git branch와 merge 원리

다음 회차로 이동하기 전에 working tree에 의도하지 않은 변경이 남아 있지 않은지 다시 확인합니다.

체크포인트 다운로드

git-step-02-clean-commit 문서·설정 ZIP 다운로드

시작 참고 자료: 1회차 ZIP

ZIP은 명령 안내와 설정 자료이며 Git 이력·브랜치·원격 저장소 상태를 복원하지 않습니다.

글 소개·학습 준비·전체 목차
문서를 선택하고 도장을 찍는 변경 선택과 커밋 표지

Git·GitHub · 2 / 17 · 초급

Git staging과 commit 제대로 이해하기 add p amend gitignore

“수정한 파일 전체를 add .” 하는 습관에서 벗어나 변경을 읽고 의미 있는 commit 단위로 나누는 방법을 배웁니다.

이번 글에서 배우는 내용

  • index/staging area 심화
  • git diff --stat / --name-only
  • git add
  • git add -p로 hunk 단위 staging
  • git restore --staged
  • git commit --amend
  • git commit --amend --no-edit의 위험과 사용 범위
  • 좋은 commit 크기와 메시지 기준
  • tracked 파일과 .gitignore
  • git rm --cached
  • .git/info/exclude와 global ignore의 역할 차이
  • git show HEAD / HEAD^
  • commit hash가 바뀌는 이유

선수 지식

status·diff·commit의 차이를 알고, README.md가 추적되고 main에 commit이 있는 별도 연습 저장소를 준비합니다.

Git 설치·셸·첫 commit 준비가 필요하면 Git 기초의 독립 실습에서 준비합니다. 누적 TaskFlow 파일은 상단 학습의 선수가 아닙니다.

목차

  1. 핵심 원리
  2. 목적별 commit을 만드는 실습
  3. 직접 확인해야 할 기준
  4. 독자 질문과 결과 확인
  5. TaskFlow 프로젝트 적용
  6. 자주 발생하는 실수
  7. 학습 완료 체크리스트
  8. 실습 프로젝트 전체 코드
  9. 실행·검증 범위
  10. 완료 체크포인트
  11. 다음 학습

이 글이 도움이 되었나요?

조회 중

읽음 기록

읽음 — / 전체 17개 · 필수 13개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기