29P by alstjr7375 11달전 | favorite | 댓글과 토론

깃을 보다 효율적으로 활용하기 위한 방법을 모아보았습니다.

  1. 레포구조
    • Git은 분산 버전 관리 시스템이라 중앙집중형, 깃허브/깃랩 방식, 계층형등 다양한 방식으로 구성 가능
  2. 브랜치 구조
    • 깃허브 플로우: Main을 두고 기능이나 버그 브랜치를 생성 후, 피드백을 받아 병합하는 형태
    • 깃 플로우: 잦은 배포보다는 전통적인 개발에 유리
      • Feature 브랜치를 만들어 Develop 브랜치에 병합
      • 충분히 성숙한 Develop 브랜치는 Release(Stage) 브랜치를 만들며, 버그 수정만 하며 추후 Develp과 Master에 합침
      • Release 준비가 되면 Master 브랜치에 병합하고, 핫픽스만
    • 깃랩 플로우: 복잡한 깃 플로우와 너무 단순한 깃허브 플로우의 중간형태
      • 깃 플로우에서 잠시 유지하는 Relseae 브랜치 대신, 쭉 유지하는 Stage 브랜치 사용
      • 핫픽스는 Production과 Stage에, 버그 수정은 Stage와 Devlop에 반영
    • Perforce Stream: 여러 릴리즈를 관리해야 할 때 유리
      • Release에서 버그를 고치면 Main-Develop으로 전파
      • Develop에서 기능을 만들면 충돌을 없애고 Main에 반영
    • Trunk 기반: Main(Master)를 보다 효율적으로 쓰려는 시도로 빅테크들이 주로 사용
      • Main을 오래 유지하며, 릴리즈 브랜치에서는 따로 버그 수정을 하지 않음
      • 기능은 플래그를 사용해 Off 상태로 병합해 항상 최신 코드 유지
  3. 커밋
    • 컨벤션: 보통 Angluar 컨벤션을 많이 사용하나 협의를 통해 이모지 등을 사용할 수도 있음
    • 단위: 최소 단위별로 해야 하지만 역시, 팀별로 최소단위에 대한 협의가 필요
      • Hunk로 변경사항을 세분화해 스테이징 가능
      • Delta단위로 변경 사항을 비교할 수 있다면 편함
    • 투기적 커밋과 선형적 기록: 커밋을 자주해 컨텍스트는 유지하면서도 커밋기록을 선형적으로 유지하는 방법
      • Stash나 프로토 타입 시도등 작업 저장이 필요할 때마다 저장
      • Checkout이 필요한 곳마다 Checkout하고 계속 커밋 후 rebase를 통해 선형적으로 유지함
      • git-branchless라는 툴을 사용하면 편함
      • git sl: 익명 분기를 추적하여 커밋기록을 잘 시각화 해줌
      • git prevgit next: 전/후 단위로 체크아웃하기 쉬움
      • git sync: Main으로 리베이스
      • git move: 원하는 곳으로 커밋을 옮길 수 있음
      • git restack: rebasecommit --amend등으로 커밋 기록 순서가 깨지면 복원
      • git undo: 취소 가능
  4. 병합
    • 패치 스택(Patch Stack): 기능[1/3], 기능[2/3], 기능[3/3]과 같이 쪼개서 리뷰하는 방식
    • 일급 충돌: 깃과 호환되는 Jujutsu는 충돌을 커밋에 기록하여 한번 해결된 충돌이 나중에 일어나는 일이 적음
    • 3 Way Diff: Jujusu의 경우 충돌이 발생시 Base-Ours를 Diff로, Theirs는 스냅샷으로 보여줘 직관적. 그러나 IDE/에디터 문법강조나 Base-Their Diff를 보고 싶은 니즈가 있을 수 있음
    • 바이너리 충돌: 깃은 바이너리 파일이 충돌 발생하면 알아서 하라고 방치하지만, 개인적으로 간단한 툴을 만들어 Base와 Their의 파일을 생성하도록 함
    • 패치와 메일: 보다 전통적인(?) 병합 방식에 대한 소개
      • git request-pull은 풀리퀘스트를 생성하는 명령어
      • git send-mail로 패치를 메일로 전송, git am으로 패치 적용이 가능
  5. 기타 관리 방법
    • Worktree: Git history는 공유된채로 SVN 브랜치처럼 작업파일만 여러곳에 체크아웃하여 작업들을 통시에 진행가능
    • Git LFS: 대용량 파일을 관리하는 방법
    • 부분 복제와 부분 체크아웃: 부분적으로 clone하여 다운로드 시간을 줄이고, 부분적으로 checkout하여 원하는 디렉토리만 작업 가능
    • 스칼라: 마이크로소프트의 노력으로 거대한 레포지토리를 쉽게 관리하도록 만들어줌