본문 바로가기
배움: MBA, English, 운동

깃 (Git) 과 깃허브 (Github) 기본 개념과 협업 워크플로

by Heedong-Kim 2024. 2. 18.

깃(Git)과 깃허브(GitHub)를 학습하는 과정에서 초보자가 직면하는 주요 어려움은 크게 세 가지로 분류할 수 있습니다: 기술적 복잡성의 이해, 워크플로우와 협업 프로세스의 마스터링, 그리고 실수로 인한 문제 해결입니다. 각각의 어려움을 극복하기 위한 방안을 제시하겠습니다.

 

기본 개념

1. 커밋 (Commit)

커밋은 깃에서 가장 기본적인 단위로, 프로젝트의 특정 시점에 대한 스냅샷입니다. 개발자가 프로젝트에 변경 사항(예: 파일 추가, 수정, 삭제 등)을 적용하고 이를 저장소에 기록하고자 할 때 커밋을 생성합니다. 각 커밋은 이전 커밋들로부터 변경된 부분만을 포함하며, 고유한 ID(보통 SHA-1 해시 사용)를 가집니다. 이를 통해 개발자는 프로젝트의 이력을 정확히 추적하고, 필요시 이전 상태로 롤백할 수 있습니다.

2. 브랜치 (Branch)

브랜치는 프로젝트의 다양한 기능 개발이나 버그 수정을 독립적으로 진행하기 위해 사용됩니다. 기본적으로 모든 깃 저장소에는 하나의 'master' 또는 'main' 브랜치가 있으며, 추가적인 브랜치는 이로부터 분기됩니다. 브랜치를 사용하면 개발자는 다른 개발자의 작업에 영향을 주지 않으면서 코드 변경을 진행할 수 있습니다. 작업이 완료되면, 해당 브랜치는 'merge'를 통해 다시 메인 브랜치와 합쳐집니다.

3. 풀 리퀘스트 (Pull Request)

풀 리퀘스트는 깃허브에서 사용되는 개념으로, 한 브랜치의 변경 사항을 다른 브랜치에 병합하기 위해 제안하는 메커니즘입니다. 이는 코드 리뷰, 토론, 추가 수정이 이루어진 후 최종적으로 코드가 병합되는 과정을 포함합니다. 풀 리퀘스트는 협업 과정에서 중요한 역할을 하며, 코드의 품질을 보장하고, 팀 내의 지식 공유를 촉진합니다.

이러한 개념들의 중요성

  • 코드의 버전 관리: 커밋을 통해 코드의 이력을 관리하며, 언제든지 특정 버전으로 롤백할 수 있습니다.
  • 병렬 개발: 브랜치를 사용하여 여러 기능을 동시에 개발할 수 있으며, 이는 개발 프로세스의 효율성을 높입니다.
  • 품질 관리: 풀 리퀘스트와 코드 리뷰 과정을 통해 코드의 품질을 유지하고, 프로젝트에 기여하는 모든 변경 사항을 검토할 수 있습니다.

깃과 깃허브는 이러한 개념을 기반으로 소프트웨어 개발 프로젝트의 효율적인 관리와 협업을 가능하게 합니다.

 

 

 

협업 워크플로우

1. 피처 브랜치 워크플로우 (Feature Branch Workflow)

피처 브랜치 워크플로우는 각 기능 개발이나 버그 수정을 위해 별도의 브랜치(피처 브랜치)를 생성하고, 작업이 완료되면 메인 브랜치(예: master 또는 main)에 병합(merge)하는 방식입니다. 이 워크플로우의 핵심은 모든 작업을 별도의 브랜치에서 수행함으로써 메인 브랜치의 안정성을 유지하는 것입니다.

  • 장점: 개발자는 독립적으로 작업을 진행할 수 있으며, 코드 리뷰와 테스트를 거친 후에만 메인 브랜치에 병합됩니다. 이로 인해 코드 통합 과정에서 발생할 수 있는 충돌과 버그를 최소화할 수 있습니다.
  • 프로세스:
    1. 새 기능 개발이나 버그 수정을 위해 메인 브랜치에서 피처 브랜치를 생성합니다.
    2. 피처 브랜치에서 작업을 완료한 후, 변경 사항을 커밋합니다.
    3. 작업이 완료되면, 피처 브랜치를 메인 브랜치에 병합하기 전에 풀 리퀘스트를 생성하여 코드 리뷰를 요청합니다.
    4. 팀원들의 리뷰를 거쳐 문제가 없으면 메인 브랜치에 병합합니다.

2. 포크 & 풀 모델 (Fork & Pull Model)

포크 & 풀 모델은 오픈 소스 프로젝트에서 널리 사용되는 워크플로우입니다. 이 모델에서, 기여자는 원본 저장소를 자신의 계정으로 '포크(fork)'하여 복사본을 만듭니다. 기여자는 이 복사본에서 변경 사항을 작업한 후, 원본 저장소로 '풀 리퀘스트(pull request)'를 보내어 변경 사항을 제안합니다.

  • 장점: 프로젝트 소유자는 누구나 프로젝트에 기여할 수 있게 하면서도, 제안된 변경 사항을 검토하고 승인하기 전까지 프로젝트의 코드 베이스에 직접적인 변경을 허용하지 않아 안정성을 유지할 수 있습니다.
  • 프로세스:
    1. 기여하고자 하는 프로젝트를 포크하여 개인 계정에 복사본을 생성합니다.
    2. 포크한 저장소에서 작업을 진행하고 변경 사항을 커밋합니다.
    3. 작업이 완료되면, 원본 저장소로 풀 리퀘스트를 생성하여 변경 사항을 제안합니다.
    4. 프로젝트 소유자 또는 관리자가 풀 리퀘스트를 검토하고, 필요한 피드백을 제공하거나 변경 사항을 승인하여 병합합니다.

이러한 협업 워크플로우는 팀원들 간의 명확한 커뮤니케이션, 코드 품질 관리, 프로젝트의 지속적인 안정성 유지에 기여합니다. 각 워크플로우는 특정 프로젝트의 요구사항, 팀 구조, 작업 방식에 따라 선택되며, 효과적인 협업과 고품질의 소프트웨어 개발을 위한 기반이 됩니다.

 

실수로 인한 문제해결

잘못된 브랜치에 커밋을 한 경우와 병합 충돌(merge conflict)을 잘못 처리한 경우, 각각의 상황에 맞는 해결 방법을 제시하겠습니다. 이러한 문제들은 개발 과정에서 흔히 발생할 수 있으며, 깃(Git)은 이를 해결하기 위한 여러 도구와 명령어를 제공합니다.

 

잘못된 브랜치에 커밋한 경우


문제 상황: 예를 들어, 기능 개발을 위한 브랜치(feature-branch)에서 작업해야 하는데, 실수로 메인 브랜치(main)에 커밋을 한 경우입니다.

  1. 잘못 커밋된 변경 사항을 새로운 브랜치로 이동하기
    • 잘못 커밋된 변경 사항이 아직 원격 저장소에 푸시되지 않았다면, 새로운 브랜치를 생성하고 현재 상태를 그 브랜치에 체크아웃할 수 있습니다.
      git branch new-feature-branch
      git reset --hard HEAD~1
      git checkout new-feature-branch

    • git reset --hard HEAD~1 명령어는 메인 브랜치의 마지막 커밋을 되돌립니다. 그 후, 새로운 브랜치에 체크아웃하여 잘못된 커밋을 올바른 브랜치로 옮깁니다.
  2. 원격 저장소에 이미 푸시된 경우, Revert 사용
    • 이미 원격 저장소에 잘못된 커밋을 푸시한 경우, git revert 명령어를 사용하여 잘못된 커밋을 취소할 수 있습니다.
      git revert <잘못된 커밋의 해시>

    • 이 명령어는 잘못된 커밋을 되돌리는 새로운 커밋을 생성합니다. 그 후, 올바른 브랜치로 체크아웃하여 필요한 변경 사항을 커밋합니다.

병합 충돌을 잘못 처리한 경우

문제 상황: 두 브랜치를 병합할 때, 같은 파일의 같은 부분을 수정했기 때문에 발생한 충돌을 잘못 해결한 경우입니다.

 

해결 방법:

  1. 병합 충돌 발생 시
    • 충돌이 발생하면, 우선 충돌을 일으킨 파일을 열고, 충돌 부분을 직접 수정해야 합니다. 깃은 충돌이 발생한 부분을 표시해줍니다.
    • 충돌을 해결한 후, 변경 사항을 추가하고 커밋하여 병합 과정을 완료합니다.
      git add .
      git commit -m "Resolve merge conflict"

  2. 잘못 처리된 충돌 수정하기
    • 이미 충돌을 잘못 해결하고 커밋한 경우, git revert 또는 git reset 명령어를 사용하여 이전 상태로 되돌릴 수 있습니다.
    • git revert를 사용하여 잘못된 해결을 취소하는 새로운 커밋을 만들거나, git reset을 사용하여 충돌 해결 전의 상태로 되돌립니다.
      git revert <잘못 해결된 커밋의 해시>

    • 또는
      git reset --hard <충돌 해결 전의 커밋 해시>

    • 그 후, 충돌을 다시 해결합니다.

잘못된 브랜치에 커밋을 하거나 병합 충돌을 잘못 처리한 경우에는 침착하게 문제를 해결할 수 있는 깃 명령어를 활용하는 것이 중요합니다. 상황에 따라 적절한 명령어를 사용하여 코드 베이스를 원하는 상태로 복구할 수 있습니다.