개발자

Backend Developer Roadmap (3) - Git & GitHub

샤인혁 2023. 9. 4. 15:43

로드맵 3번째 여정

Git이란 무엇인가?

Linus Torvalds가 2005년에 개발한 Git(깃)은 분산형 버전 관리 시스템(Distributed Version Control System, DVCS)의 하나로 소프트웨어 개발 분야에서 가장 널리 사용되는 버전 관리 시스템 중 하나이며 소프트웨어 개발 프로젝트의 소스 코드 및 기타 파일의 변경 이력을 관리하는 도구이다.

 

그렇다면 VCS가 무엇인가?

Version Control System (VCS), 또는 버전 관리 시스템은 소프트웨어 개발에서 코드와 관련된 파일의 변경 이력을 관리하고 추적하는 도구나 시스템이다. VCS는 개발자나 개발 팀이 여러 목적을 달성하기 위해 코드를 효과적으로 관리하고 협업하는 데 도움을 준다. 

 

VCS의 종류로는 로컬 버전 관리 시스템 (Local VCS), 중앙 집중식 버전 관리 시스템 (Centralized VCS - CVCS), 분산 버전 관리 시스템 (Distributed VCS) 등이 있고, Git은 DVCS (분산 버전 관리 시스템)이다.

 

Git의 특징

  • 분산형 관리: Git은 소스 코드 및 변경 이력을 저장하는 데에 중앙 서버가 필요하지 않다. 각 개발자의 로컬 컴퓨터에 완전한 저장소(repository)가 있으며, 변경 내용을 로컬에서 커밋(commit)하고 다른 개발자와 공유할 수 있다. 이로써 오프라인에서도 작업이 가능하며, 협업이 용이해진다.

  • 브랜치 지원: Git은 브랜치(branch) 개념을 지원하여 코드 베이스를 여러 개의 독립적인 브랜치로 나눌 수 있다. 각 브랜치에서 개발자들은 독립적으로 작업할 수 있으며, 나중에 변경 사항을 병합(merge)하여 메인 코드 베이스로 통합할 수 있다.

  • 빠른 속도: Git은 빠른 속도로 동작하며, 대용량 프로젝트에도 빠르게 대응할 수 있다. 이는 Git의 내부 동작 원리와 데이터 구조에 기인한다.

  • 데이터 무결성: Git은 데이터의 무결성을 보장한다. 변경 내용을 저장할 때 해시 값으로 체크섬을 생성하고, 이를 통해 변경 사항의 유효성을 검증한다.

  • 분산 관리: Git은 여러 원격 저장소를 관리하고 데이터를 동기화할 수 있다. 이를 통해 여러 팀 또는 지리적으로 분산된 개발자들이 협업할 때 유용하다.
  • 오픈 소스: Git은 오픈 소스 프로젝트로 무료로 사용할 수 있으며, 개발자 커뮤니티에서 지속적으로 개선되고 확장되고 있다.
  • Git은 소프트웨어 개발뿐만 아니라 문서 관리, 웹 개발, 데이터 분석 등 다양한 분야에서 버전 관리에 활용되며, GitHub, GitLab, Bitbucket과 같은 웹 호스팅 플랫폼을 통해 소스 코드를 저장하고 협업하는 데 널리 사용된다.

 

GitHub란 무엇인가?

GitHub(깃허브)는 Git 기반의 웹 호스팅 플랫폼으로, 코드 저장소를 호스팅하고 협업 및 소프트웨어 개발 프로젝트 관리를 지원하는 서비스이다. GitHub은 개발자들 간의 협업, 소스 코드 관리, 이슈 트래킹, 코드 검토, CI/CD(Continuous Integration/Continuous Deployment) 등을 가능하게 하며, 오픈 소스 프로젝트와 비영리 단체에는 무료로 제공된다.

 

GitHub의 특징

  • 코드 호스팅: 개발자들은 GitHub을 사용하여 Git을 기반으로 한 코드 저장소(repository)를 생성하고 관리할 수 있다. 이를 통해 코드를 중앙 클라우드 서버에 업로드하고 다른 개발자와 협업할 수 있다.

  • 협업 기능: GitHub은 다수의 개발자가 함께 작업하고 코드를 공유하도록 지원한다. 여러 명의 개발자가 동시에 작업하며, 변경 사항을 병합하고 코드 리뷰를 진행할 수 있다.

  • 이슈 트래킹: 프로젝트 내에서 발생하는 이슈나 버그를 관리하고 추적할 수 있는 이슈 트래킹 시스템을 제공한다. 이를 통해 문제를 식별하고 해결하기 위한 효율적인 방법을 찾을 수 있다.
  • 웹 인터페이스: GitHub은 코드를 검토하고 비주얼라이즈(시각화)하며, 코드 변경 사항을 비교하는 기능을 웹 인터페이스를 통해 제공한다. 이를 통해 코드의 역사와 변경 사항을 쉽게 파악할 수 있다.

  • CI/CD 통합: GitHub Actions를 사용하여 CI/CD 파이프라인을 설정하고 자동화할 수 있다. 이를 통해 코드 변경 사항이 자동으로 빌드되고 배포되는 등의 작업을 수행할 수 있다.

  • 보안 및 권한 관리: GitHub은 코드 액세스 권한을 관리하고 코드의 보안을 강화하기 위한 다양한 기능을 제공한다. 민감한 정보를 안전하게 관리할 수 있다.

  • 오픈 소스: GitHub은 오픈 소스 프로젝트에 대한 지원을 강화하고 있으며, 오픈 소스 소프트웨어 개발을 촉진하기 위한 다양한 리소스와 프로그램을 제공한다.


Git의 주요 개념

  • Repository (저장소) : 소스 코드들이 저장되어 있는 물리적인 공간을 의미한다. 저장소를 통해서 작업자가 진행, 변경했던 사항들에 대해 알 수 있다. 작업을 시작할 때 원격 저장소에서 로컬 저장소로 소스 코드를 복사해서 가져오고(Clone), 이후 소스 코드를 변경한 다음 커밋(Commit)한다. 이 때, 커밋한 소스는 로컬 저장소에 저장되며, Push 하기 전에는 원격 저장소에 반영되지 않는다.

  • Working Tree : 흔히 우리가 사용하는 '폴더'를 말한다.

  • Index (= Staging Area) : Commit을 실행하기 전의 저장소와 Working tree 사이에 존재하는 공간을 말한다. Working Tree -> Index -> Commit 순의 절차를 거친다.
  • Commit : 작업 과정들에 대한 점검을 마친 뒤, 저장소에 남기는 과정을 의미한다. 각각의 커밋 단계는 의미 있는 단계이다. 따라서 커밋 로그를 남긴다. git log라는 명령어를 통해 커밋된 사항들에 대해 확인 할 수 있다.

  • Checkout : 특정 시점이나 branch의 소스 코드로 이동하는 것을 의미한다. 이 과정을 통해 과거 여러 시점의 소스 코드로 이동할 수 있다.

  • Branch : Commit 단위로 구분된 소스 코드 타임라인에서 분기해서 새로운 commit을 쌓을 수 있는 가지를 만드는 것을 말한다. Branch에서 작업을 완료하면, Merge 작업을 수행한다.

  • Merge : Branch와 Branch의 내용을 합치는 작업, 즉 병합을 말한다. Branch와는 다소 반대되는 개념이다. 병합 과정 중 두 branch에서 하나의 동일한 파일에서 서로 다른게 수정한 경우 충돌이 발생하며, 병합이 일시정지 된다. 이 때, 충돌 부분에 대해 직접 수정하거나 Merge Tool 등을 활용하여 충돌을 해결한 뒤 병합을 계속 진행한다.

  • Pull Request (풀 리퀘스트): GitHub 및 GitLab과 같은 웹 호스팅 플랫폼에서 제공하는 기능으로, 다른 개발자들에게 코드 변경 사항을 검토하고 병합을 요청하는 메커니즘이다.

  • Clone (복제): 원격 저장소의 내용을 로컬로 복제하여 로컬 저장소를 만드는 작업이다.

  • Fetch (가져오기): 원격 저장소에서 최신 변경 사항을 로컬로 가져오는 작업이다. 로컬 저장소에 반영되지는 않는다.

  • Pull (풀): 원격 저장소에서 최신 변경 사항을 가져와 로컬 브랜치에 자동으로 병합하는 작업이다.

  • Push (푸시): 로컬 저장소의 변경 사항을 원격 저장소로 업로드하는 작업이다.

  • Conflict (충돌): 두 개 이상의 브랜치나 커밋에서 동일한 파일의 같은 부분을 수정한 경우 발생하는 문제로, 수동으로 해결해야 한다.

  • Tag (태그): 특정 커밋에 이름을 부여하여 중요한 이력 지점을 표시하는 기능이다. 주로 릴리스 버전을 관리할 때 사용된다.

  • Stash (스태시): 아직 커밋하지 않은 변경 사항을 일시적으로 보관하고 나중에 다시 적용하는 데 사용된다.

  • Gitignore 파일: Git이 무시해야 하는 파일 또는 디렉터리 목록을 지정하는 설정 파일이다.

  • Submodule (서브모듈): 다른 Git 저장소를 현재 저장소의 하위 디렉터리로 포함하는 방법으로, 다른 프로젝트를 재사용할 때 유용하다.

 

Git의 명령어

  • git init : 깃 초기화. 이 명령어를 실행해야만 깃이 실행된다. 이 명령어 실행 전까지는 그냥 일반 폴더일 뿐이나, 이후엔 추가적인 명령어들을 통해 작업을 진행 할 수 있다.

  • git status : 깃 저장소의 상태를 확인한다. 이 명령어를 통해 현재 상태가 어떤 지 수시로 확인 가능하다.

  • git add : 커밋에 파일의 변경 사항을 포함하도록 한다. 이 명령이 저장소에 새 파일들을 직접적으로 추가하진 않는다.

  • git commit : "git commit -m '저장명'" 등과 같은 명령어로 주로 사용한다. 이 명령어를 통해 커밋을 생성하고, 변경 사항을 확정하여 반영한다.

  • git clone : 기존 소스 코드 다운로드 및 복제한다. 즉, 원격 저장소의 저장소를 로컬에서 이용할 수 있도록 복사해 가져온다.

  • git log : 나의 커밋 내역에 대해 알고 싶을 때 사용하면 현재 커밋 목록들을 확인 가능하다.

  • git checkout : 브랜치에서 브랜치로 이동 가능하다. 현재 버전에서 이전 버전의 커밋으로 이동하거나 변경 전의 브랜치로 접근 가능하다.

  • git checkout master : 이전 버전, 변경 전 브랜치에서 다시 현재의 (master) 브랜치로 되돌아 올 수 있다.

  • git push : 소스 코드의 변경 사항을 원격 저장소에 반영한다.

  • git pull : 원격 저장소의 변경 내용이 현재 디렉토리로 가져와진 뒤, (fetch) 병합된다.

  • git merge : 변경 사항 등이 모두 확정되고 난 후, 브랜치들을 병합한다. 작업 마무리 단계에서 시행한다.

 

https://velog.io/@hxyxneee/git%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

git이란 무엇인가?

 

velog.io