mason
mason-log.

mason

mason.

안녕하세요. mason 입니다.

version-control

Git.

Git의 작업 영역, 커밋, 브랜치, 병합과 기본 명령어

Git은 파일의 변경 이력을 스냅샷으로 기록하는 분산 버전 관리 시스템이다. 각 개발자가 전체 저장소 이력을 로컬에 가지고 있어 오프라인에서도 커밋과 브랜치 작업을 할 수 있다.

🔄 세 가지 영역

Git 작업 디렉터리 스테이징 영역 저장소 흐름

Git의 기본 작업 흐름은 세 영역 사이에서 변경을 이동하는 과정이다.

  • Working Directory: 실제 파일을 수정하는 작업 공간이다.
  • Staging Area(Index): 다음 커밋에 포함할 변경을 선별하는 공간이다.
  • Repository: 커밋으로 확정된 스냅샷과 이력을 저장한다.
git status
git add src/app.ts
git commit -m "Add app entry"

git add는 단순히 새 파일을 등록하는 명령이 아니라 현재 변경 내용을 다음 커밋 후보로 올리는 명령이다.

📸 커밋

커밋은 특정 시점의 파일 상태와 메타데이터를 가리키는 스냅샷이다.

  • 각 커밋은 이전 커밋을 부모로 참조한다.
  • 작성자, 시각, 메시지, 트리 정보가 함께 기록된다.
  • 커밋 ID는 내용에 기반한 해시로 식별한다.
  • 한 커밋에는 하나의 논리적 변경만 담는 편이 검토와 되돌리기에 유리하다.
git log --oneline --graph
git show <commit>
git diff
git diff --staged

🌿 브랜치와 HEAD

브랜치는 특정 커밋을 가리키는 이동 가능한 포인터다. 새 커밋을 만들면 현재 브랜치의 포인터가 새 커밋으로 이동한다.

  • HEAD: 현재 체크아웃한 브랜치나 커밋을 가리킨다.
  • git switch -c feature/login: 새 브랜치를 만들고 이동한다.
  • git switch main: 기존 브랜치로 이동한다.
  • git branch -d feature/login: 병합된 로컬 브랜치를 삭제한다.

브랜치를 사용하면 배포 가능한 기준 브랜치를 유지하면서 기능별 변경을 독립적으로 진행할 수 있다.

🔀 Merge와 Rebase

Merge의 분기 이력과 Rebase의 선형 이력 비교

방식동작특징
Merge두 브랜치의 공통 조상을 기준으로 이력을 합침기존 이력을 그대로 보존한다.
Rebase현재 커밋을 다른 기준 커밋 위에 다시 적용선형 이력을 만들 수 있다.
# merge
git switch main
git merge feature/login

# rebase
git switch feature/login
git rebase main

이미 공유한 브랜치를 rebase하면 커밋 ID가 바뀌어 다른 사람의 이력과 충돌할 수 있다. rebase는 주로 아직 공유하지 않은 로컬 커밋을 정리할 때 사용한다.

⚠️ 충돌 해결

같은 파일의 같은 부분을 서로 다르게 수정하면 Git이 자동으로 합치지 못하고 충돌을 표시한다.

  1. git status로 충돌 파일을 확인한다.
  2. 파일의 충돌 마커를 보고 최종 내용을 결정한다.
  3. 테스트와 빌드로 결과를 검증한다.
  4. git add로 해결한 파일을 표시한다.
  5. merge 또는 rebase 절차를 계속한다.

충돌 해결은 어느 한쪽 변경을 기계적으로 선택하는 일이 아니라 두 변경의 의도를 함께 보존하는 과정이다.

🧯 변경 되돌리기

  • git restore <file>: 아직 스테이징하지 않은 파일 변경을 되돌린다.
  • git restore --staged <file>: 스테이징만 취소하고 작업 파일은 유지한다.
  • git revert <commit>: 기존 커밋을 취소하는 새 커밋을 만든다.
  • git reset: 브랜치 포인터와 영역을 이동한다. 공유 이력에서는 주의해서 사용한다.

삭제 가능성이 있는 명령을 실행하기 전에는 git status, git diff, git log로 현재 상태를 먼저 확인한다.

💡 같이 알아둘 것

  • .gitignore는 아직 추적하지 않는 파일을 Git 대상에서 제외한다.
  • 비밀번호, API 키 같은 비밀값은 커밋하지 않는다. 이력에서 삭제해도 이미 노출됐을 수 있다.
  • origin은 원격 저장소의 관례적인 이름일 뿐 GitHub 자체를 뜻하지 않는다.
  • Git은 버전 관리 도구이고 GitHub는 Git 저장소를 호스팅하고 협업 기능을 제공하는 서비스다.

🔗 참고 자료