icon
14장 : 개발도구와 워크플로우

Git 기초와 협업 워크플로우

소프트웨어 개발은 수많은 코드 변경으로 이루어집니다. 어떤 기능이 추가되고, 어떤 버그가 수정되며, 누가 언제 코드를 변경했는지 등의 이력을 체계적으로 관리하는 것이 매우 중요합니다. 버전 관리 시스템(VCS) 은 이러한 코드 변경 이력을 추적하고 관리하여, 다음과 같은 이점을 제공합니다.

  • 변경 이력 추적: 모든 코드 변경 내용을 기록하고, 언제든 특정 시점의 코드로 되돌아갈 수 있습니다.
  • 협업 용이: 여러 개발자가 동시에 같은 코드베이스를 안전하게 작업하고, 변경 내용을 병합(Merge)할 수 있습니다.
  • 실험과 브랜칭: 새로운 기능을 개발하거나 실험적인 변경을 할 때, 기존 안정적인 코드에 영향을 주지 않고 독립적인 공간에서 작업할 수 있습니다.
  • 문제 해결: 버그 발생 시, 어떤 코드 변경 때문에 문제가 발생했는지 쉽게 찾아내고 이전 버전으로 되돌릴 수 있습니다.

Git은 현재 가장 널리 사용되는 분산 버전 관리 시스템(DVCS: Distributed Version Control System)입니다.


Git 기본 개념

Git을 사용하기 위해 알아야 할 핵심 개념들을 살펴보겠습니다.

  • 저장소 (Repository, Repo)
    • 프로젝트의 모든 파일과 변경 이력이 저장되는 곳입니다. 로컬 저장소(내 컴퓨터)와 원격 저장소(GitHub, GitLab 등)로 나뉩니다.
  • 커밋 (Commit)
    • 코드 변경 사항을 저장소에 기록하는 단위입니다. git commit 명령으로 생성되며, 각 커밋은 고유한 해시(Hash) 값을 가집니다.
    • 커밋 메시지는 어떤 변경이 있었는지 명확하게 설명해야 합니다.
  • 브랜치 (Branch)
    • 독립적인 작업 공간입니다. 특정 시점의 코드를 복사하여 새로운 기능을 개발하거나 버그를 수정할 때 사용합니다. main (또는 master) 브랜치가 프로젝트의 주된 안정적인 코드 라인입니다.
    • 여러 개발자가 각자 다른 브랜치에서 작업하며 main 브랜치에 영향을 주지 않습니다.
  • 병합 (Merge)
    • 두 개 이상의 브랜치의 변경 내용을 하나로 합치는 작업입니다.
  • HEAD
    • 현재 작업 중인 브랜치의 최신 커밋을 가리키는 포인터입니다.
  • 원격 저장소 (Remote Repository)
    • 인터넷에 있는 Git 저장소입니다. 여러 개발자가 코드를 공유하고 협업할 때 사용합니다. GitHub, GitLab, Bitbucket 등이 대표적인 원격 저장소 호스팅 서비스입니다.
  • Pull (풀)
    • 원격 저장소의 변경 내용을 로컬 저장소로 가져오는(다운로드) 작업입니다. (git fetch + git merge)
  • Push (푸시)
    • 로컬 저장소의 변경 내용을 원격 저장소로 올리는(업로드) 작업입니다.

Git 기본 명령어 (터미널 실습)

Git을 사용하려면 먼저 시스템에 Git이 설치되어 있어야 합니다. Git 공식 웹사이트에서 다운로드하여 설치할 수 있습니다.

1. Git 설정 (최초 1회)

git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"

2. 새로운 Git 저장소 초기화 프로젝트 폴더로 이동하여 Git 저장소를 초기화합니다.

cd my-web-project # 프로젝트 폴더로 이동
git init          # 현재 디렉토리를 Git 저장소로 초기화

3. 파일 추가 및 첫 커밋 간단한 index.html 파일을 생성하고 Git에 추가(Staging Area)한 후 커밋합니다.

# index.html 파일 생성 (예시)
echo "<h1>Hello Git!</h1>" > index.html

git add index.html # 변경된 파일을 스테이징 영역에 추가
git status         # 현재 Git 저장소 상태 확인

git commit -m "feat: Add initial index.html page" # 스테이징 영역의 변경 내용을 커밋
  • git add . : 현재 디렉토리의 모든 변경된 파일을 스테이징 영역에 추가합니다.
  • git log : 커밋 이력을 확인합니다.

4. 브랜치 생성 및 전환 새로운 기능을 개발하기 위해 feature/login이라는 브랜치를 생성하고 전환합니다.

git branch feature/login # feature/login 브랜치 생성
git checkout feature/login # feature/login 브랜치로 전환
# 또는 한 번에: git checkout -b feature/login

5. 브랜치에서 작업 및 커밋 login.js 파일을 생성하고 커밋합니다.

# login.js 파일 생성 (예시)
echo "console.log('Login logic here');" > login.js

git add login.js
git commit -m "feat: Implement basic login logic"

6. main 브랜치로 전환 및 병합 작업이 완료되면 main 브랜치로 돌아와서 feature/login 브랜치의 변경 내용을 병합합니다.

git checkout main # main 브랜치로 전환
git merge feature/login # feature/login 브랜치를 main에 병합
git branch -d feature/login # 병합된 feature/login 브랜치 삭제

7. 원격 저장소 연결 및 푸시 GitHub에 새로운 저장소를 만들고 로컬 저장소를 연결한 후 코드를 푸시합니다.

git remote add origin https://github.com/your-username/your-repo-name.git # 원격 저장소 연결
git push -u origin main # main 브랜치를 원격 저장소로 푸시 (최초 1회 -u 사용)
# 이후부터는 git push 만 사용

8. 원격 저장소에서 변경 내용 가져오기 다른 개발자가 원격 저장소에 푸시한 변경 내용을 로컬로 가져옵니다.

git pull origin main # main 브랜치의 최신 내용을 가져와 병합

협업 워크플로우: Git Flow (간략)

Git을 이용한 협업에는 여러 가지 워크플로우(흐름)가 있습니다. 그중 가장 널리 알려진 Git Flow를 간략히 소개합니다. Git Flow는 명확한 브랜치 전략을 통해 복잡한 프로젝트에서도 체계적인 버전 관리를 가능하게 합니다.

주요 브랜치

  • main (또는 master) 브랜치
    • 프로덕션 배포 가능한 안정적인 버전을 관리합니다.
    • 이 브랜치에는 직접 커밋하지 않고, 다른 브랜치에서 병합(Merge)만 합니다.
  • develop 브랜치
    • 다음 출시 버전을 위한 개발 브랜치입니다. 모든 기능 브랜치들은 develop에서 시작하여 develop으로 병합됩니다.
  • feature 브랜치 (feature/기능_이름)
    • 새로운 기능 개발을 위한 브랜치입니다. develop 브랜치에서 분기하여 작업하고, 기능 개발이 완료되면 다시 develop 브랜치로 병합됩니다.
    • 여러 개발자가 동시에 여러 feature 브랜치에서 독립적으로 작업할 수 있습니다.
  • release 브랜치 (release/버전_번호)
    • 새로운 버전 출시를 준비하기 위한 브랜치입니다. develop에서 분기하여 버그 수정, 최종 테스트 등을 수행합니다.
    • 준비가 완료되면 maindevelop 브랜치 모두에 병합됩니다.
  • hotfix 브랜치 (hotfix/버그_이름)
    • main 브랜치(즉, 운영 중인 서비스)에서 발견된 긴급 버그를 수정하기 위한 브랜치입니다. main 브랜치에서 분기하여 작업하고, 수정이 완료되면 maindevelop 브랜치 모두에 병합됩니다.

일반적인 협업 흐름

  1. 새로운 기능 개발
    • git checkout develop
    • git pull origin develop (최신 develop 반영)
    • git checkout -b feature/새로운_기능
    • 기능 개발 및 여러 커밋 수행
    • git push origin feature/새로운_기능 (원격에 푸시)
  2. 기능 개발 완료 및 병합 요청 (Pull Request/Merge Request)
    • feature/새로운_기능 브랜치를 develop 브랜치로 병합하기 위해 GitHub/GitLab 등에서 Pull Request를 생성합니다.
    • 코드 리뷰를 거쳐 승인되면 develop 브랜치로 병합합니다.
  3. 다음 출시 준비
    • develop 브랜치에서 release/버전_번호 브랜치 분기
    • 최종 버그 수정 및 테스트
    • release 브랜치를 maindevelop 브랜치에 병합
    • main 브랜치에 태그(Tag) 추가 (버전 표시)
  4. 긴급 버그 수정
    • main 브랜치에서 hotfix/버그_이름 브랜치 분기
    • 버그 수정 및 커밋
    • hotfix 브랜치를 maindevelop 브랜치에 병합
    • main 브랜치에 태그 추가

Git Flow는 복잡해 보일 수 있지만, 대규모 팀이나 엄격한 릴리즈 관리가 필요한 프로젝트에서 매우 효과적입니다. 소규모 팀에서는 main 브랜치와 feature 브랜치만 사용하는 단순한 워크플로우(GitHub Flow 등)를 사용하기도 합니다. 중요한 것은 팀원들이 공통된 워크플로우를 이해하고 따르는 것입니다.


마무리하며

이번 장에서는 현대 웹 개발의 필수 도구인 Git의 기초 개념과 효율적인 팀 협업을 위한 워크플로우에 대해 학습했습니다.

여러분은 Git이 코드 변경 이력을 추적하고 관리하는 버전 관리 시스템이며, 저장소, 커밋, 브랜치, 병합, Pull/Push와 같은 핵심 개념들을 이해했습니다. 또한, 직접 Git 명령어를 사용하여 로컬 저장소를 초기화하고, 파일을 추가하며 커밋하는 과정, 그리고 브랜치를 생성하고 병합하는 기본적인 워크플로우를 실습했습니다. 마지막으로, 실제 개발 현장에서 가장 널리 사용되는 브랜치 전략 중 하나인 Git Flow를 간략히 살펴보며 체계적인 협업 방식에 대한 감을 익혔습니다.

Git은 단순히 코드를 저장하는 도구가 아니라, 개발 팀의 생산성과 코드 품질, 안정성을 크게 향상시키는 강력한 시스템입니다. 이 장에서 배운 기초 지식을 바탕으로 Git을 능숙하게 활용하여 효율적으로 협업하고, 견고한 웹 애플리케이션을 만들어 나가시길 바랍니다.