Git은 개발자들에게 필수적인 분산 버전 관리 시스템이다. 소스 코드의 변경 이력을 추적하고, 여러 개발자가 효율적으로 협업할 수 있게 해 준다. 이 포스트에서는 Git의 기본 개념부터 주요 명령어, 그리고 각 명령어의 실제 사용 사례와 유용한 옵션들을 상세히 알아보겠다.

Git의 기본 구조 이해하기

Git은 크게 4가지 영역으로 구성된다:

  1. Working Directory (작업 디렉터리): 실제 파일들이 존재하는 곳이다. 여기서 코드를 작성하고 수정한다.
  2. Staging Area (스테이징 영역): 커밋할 준비가 된 변경 사항들이 대기하는 곳이다.
  3. Local Repository (로컬 저장소): 커밋된 버전들이 저장되는 곳이다.
  4. Remote Repository (원격 저장소): 팀원들과 공유하는 서버의 저장소다.

이 구조를 이해하면 Git 명령어들의 동작 방식을 더 쉽게 이해할 수 있다.

주요 Git 명령어 가이드

1. Git 초기화: git init

1
git init

사용 이유: 새 프로젝트를 시작할 때 사용한다. 이 명령어는 현재 디렉토리를 Git 저장소로 초기화한다.

동작 방식: .git이라는 숨겨진 디렉토리를 생성하여 Git이 버전 관리에 필요한 모든 정보를 저장한다.

2. 파일 상태 확인: git status

1
git status

사용 이유: 작업 디렉토리와 스테이징 영역의 상태를 확인할 때 사용한다. 어떤 파일이 변경되었고, 어떤 파일이 커밋될 준비가 되었는지 알 수 있다.

주요 옵션:

  • -s 또는 --short: 간단한 형식으로 상태를 출력한다.
  • -b 또는 --branch: 현재 브랜치 정보도 함께 보여준다.

3. 파일 스테이징: git add

1
git add <파일명>

사용 이유: 변경된 파일을 다음 커밋에 포함하기 위해 스테이징 영역에 추가한다.

주요 옵션:

  • .: 현재 디렉토리의 모든 변경 사항을 스테이징한다.
  • -p: 각 변경 사항을 개별적으로 확인하고 스테이징할 수 있다.
  • -u: 이미 추적 중인 파일들만 스테이징한다.

사용 예:

1
git add -p

이 명령을 사용하면 각 변경 사항을 하나씩 검토하고 스테이징할 수 있어, 더 정확한 커밋을 만들 수 있다.

4. 스테이징 취소: git restore

1
git restore --staged <파일명>

사용 이유: 스테이징 영역에 추가한 파일을 다시 워킹 디렉터리로 되돌릴 때 사용한다.

주요 옵션:

  • --staged: 스테이징된 변경 사항을 취소한다.
  • 옵션 없이 사용: 워킹 디렉터리의 수정 사항을 취소한다.

사용 예:

1
git restore --staged .

이 명령은 모든 스테이징된 변경 사항을 취소한다.

참고: Git 2.23.0 버전 이전에는 git reset 명령어를 사용했다.

1
git reset HEAD <파일명>

5. 변경 사항 커밋: git commit

1
git commit -m "커밋 메시지"

사용 이유: 스테이징된 변경 사항들을 저장소의 새로운 버전으로 기록한다.

주요 옵션:

  • -m: 커밋 메시지를 인라인으로 작성한다.
  • -a: 추적 중인 모든 파일의 변경 사항을 자동으로 스테이징하고 커밋한다.
  • --amend: 마지막 커밋을 수정한다.

사용 예:

1
git commit -am "버그 수정: 로그인 오류 해결"

이 명령은 추적 중인 모든 파일의 변경 사항을 스테이징하고 커밋까지 한 번에 수행한다.

옵션 -m을 사용하지 않으면 Git은 기본 텍스트 편집기를 열어 커밋 메시지를 입력할 수 있게 한다. 커밋 메시지는 변경 사항을 나타내는 간결한 설명이어야 한다.

6. 커밋 취소: git resetgit revert

커밋 취소하기:

1
git reset HEAD^

사용 이유: 마지막 커밋을 취소하고 해당 변경 사항을 워킹 디렉터리로 되돌릴 때 사용한다.

주요 옵션:

  • --soft: 커밋을 취소하고 변경 사항을 스테이징 영역에 유지한다.
  • --mixed: (기본값) 커밋을 취소하고 변경 사항을 워킹 디렉터리로 되돌린다.
  • --hard: 커밋을 취소하고 변경 사항을 완전히 삭제한다. 주의해서 사용해야 한다.

사용 예:

1
git reset --soft HEAD~3

이 명령은 최근 3개의 커밋을 취소하고, 해당 변경 사항을 스테이징 영역에 유지한다.

원격 저장소에 푸시된 커밋 취소하기:

1
git revert <커밋 해시>

사용 이유: 이미 원격 저장소에 푸시된 커밋을 안전하게 취소할 때 사용한다. 새로운 커밋을 생성하여 이전 변경 사항을 되돌린다.

사용 예:

1
git revert abc123

이 명령은 ‘abc123’ 해시의 커밋을 취소하는 새로운 커밋을 생성한다.

7. 커밋 히스토리 확인: git log

1
git log

사용 이유: 프로젝트의 커밋 히스토리를 확인할 때 사용한다. 누가, 언제, 무엇을 변경했는지 볼 수 있다.

주요 옵션:

  • --oneline: 각 커밋을 한 줄로 간략하게 보여준다.
  • --graph: 브랜치와 머지 히스토리를 그래프로 표시한다.
  • --stat: 각 커밋에서 변경된 파일의 통계를 보여준다.

사용 예:

1
git log --oneline --graph --all

이 명령은 모든 브랜치의 커밋 히스토리를 그래프 형태로 간략하게 보여준다.

8. 원격 저장소 관리: git remote

1
git remote add origin <원격 저장소 URL>

사용 이유: 로컬 저장소와 원격 저장소를 연결할 때 사용한다.

주요 명령:

  • add: 새 원격 저장소를 추가한다.
  • remove: 원격 저장소를 제거한다.
  • set-url: 기존 원격 저장소의 URL을 변경한다.

사용 예:

1
git remote set-url origin https://github.com/username/repo.git

이 명령은 ‘origin’이라는 이름의 원격 저장소 URL을 변경한다.

9. 원격 저장소와 동기화: git pushgit pull

1
2
git push origin main
git pull origin main

사용 이유:

  • push: 로컬의 커밋을 원격 저장소에 업로드한다.
  • pull: 원격 저장소의 변경 사항을 로컬로 가져와 병합한다.

주요 옵션:

  • --force: (push 시) 원격 브랜치를 강제로 덮어쓴다. 주의해서 사용해야 한다.
  • --rebase: (pull 시) 병합 대신 리베이스를 수행한다.

사용 예:

1
git pull --rebase origin main

이 명령은 원격의 변경 사항을 가져오면서 로컬의 커밋을 재배치한다.

10. 브랜치 관리: git branchgit checkout

1
2
git branch <브랜치명>
git checkout <브랜치명>

사용 이유:

  • branch: 새 브랜치를 생성하거나 기존 브랜치를 관리한다.
  • checkout: 다른 브랜치로 전환한다.

주요 옵션:

  • -b: (checkout 시) 새 브랜치를 생성하고 바로 전환한다.
  • -d: (branch 시) 브랜치를 삭제한다.

사용 예:

1
git checkout -b A

이 명령은 ‘A’라는 새 브랜치를 생성하고 바로 그 브랜치로 전환한다.

11. 브랜치 병합: git merge

1
git merge <브랜치명>

사용 이유: 한 브랜치의 변경 사항을 다른 브랜치에 통합할 때 사용한다.

주요 옵션:

  • --no-ff: 항상 새로운 커밋을 생성하여 병합한다.
  • --squash: 브랜치의 모든 커밋을 하나의 커밋으로 압축하여 병합한다.

사용 예:

1
git merge --squash A

이 명령은 ‘A’ 브랜치의 모든 변경 사항을 하나의 커밋으로 압축하여 현재 브랜치에 병합한다.

결론

Git은 강력하고 유연한 버전 관리 도구다. 이 포스트에서 다룬 기본적인 명령어들을 마스터하면, 개인 프로젝트나 팀 프로젝트에서 효율적으로 코드를 관리할 수 있다. 더 나아가 Git의 고급 기능들을 학습하면, 복잡한 개발 프로젝트에서도 능숙하게 대처할 수 있을 것이다.