[태그:] 깃허브

  • Git의 기본

    주니어 개발자를 위한 Git 사용법 정리 노트

    이 문서는 나 같은 주니어 개발자를 위한 정리 문서다. 프로젝트 진행 시 코드의 버전 관리와 협업을 위해 실무에서 사용하는 Git 핵심 기능을 정리한다.

    1. Git 사용의 목적

    Git은 단순한 명령어 묶음이 아니다. 코드를 보호하는 세이브 포인트이자 협업의 효율을 높이는 핵심 도구이다. 그 목적은 다음 세 가지로 정의할 수 있다.

    • 버전 관리: 코드의 특정 상태를 ‘커밋(Commit)’ 단위로 기록한다. 이를 통해 특정 시점의 코드로 돌아가거나 변경 이력을 추적할 수 있다.
    • 안전한 개발 환경: ‘브랜치(Branch)’를 통해 기존 코드에 영향을 주지 않는 독립적인 작업 공간을 확보한다. 새로운 기능 개발이나 테스트를 안전하게 진행하고, 완료 시점에만 본래 코드에 통합(Merge)한다.
    • 협업 지원: 다수의 개발자가 동일한 프로젝트를 작업할 때, 각자의 변경 사항을 체계적으로 추적하고 병합할 수 있도록 지원한다. 코드 충돌(Conflict) 발생 시점을 명확히 하고 해결을 돕는다.

    2. Git 기본 작업 흐름

    Git은 Working Directory, Staging Area, Repository라는 3개의 논리적 공간을 통해 버전을 관리한다.

    1. Working Directory (작업 디렉토리): 실제 파일들이 위치하며, 코드 수정이 이루어지는 공간.
    2. Staging Area (스테이징 영역): 버전으로 기록할 파일, 즉 커밋 대상 파일들을 선별하여 등록하는 대기 공간.
    3. Repository (저장소): 스테이징 영역에 있던 파일들의 최종 버전(스냅샷)이 영구적으로 보관되는 곳.
    명령어설명
    git init현재 디렉토리를 Git 저장소로 초기화한다. (.git 폴더 생성)
    git add <파일명>작업 디렉토리의 변경 사항을 스테이징 영역에 추가한다.
    git commit -m "메시지"스테이징 영역의 변경 사항을 하나의 버전으로 묶어 저장소에 기록한다.
    git push로컬 저장소의 변경 내용을 원격 저장소(GitHub 등)에 업로드한다.

    용어 구분: clonepull

    • git clone: 원격 저장소의 내용을 최초에 한 번 로컬 컴퓨터로 복제하는 작업이다.
    • git pull: 이미 clone된 로컬 저장소에, 원격 저장소의 최신 변경 내용을 가져와 병합하는 작업이다.

    3. 브랜치를 활용한 실무 개발

    브랜치는 실무 개발의 핵심이다. 주 작업 흐름인 main 브랜치를 깨끗하게 유지하며, 기능 단위로 작업을 분리할 수 있다.

    브랜치 기본 명령어

    # 'feature/login' 이름의 새 브랜치를 생성한다.
    $ git branch feature/login
    
    # 생성된 'feature/login' 브랜치로 작업 환경을 전환한다.
    $ git checkout feature/login
    
    # 브랜치 생성과 동시에 해당 브랜치로 즉시 전환한다. (위 두 명령어를 합친 것)
    $ git checkout -b feature/login

    생성된 브랜치에서의 모든 작업(commit)은 다른 브랜치에 영향을 미치지 않는다. 기능 개발이 완료되면 main 브랜치에 병합하여 변경 사항을 반영한다.

    브랜치 전략

    프로젝트의 특성에 따라 브랜치 관리 전략을 선택한다.

    1. Github-flow:

      • 개념: main 브랜치는 항상 배포 가능한 상태를 유지하고, 모든 작업은 feature 브랜치에서 진행한 뒤 main으로 병합(Pull Request)한다.
      • 적용: 구조가 단순하여 개인 프로젝트나 빠른 배포 주기를 가진 웹 서비스에 적합하다.
    2. Git-flow:

      • 개념: main, develop, feature, release, hotfix 등 명확한 역할 구분을 가진 브랜치들을 운영한다.
      • 적용: 체계적인 버전 관리가 필요한 대규모 프로젝트나 모바일 애플리케이션 등 정식 릴리즈가 중요한 경우에 사용한다.

    4. 실수 발생 시 대처 방법

    실수 시 되돌리는 방법을 명확히 숙지하여 위험을 관리한다.

    시나리오 1: 커밋 되돌리기

    주의: 원격 저장소에 push한 커밋은 reset으로 되돌리면 안 된다. 공유된 작업 이력을 훼손하여 협업 시 심각한 문제를 유발할 수 있다.

    • git revert (안전한 방법):

      • 특정 커밋의 변경 사항을 취소하는 새로운 커밋을 생성한다. 기존 이력을 삭제하지 않고 변경 사실을 기록으로 남기므로 공유된 저장소에서 사용하기에 안전하다.
      • 사용법: $ git revert <되돌릴_커밋_ID>
    • git reset (강력하지만 위험한 방법):

      • 저장소의 이력을 특정 커밋 시점으로 되돌린다. 그 이후의 커밋 기록은 실제로 삭제된다. 원격 저장소에 push하기 전, 로컬 저장소의 커밋을 정리할 때 제한적으로 사용한다.
      • 사용법: $ git reset HEAD~1 (가장 최근 커밋 1개를 취소)

    시나리오 2: 추적하지 않는 파일 삭제

    주의: git clean 명령어는 추적하지 않는(untracked) 파일을 영구적으로 삭제한다. 휴지통에 보관되지 않으므로 실행에 신중해야 한다.

    반드시 삭제될 파일을 미리 확인하는 습관이 필요하다.

    # 어떤 파일이 삭제될지 미리 확인만 한다. (Dry Run)
    $ git clean -n
    
    # 미리보기 후, 실제로 삭제를 진행한다.
    $ git clean -f

    5. 커밋 메시지 작성 규칙

    커밋 메시지는 미래의 자신과 동료를 위한 중요한 문서이다. Conventional Commits 규칙을 따라 작성하면 변경 이력을 명확하게 관리할 수 있다.

    기본 형식: <타입>(<스코프>): <제목>

    타입설명
    feat새로운 기능 추가
    fix버그 수정
    docs문서 수정
    style코드 포맷팅 등 기능 변경 없는 스타일 수정
    refactor성능 개선이나 구조 변경 등 코드 리팩토링
    test테스트 코드 추가 및 수정
    chore빌드 관련 파일 수정 등 기타 자잘한 작업

    좋은 예시: feat(auth): JWT 기반의 사용자 인증 기능 구현
    나쁜 예시: 코드 수정, 버그 해결

  • Git과 GitHub 협업 실전 팁: 개발팀에서 살아남는 버전 관리 완전 가이드

    안녕하세요, 성장하는 개발자 여러분!

    “개발은 혼자 하는 것이 아니다” 🤝

    처음 회사에 입사했을 때, 저는 Git을 단순히 “코드 백업 도구” 정도로만 생각했습니다. 하지만 실제 팀 프로젝트에 참여하면서 깨달았죠. Git과 GitHub는 단순한 도구가 아니라 팀워크의 핵심이라는 것을!

    오늘은 제가 실무에서 겪은 다양한 상황들을 통해 배운 Git과 GitHub 협업의 모든 것을 정리해 드리겠습니다. 더 이상 “merge conflict가 무서워서 push를 못하겠어요” 라는 말은 하지 마세요! 😅

    1. Git의 진짜 존재 이유: 혼자가 아닌 함께

    왜 Git을 배워야 할까?

    # 개발자의 하루 일과
    09:00 - 어제 작업한 코드 확인
    09:30 - 동료가 수정한 코드와 합치기
    10:00 - 새로운 기능 개발 시작
    12:00 - 점심 전 임시 저장
    14:00 - 버그 발견! 이전 버전으로 되돌리기
    16:00 - 팀원과 코드 리뷰하기
    18:00 - 최종 버전 배포 준비
    
    # 이 모든 과정에서 Git이 필요합니다!

    Git vs 다른 백업 방법들

    # 😱 끔찍한 과거의 방법들
    프로젝트_최종.zip
    프로젝트_최종_진짜최종.zip
    프로젝트_최종_진짜최종_수정.zip
    프로젝트_최종_진짜최종_수정_220714.zip
    
    # 😎 Git으로 깔끔하게
    git log --oneline
    a1b2c3d 버그 수정
    e4f5g6h 새로운 기능 추가
    i7j8k9l 코드 리팩토링
    m0n1o2p 프로젝트 초기 설정

    2. Git 기본 명령어: 실무에서 자주 쓰는 것만 골라서

    프로젝트 시작하기

    # 새 프로젝트 시작
    git init
    git add README.md
    git commit -m "Initial commit"  # 관례적으로 첫 커밋 메시지
    
    # 기존 프로젝트 가져오기
    git clone https://github.com/company/awesome-project.git
    cd awesome-project

    일상적인 작업 흐름

    # 1. 현재 상태 확인 (하루에 수십 번 사용)
    git status
    
    # 2. 변경사항 확인
    git diff                    # 아직 add 안 한 변경사항
    git diff --staged          # add 한 변경사항
    git diff HEAD~1            # 이전 커밋과 비교
    
    # 3. 파일 추가 (선택적으로)
    git add src/components/Button.js    # 특정 파일만
    git add src/components/            # 특정 폴더만
    git add .                          # 모든 변경사항 (신중하게!)
    
    # 4. 커밋하기
    git commit -m "Add user authentication feature"
    
    # 5. 한 번에 add + commit (이미 추적 중인 파일만)
    git commit -am "Fix typo in user profile"

    실수했을 때 되돌리기

    # 아직 커밋 안 한 변경사항 되돌리기
    git checkout -- filename.js        # 특정 파일
    git checkout -- .                  # 모든 파일
    
    # 커밋 메시지 수정 (마지막 커밋만)
    git commit --amend -m "정정된 커밋 메시지"
    
    # 커밋 되돌리기 (3가지 방법)
    git reset --soft HEAD~1    # 커밋만 취소, 파일은 staged 상태 유지
    git reset --mixed HEAD~1   # 커밋 취소, 파일은 unstaged 상태 (기본값)
    git reset --hard HEAD~1    # 커밋 취소, 파일 변경사항도 모두 삭제 (주의!)
    
    # 안전한 되돌리기 (이력 남김)
    git revert a1b2c3d        # 특정 커밋의 변경사항을 되돌리는 새 커밋 생성

    .gitignore 활용법

    # .gitignore 파일 예시
    
    # 운영체제 파일
    .DS_Store
    Thumbs.db
    
    # IDE 설정 파일
    .vscode/
    .idea/
    *.swp
    *.swo
    
    # 의존성 파일
    node_modules/
    __pycache__/
    *.pyc
    
    # 빌드 결과물
    dist/
    build/
    *.min.js
    
    # 환경 설정 파일 (보안 중요!)
    .env
    .env.local
    config/database.yml
    
    # 로그 파일
    *.log
    logs/
    
    # 임시 파일
    tmp/
    temp/

    중요한 팁: .gitignore는 아직 Git이 추적하지 않는 파일에만 적용됩니다!

    # 이미 커밋된 파일을 .gitignore에 추가했다면
    git rm --cached 파일명        # Git 추적에서만 제거 (파일은 유지)
    git rm -r --cached 폴더명     # 폴더 전체 추적 제거
    git commit -m "Remove tracked files from .gitignore"

    3. 브랜치 전략: 혼자서도 쓰고, 팀에서도 쓰는

    브랜치의 기본 개념

    # 브랜치 확인
    git branch                  # 로컬 브랜치 목록
    git branch -r              # 원격 브랜치 목록
    git branch -a              # 모든 브랜치 목록
    
    # 브랜치 생성 및 이동
    git branch feature/user-auth           # 브랜치 생성
    git checkout feature/user-auth         # 브랜치 이동
    git checkout -b feature/user-auth      # 생성과 이동을 한 번에
    
    # 최신 Git에서는 switch 사용 권장
    git switch feature/user-auth           # 브랜치 이동
    git switch -c feature/user-auth        # 생성과 이동을 한 번에

    Git Flow 브랜치 전략 (대부분의 회사에서 사용)

    # 브랜치 구조
    main (master)     ← 배포용 (항상 안정적)
      ↓
    develop          ← 개발 메인 브랜치
      ↓
    feature/*        ← 새 기능 개발
    hotfix/*         ← 긴급 버그 수정
    release/*        ← 배포 준비
    
    # 실제 작업 흐름
    # 1. 새 기능 개발 시작
    git checkout develop
    git pull origin develop
    git checkout -b feature/user-login
    
    # 2. 개발 완료 후 develop에 합치기
    git checkout develop
    git pull origin develop  # 최신 상태로 업데이트
    git merge feature/user-login
    git push origin develop
    git branch -d feature/user-login  # 로컬 브랜치 삭제

    GitHub Flow (간단한 프로젝트용)

    # 더 간단한 전략
    main             ← 배포용
    feature/*        ← 모든 작업용 브랜치
    
    # 작업 흐름
    git checkout main
    git pull origin main
    git checkout -b fix/payment-bug
    # ... 작업 ...
    git push origin fix/payment-bug
    # GitHub에서 Pull Request 생성

    4. 원격 저장소 관리: GitHub과 친해지기

    원격 저장소 연결

    # 원격 저장소 추가
    git remote add origin https://github.com/username/project.git
    
    # 여러 원격 저장소 관리
    git remote add origin https://github.com/company/project.git
    git remote add fork https://github.com/myname/project.git
    
    # 원격 저장소 확인
    git remote -v
    
    # 원격 저장소 URL 변경
    git remote set-url origin https://github.com/newurl/project.git

    push와 pull의 실전 활용

    # 기본적인 push/pull
    git push origin main
    git pull origin main
    
    # 새 브랜치 첫 push (upstream 설정)
    git push -u origin feature/new-feature
    # 이후로는 git push만 해도 됨
    
    # force push (조심해서 사용!)
    git push --force-with-lease origin main  # 더 안전한 방법
    git push -f origin main                  # 위험한 방법
    
    # fetch vs pull
    git fetch origin          # 원격 변경사항만 가져오기 (로컬 파일 안 건드림)
    git pull origin main      # fetch + merge를 한 번에

    충돌 해결하기 (Conflict Resolution)

    # merge 중 충돌 발생 시
    git merge feature/user-auth
    # Auto-merging src/auth.js
    # CONFLICT (content): Merge conflict in src/auth.js
    # Automatic merge failed; fix conflicts and then commit the result.
    
    # 충돌 파일 확인
    git status
    # Unmerged paths:
    #   both modified:   src/auth.js
    
    # 충돌 해결 후
    git add src/auth.js
    git commit -m "Resolve merge conflict in auth.js"

    충돌이 발생한 파일을 열면 이런 식으로 표시됩니다:

    function authenticateUser(username, password) {
    <<<<<<< HEAD
        // 현재 브랜치의 코드
        return bcrypt.compare(password, user.hashedPassword);
    =======
        // 합치려는 브랜치의 코드
        return crypto.compare(password, user.encryptedPassword);
    >>>>>>> feature/user-auth
    }

    수동으로 편집해서 올바른 코드를 남기고 <<<<<<<, =======, >>>>>>> 표시를 삭제합니다.

    5. GitHub 협업 워크플로우: Pull Request부터 Code Review까지

    Pull Request (PR) 만들기

    # 1. 브랜치에서 작업 완료
    git checkout -b feature/add-shopping-cart
    # ... 개발 작업 ...
    git add .
    git commit -m "Add shopping cart functionality"
    git push origin feature/add-shopping-cart
    
    # 2. GitHub에서 Pull Request 생성
    # - base: main, compare: feature/add-shopping-cart
    # - 제목: Add shopping cart functionality
    # - 설명: 장바구니 기능을 추가했습니다. 상품 추가/삭제/수량 변경이 가능합니다.

    좋은 PR 만들기

    ## PR 템플릿 예시
    
    ### 🎯 작업 내용
    
    - [ ] 장바구니 상품 추가 기능
    - [ ] 장바구니 상품 삭제 기능
    - [ ] 상품 수량 변경 기능
    - [ ] 장바구니 총액 계산
    
    ### 🧪 테스트
    
    - [ ] 단위 테스트 추가
    - [ ] 통합 테스트 확인
    - [ ] 수동 테스트 완료
    
    ### 📸 스크린샷
    
    (UI 변경사항이 있다면 스크린샷 첨부)
    
    ### 🔗 관련 이슈
    
    Closes #123
    
    ### 📝 리뷰어에게
    
    장바구니 성능 최적화 부분을 특히 검토해 주세요.

    Code Review 받고 주기

    # 리뷰 반영 후 추가 커밋
    git add .
    git commit -m "Apply code review suggestions"
    git push origin feature/add-shopping-cart
    
    # PR이 승인되고 merge 후 정리
    git checkout main
    git pull origin main
    git branch -d feature/add-shopping-cart  # 로컬 브랜치 삭제

    리뷰 받을 때의 마음가짐:

    • 비판이 아닌 성장의 기회로 받아들이기
    • 질문하기를 두려워하지 말기
    • “왜 이렇게 했나요?”에 당황하지 말고 설명하기

    리뷰 줄 때의 원칙:

    • 코드에 대한 의견, 사람에 대한 공격 금지
    • “이렇게 하면 어떨까요?” 식의 제안
    • 칭찬도 적극적으로 해주기

    6. 실무에서 자주 마주치는 상황들과 해결법

    상황 1: “어? 내 코드가 사라졌어요!”

    # 원인: 잘못된 merge나 reset
    # 해결: reflog 활용
    git reflog                    # 모든 작업 이력 확인
    git checkout HEAD@{3}         # 3단계 전으로 되돌아가기
    git checkout -b recovery      # 복구용 브랜치 생성

    상황 2: “커밋 메시지를 잘못 적었어요!”

    # 마지막 커밋 메시지 수정
    git commit --amend -m "올바른 커밋 메시지"
    
    # 이미 push한 경우 (팀원과 상의 후)
    git push --force-with-lease origin feature-branch

    상황 3: “잘못된 브랜치에 커밋했어요!”

    # 현재 브랜치에서 커밋을 다른 브랜치로 옮기기
    git checkout correct-branch
    git cherry-pick a1b2c3d      # 특정 커밋만 가져오기
    
    # 원래 브랜치에서 커밋 제거
    git checkout wrong-branch
    git reset --hard HEAD~1

    상황 4: “큰 파일을 실수로 커밋했어요!”

    # Git에서 파일 이력까지 완전 삭제
    git filter-branch --force --index-filter 
    'git rm --cached --ignore-unmatch path/to/large-file' 
    --prune-empty --tag-name-filter cat -- --all
    
    # 더 쉬운 방법: BFG Repo-Cleaner 사용
    java -jar bfg.jar --delete-files large-file.zip
    git reflog expire --expire=now --all && git gc --prune=now --aggressive

    상황 5: “동료와 같은 파일을 수정했어요!”

    # 충돌 최소화 전략
    # 1. 자주 pull 받기
    git pull origin develop
    
    # 2. 작은 단위로 커밋하기
    git add specific-file.js
    git commit -m "Add validation for email field"
    
    # 3. rebase 사용하기 (히스토리를 깔끔하게)
    git pull --rebase origin develop

    7. 고급 Git 기능: 실무에서 빛나는 도구들

    Stash: 임시 저장의 마법

    # 작업 중 급한 버그 수정 요청이 들어왔을 때
    git stash                              # 현재 작업 임시 저장
    git stash save "WIP: user profile UI"  # 메시지와 함께 저장
    
    git checkout hotfix/critical-bug
    # ... 버그 수정 ...
    git checkout feature/user-profile
    
    git stash list                         # 저장된 stash 목록
    git stash pop                          # 가장 최근 stash 적용 후 삭제
    git stash apply stash@{1}              # 특정 stash 적용 (유지)
    git stash drop stash@{1}               # 특정 stash 삭제

    Cherry-pick: 선택적 커밋 가져오기

    # 다른 브랜치의 특정 커밋만 가져오기
    git log --oneline feature/payment     # 커밋 해시 확인
    git cherry-pick e4f5g6h               # 특정 커밋만 현재 브랜치에 적용
    
    # 여러 커밋을 한 번에
    git cherry-pick e4f5g6h i7j8k9l m0n1o2p

    Interactive Rebase: 커밋 이력 정리

    # 최근 3개 커밋 수정
    git rebase -i HEAD~3
    
    # 에디터에서 수행할 수 있는 작업들:
    # pick: 커밋 그대로 유지
    # edit: 커밋 메시지나 내용 수정
    # squash: 이전 커밋과 합치기
    # drop: 커밋 삭제
    # reorder: 순서 바꾸기 (줄 순서 변경)

    Bisect: 버그 찾기

    # 언제부터 버그가 시작됐는지 이진 검색으로 찾기
    git bisect start
    git bisect bad                    # 현재 버전은 버그 있음
    git bisect good v1.0.0           # v1.0.0은 정상 작동
    
    # Git이 중간 지점으로 이동시켜 줌
    # 테스트 후 결과 입력
    git bisect good                   # 이 버전은 정상
    # 또는
    git bisect bad                    # 이 버전도 버그 있음
    
    # 반복하면 버그가 시작된 커밋을 찾아줌
    git bisect reset                  # 원래 위치로 돌아가기

    8. GitHub 고급 기능: 프로젝트 관리부터 자동화까지

    Issues와 Project 관리

    ## Issue 템플릿 예시
    
    ### 🐛 버그 리포트
    
    **증상**
    로그인 후 프로필 페이지가 로딩되지 않음
    
    **재현 방법**
    
    1. 메인 페이지에서 로그인
    2. 프로필 메뉴 클릭
    3. 빈 화면 표시
    
    **예상 결과**
    사용자 프로필 정보가 표시되어야 함
    
    **실제 결과**
    빈 화면이 표시됨
    
    **환경**
    
    - OS: macOS Monterey
    - Browser: Chrome 103.0.5060.134
    - Device: MacBook Pro 2021
    
    **추가 정보**
    브라우저 콘솔에 API 오류 메시지 출력

    GitHub Actions로 자동화

    # .github/workflows/ci.yml
    name: CI
    
    on:
      push:
        branches: [main, develop]
      pull_request:
        branches: [main, develop]
    
    jobs:
      test:
        runs-on: ubuntu-latest
    
        steps:
          - uses: actions/checkout@v3
    
          - name: Setup Node.js
            uses: actions/setup-node@v3
            with:
              node-version: "18"
              cache: "npm"
    
          - name: Install dependencies
            run: npm ci
    
          - name: Run tests
            run: npm test
    
          - name: Run linting
            run: npm run lint
    
          - name: Build project
            run: npm run build

    Security 기능 활용

    # 의존성 보안 취약점 확인
    npm audit
    npm audit fix
    
    # GitHub에서 자동으로 보안 취약점 알림
    # Settings > Security & analysis 에서 설정
    # - Dependency graph
    # - Dependabot alerts
    # - Dependabot security updates

    9. 팀 협업을 위한 Git 컨벤션

    커밋 메시지 컨벤션

    # Conventional Commits 형식
    <type>[optional scope]: <description>
    
    [optional body]
    
    [optional footer(s)]
    
    # 예시들
    feat: add user authentication
    fix: resolve login redirect issue
    docs: update API documentation
    style: fix code formatting
    refactor: improve database query performance
    test: add unit tests for user service
    chore: update dependency versions
    
    # 더 구체적인 예시
    feat(auth): implement OAuth 2.0 login
    fix(payment): handle null pointer in payment processing 
    docs(readme): add installation instructions

    브랜치 네이밍 컨벤션

    # 기능 개발
    feature/user-authentication
    feature/shopping-cart
    feature/payment-integration
    
    # 버그 수정
    fix/login-redirect-issue
    fix/payment-validation-error
    hotfix/critical-security-patch
    
    # 개선 작업
    improve/database-performance
    refactor/user-service
    chore/update-dependencies
    
    # 실험적 기능
    experiment/new-ui-design
    spike/graphql-integration

    코드 리뷰 가이드라인

    ## 리뷰 체크리스트
    
    ### 기능성
    
    - [ ] 요구사항을 충족하는가?
    - [ ] 엣지 케이스가 처리되었는가?
    - [ ] 에러 핸들링이 적절한가?
    
    ### 코드 품질
    
    - [ ] 코드가 읽기 쉬운가?
    - [ ] 네이밍이 명확한가?
    - [ ] 중복 코드가 없는가?
    - [ ] 함수가 한 가지 역할만 하는가?
    
    ### 성능
    
    - [ ] 불필요한 리렌더링이 없는가?
    - [ ] 메모리 누수 가능성은 없는가?
    - [ ] 데이터베이스 쿼리가 효율적인가?
    
    ### 보안
    
    - [ ] 사용자 입력 검증이 되어있는가?
    - [ ] 민감한 정보가 노출되지 않는가?
    - [ ] 인증/인가가 적절히 구현되었는가?

    10. 실무 시나리오: 하루 일과로 보는 Git 활용

    오전 9시: 출근 후 상황 파악

    # 1. 최신 상태 확인
    git status
    git pull origin develop
    
    # 2. 어제 작업 내용 확인
    git log --oneline -10
    git diff HEAD~1
    
    # 3. 오늘 할 일 확인
    git branch -a
    git checkout feature/user-dashboard

    오전 10시: 새로운 기능 개발 시작

    # 1. 새 브랜치 생성
    git checkout develop
    git pull origin develop
    git checkout -b feature/email-notifications
    
    # 2. 첫 번째 작업 커밋
    # ... 코딩 ...
    git add src/services/email.js
    git commit -m "feat: add email service basic structure"
    
    # 3. 중간 저장 (점심 전)
    git add .
    git commit -m "wip: implement email template system"
    git push origin feature/email-notifications

    오후 2시: 코드 리뷰 요청 들어옴

    # 1. 현재 작업 임시 저장
    git stash save "WIP: email notification templates"
    
    # 2. 리뷰할 브랜치로 이동
    git checkout feature/user-profile-update
    git pull origin feature/user-profile-update
    
    # 3. 코드 확인
    git log --oneline -5
    git diff develop..feature/user-profile-update
    
    # 4. 로컬에서 테스트
    npm test
    npm run lint
    
    # 5. GitHub에서 리뷰 작성 후 원래 작업으로 복귀
    git checkout feature/email-notifications
    git stash pop

    오후 4시: 긴급 버그 수정 요청

    # 1. 현재 작업 저장
    git add .
    git commit -m "wip: email notification progress save"
    
    # 2. 핫픽스 브랜치 생성
    git checkout main
    git pull origin main
    git checkout -b hotfix/payment-error
    
    # 3. 버그 수정
    # ... 코딩 ...
    git add .
    git commit -m "fix: resolve payment processing timeout issue"
    
    # 4. 테스트 후 push
    npm test
    git push origin hotfix/payment-error
    
    # 5. 즉시 PR 생성 및 빠른 리뷰 요청

    오후 6시: 하루 마무리

    # 1. 작업 내용 정리
    git add .
    git commit -m "feat: complete email notification system
    
    - Add email template engine
    - Implement notification queue
    - Add email delivery tracking
    - Add unit tests"
    
    # 2. 원격에 push
    git push origin feature/email-notifications
    
    # 3. PR 생성 준비
    git log --oneline feature/email-notifications ^develop
    
    # 4. 내일을 위한 메모
    echo "TODO: Add integration tests for email system" > TODO.md
    git add TODO.md
    git commit -m "docs: add TODO for tomorrow"

    11. 자주 하는 실수와 예방법

    실수 1: “git add .” 남용

    # ❌ 나쁜 습관
    git add .
    git commit -m "fix stuff"
    
    # ✅ 좋은 습관
    git add src/components/Button.js
    git add tests/button.test.js
    git commit -m "fix: resolve button click event handler"
    
    git add README.md
    git commit -m "docs: update installation instructions"

    실수 2: 의미 없는 커밋 메시지

    # ❌ 나쁜 예시들
    git commit -m "fix"
    git commit -m "update"
    git commit -m "changes"
    git commit -m "asdf"
    git commit -m "work in progress"
    
    # ✅ 좋은 예시들
    git commit -m "fix: resolve null pointer exception in user service"
    git commit -m "feat: add password strength validation"
    git commit -m "refactor: extract common utility functions"
    git commit -m "test: add integration tests for payment flow"

    실수 3: merge vs rebase 혼동

    # merge: 브랜치 히스토리 보존 (협업 시 안전)
    git checkout main
    git merge feature/user-auth
    
    # rebase: 깔끔한 히스토리 (개인 브랜치에서만)
    git checkout feature/user-auth
    git rebase main
    
    # ⚠️ 주의: 이미 push한 브랜치는 rebase 금지!

    실수 4: 큰 파일 커밋

    # 예방: .gitignore에 미리 추가
    *.log
    *.tmp
    node_modules/
    .env
    dist/
    build/
    
    # Git LFS 사용 (큰 바이너리 파일용)
    git lfs track "*.psd"
    git add .gitattributes
    git add design.psd
    git commit -m "add design file with LFS"

    12. 도구와 설정으로 생산성 높이기

    Git 설정 최적화

    # 기본 설정
    git config --global user.name "김개발"
    git config --global user.email "dev@company.com"
    
    # 편의 설정
    git config --global init.defaultBranch main
    git config --global core.autocrlf input  # Windows에서는 true
    git config --global core.editor "code --wait"  # VS Code 사용
    
    # 유용한 별칭들
    git config --global alias.st status
    git config --global alias.co checkout
    git config --global alias.br branch
    git config --global alias.ci commit
    git config --global alias.unstage 'reset HEAD --'
    git config --global alias.last 'log -1 HEAD'
    git config --global alias.visual '!gitk'
    
    # 로그 예쁘게 보기
    git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

    VS Code와 Git 연동

    // settings.json
    {
      "git.autofetch": true,
      "git.confirmSync": false,
      "git.enableSmartCommit": true,
      "diffEditor.ignoreTrimWhitespace": false,
      "merge-conflict.autoNavigateNextConflict.enabled": true
    }

    유용한 Git GUI 도구들

    # 터미널에서 시각적으로
    git log --graph --oneline --all
    git log --graph --pretty=format:'%h -%d %s (%cr) <%an>' --abbrev-commit --all
    
    # GUI 도구들
    - GitHub Desktop (초보자 추천)
    - SourceTree (무료, 강력한 기능)
    - GitKraken (유료, 예쁜 UI)
    - VS Code Git Graph 확장 (개발 중 편리)

    마치며: Git 마스터가 되는 여정

    단계별 학습 로드맵

    초급 (1-2개월):

    • [x] 기본 명령어 (add, commit, push, pull)
    • [x] 브랜치 생성과 이동
    • [x] GitHub 기본 사용법
    • [x] .gitignore 작성

    중급 (3-6개월):

    • [x] merge와 rebase 차이점 이해
    • [x] 충돌 해결하기
    • [x] Pull Request 워크플로우
    • [x] stash, cherry-pick 활용

    고급 (6개월+):

    • [x] interactive rebase로 히스토리 정리
    • [x] GitHub Actions으로 자동화
    • [x] Git hooks 활용
    • [x] 복잡한 브랜치 전략 설계

    매일 연습할 수 있는 것들

    # 매일 아침 루틴
    git status
    git pull origin develop
    git log --oneline -5
    
    # 작업 중 습관화할 것들
    1. 작은 단위로 자주 커밋
    2. 의미 있는 커밋 메시지 작성
    3. 푸시 전에 한 번 더 확인
    4. 동료 코드 적극적으로 리뷰하기
    
    # 주간 정리
    git log --since="1 week ago" --oneline
    git branch -d <merged-branches>  # 정리

    마지막 조언

    Git은 도구일 뿐, 협업이 목적입니다. 완벽한 Git 사용법보다는 팀원들과 원활하게 소통하고 협업하는 것이 더 중요해요.

    실수를 두려워하지 마세요! Git의 가장 큰 장점은 거의 모든 것을 되돌릴 수 있다는 것입니다. 많이 시도해보고, 많이 실수해보면서 자연스럽게 익숙해질 거예요.

    그리고 무엇보다, 동료에게 도움을 요청하는 것을 부끄러워하지 마세요. “이 상황에서 어떻게 해야 할지 모르겠어요”라고 말하는 것이 혼자 끙끙대는 것보다 훨씬 효율적입니다! 🤝


    다음에는 “CI/CD와 자동화 배포 실전 가이드”로 개발 프로세스의 마지막 퍼즐을 맞춰보겠습니다. 기대해 주세요!