- GitHub에 대한 특징 조사
1. 협업 코딩에 최적화
Codespace
Codespaces는 코드 개발에 보다 쉽게 액세스하고 반복 가능한 구성 옵션을 확장하는 클라우드 호스팅 개발 환경이다.
팀은 Codespaces를 사용하여 반복 가능한 프로젝트 구성 생성을 포함하여 프로젝트를 사용자 지정할 수 있다. Codespaces는 2~32개의 VM 기반 서버에서 구성할 수 있으며 Visual Studio(VS) Code에서 로컬로 연결하거나 브라우저를 사용하여 원격으로 연결할 수 있다.
버전 관리
버전관리는 개발자간의 협업에 필요하다. 전체 개발 소스를 공유하면서 개발 파트를 나눌 수 있고 같은 모듈을 개발하더라도 소스를 서로 공유하며 개발할 수 있다. 버전관리 시 소스 하나 또는 묶음을 하나의 버전으로 간주한다. 파일이나 폴더를 추가, 수정, 삭제하며 사람이 직접 관리를 한다. 원할 때 예전 버전 내용 전체를 되돌려 볼 수 있으며 복잡한 코드를 개발할 때 이전 버전과 비교하기 편하다. 버전관리 활용의 장점은 개발 협업이 용이하다는 것이다. 또한 이력 관리가 개별적으로 가능하고 관리 내용을 오픈소스로 공유 할 수 있다는 장점을 가지고 있다.
또한, 깃허브는 사용자들이 다른 사용자의 프로젝트를 포크하여 자신만의 버전을 만들고 유지보수할 수 있도록 해준다.
GitHub Copilot
GitHub Copilot은 OpenAI Codex를 사용하여 편집기에서 바로 코드와 전체 기능을 실시간으로 제공한다.
GitHub Copilot은 코딩할 때 자동 완성 스타일 제안을 제공하는 AI pair 프로그래머이다. 사용하려는 코드 작성을 시작하거나 코드에서 수행하려는 작업을 설명하는 자연어 주석을 작성하여 GitHub Copilot에서 제안을 받을 수 있다. GitHub Copilot은 편집 중인 파일과 관련 파일의 컨텍스트를 분석하고 텍스트 편집기 내에서 제안을 제공한다. GitHub Copilot은 OpenAI에서 만든 새로운 AI 시스템인 OpenAI Codex로 구동된다.
Pull requests
Pull requests을 사용하면 GitHub의 리포지토리에서 분기로 푸시한 변경 내용에 대해 다른 사용자에게 알릴 수 있다. Pull requests가 열리면 공동 작업자와 잠재적인 변경 내용을 논의 및 검토하는 한 편 변경 내용이 기본 분기에 병합되기 전에 후속 커밋을 추가할 수 있다.
GitHub를 사용하면 프로젝트에서 작업하는 모든 사람이 컴퓨터에서 동일한 코드의 사본을 사용할 수 있다. 즉, GitHub에 어떤 일이 발생했다면 이론적으로 모든 것을 다시 함께 조각 할 수 있다.
2. CI/CD 자동화
Actions
GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 지속적 통합 및 지속적 배포(CI/CD) 플랫폼이다. 리포지토리에 대한 모든 풀 요청을 빌드 및 테스트하는 워크플로를 생성하거나 병합된 풀 요청을 프로덕션에 배포할 수 있다.
GitHub Actions는 DevOps를 넘어 리포지토리에서 다른 이벤트가 발생할 때 워크플로를 실행할 수 있다. 예를 들어 누군가 저장소에 새 문제를 생성할 때마다 적절한 레이블을 자동으로 추가하는 워크플로우를 실행할 수 있다.
GitHub는 Linux, Windows 및 macOS 가상 머신을 제공하여 워크플로를 실행하거나 자체 데이터 센터 또는 클라우드 인프라에서 자체 호스팅 러너를 호스팅할 수 있다.
GitHub Packages
GitHub Packages는 지정된 사용자에 대해 비공개로 또는 공개적으로 소프트웨어 패키지를 호스트하고 패키지를 프로젝트에 종속성으로 사용할 수 있도록 하는 소프트웨어 패키지 호스팅 서비스이다.
GitHub Packages는 컨테이너, 기타 종속성 등을 포함하여 패키지를 호스트하고 관리하기 위한 플랫폼이다. GitHub Packages는 원본 코드와 패키지를 한 곳에 결합하여 통합 권한 관리 및 청구를 제공하므로 GitHub에서 소프트웨어 개발을 중앙 집중화할 수 있다.
3. 보안에 강함
Repository 보안
리포지토리는 개별적으로 소유하거나 조직의 다른 사용자와 리포지토리 소유권을 공유할 수 있다. 리포지토리의 표시 여부를 선택하여 리포지토리에 액세스할 수 있는 사용자를 제한할 수 있다. 사용자 소유 리포지토리의 경우 프로젝트에서 공동 작업할 수 있도록 다른 사용자에게 협력자 액세스 권한을 부여할 수 있다. 조직에서 리포지토리를 소유한 경우 조직 구성원에게 리포지토리에서 공동 작업할 수 있도록 액세스 권한을 부여할 수 있다.
Secret scanning
GitHub에서는 실수로 커밋된 비밀이 사기에 사용되는 것을 방지하기 위해 리포지토리에 알려진 유형의 secret이 있는지 검사한다. secret 스캐닝은 비밀에 대해 GitHub 리포지토리에 있는 모든 브랜치의 전체 Git 기록을 스캔한다.
4. 프로젝트 관리 편의성
프로젝트는 작업을 효과적으로 계획하고 추적하는 데 도움이 되도록 GitHub의 issue 및 pull request와 통합되는 적응형 스프레드시트이다. 문제 및 풀 요청을 필터링, 정렬, 그룹화하고 구성 가능한 차트로 작업을 시각화하고 사용자 지정 필드를 추가하여 팀별 메타데이터를 추적하여 여러 보기를 만들고 사용자 지정할 수 있다. 특정 방법론을 적용하는 대신 프로젝트는 팀의 요구 사항과 프로세스에 맞게 사용자 지정할 수 있는 유연한 기능을 제공한다.
또한, 팀 관리 기능을 통해 팀 작업을 조정하고 결과를 관리할 수 있다.
issue가 발생하면 GitHub에서 작업을 추적할 수 있으며, 여기에서 개발이 이루어진다. 다른 issue 또는 pull request에서 문제를 언급하면 관련 작업을 추적할 수 있도록 문제의 타임라인에 상호 참조가 반영된다. 작업이 진행 중임을 나타내기 위해 문제를 끌어오기 요청에 연결할 수 있다. 끌어오기 요청이 병합되면 연결된 문제가 자동으로 종료된다.
- 기능 조사 (주요 기능수준)
clone
clone은 특정 repository를 내 local machine에 복사하여 새로운 저장소를 만든다. clone한 원본 repository를 remote 저장소 origin으로 가지고 있다. 권한이 없는 경우 해당 저장소로 push 하지 못한다.
또한 기존의 제일 처음 original repository와 연결되지 못한다. 즉 저장소의 commit, 등의 로그를 보지 못한다.
fork
포크는 귀하의 계정에 있는 다른 사용자 저장소의 개인 사본이다. 포크를 사용하면 원래 업스트림 리포지토리에 영향을 주지 않고 프로젝트를 자유롭게 변경할 수 있다. 또한 업스트림 리포지토리에서 풀 요청을 열고 두 리포지토리가 계속 연결되어 있으므로 포크를 최신 변경 사항과 동기화된 상태로 유지할 수 있다.
clone과 fork의 차이점
fork는 다른 사람의 Github repository에서 내가 어떤 부분을 수정하거나 추가 기능을 넣고 싶을 때 해당 respository를 내 Github repository로 그대로 복제하는 기능이다. fork한 저장소는 원본(다른 사람의 github repository)와 연결되어 있다. 여기서 연결 되어 있다는 의미는 original repository에 어떤 변화가 생기면(새로운 commit) 이는 그대로 forked된 repository로 반영할 수 있다. 이 때 fetch나 rebase의 과정이 필요하다.
merge
병합은 한 분기(동일한 리포지토리 또는 포크)의 변경 내용을 가져와서 다른 분기에 적용한다. 이는 종종 "끌어오기 요청"(병합 요청으로 간주될 수 있음) 또는 명령줄을 통해 발생한다. 충돌하는 변경 내용이 없거나 항상 명령줄을 통해 수행할 수 있는 경우 GitHub.com 웹 인터페이스를 통해 끌어오기 요청을 통해 병합을 수행할 수 있다.
pull
끌어오기는 변경 내용을 가져오고 병합할 때를 나타낸다. 예를 들어 둘 다 작업 중인 원격 파일을 편집한 경우 로컬 복사본에 대한 변경 내용을 최신 상태로 유지하려고 한다.
fetch
"git fetch"를 사용하면 원격 리포지토리의 변경 내용을 커밋하지 않고 로컬 작업 분기에 추가합니다. "git pull"에서는 달리 fetch를 사용하면 변경 내용을 로컬 분기에 커밋하기 전에 검토할 수 있다.
pull과 fetch의 차이점
git fetch는 로컬 Git에게 원격 저장소에서 최신 메타데이터 정보를 확인하라는 명령을 전달한다. 단 fetch는 원격 저장소에 변경사항이 있는지 확인만 하고, 변경된 데이터를 로컬 Git에 실제로 가져오지는 않는다.
반면 git pull은 원격 저장소에서 변경된 메타데이터 정보를 확인할 뿐만 아니라 최신 데이터를 복사하여 로컬 Git에 가져온다.
만일 원격 저장소에 변경 사항이 존재하는 상황에서 pull을 바로 실행하면 현재 브랜치와 작업 복사본의 파일이 변경되는 동시에 새로 작업한 내용이 손실되는 일이 생길 수 있다. 따라서 fetch로 변경 사항을 먼저 확인한 후 pull을 실행하는 방법이 보다 안전하다.
pull request
풀 리퀘스트는 사용자가 제출하고 리포지토리의 공동 작업자가 수락하거나 거부한 리포지토리에 대한 제안된 변경 사항이다. 이슈와 마찬가지로 풀 리퀘스트에는 각각 고유한 토론 포럼이 있다.
push
푸시하는 것은 커밋된 변경 내용을 GitHub.com 원격 리포지토리로 보내는 것을 의미한다. 예를 들어 로컬에서 변경한 내용을 다른 사용자가 액세스할 수 있도록 변경 내용을 푸시할 수 있다.
branch
브랜치는 리포지토리의 병렬 버전이다. 이것은 리포지토리 내에 포함되지만 "라이브" 버전을 방해하지 않고 자유롭게 작업할 수 있도록 기본 또는 기본 분기에 영향을 미치지 않는다. 원하는 대로 변경했으면 브랜치를 다시 기본 브랜치로 병합하여 변경 사항을 게시할 수 있다.
commit
커밋은 파일(또는 파일 집합)에 대한 개별 변경 사항이다. 작업을 저장하기 위해 커밋하면 Git은 고유한 ID(일명 "SHA" 또는 "해시")를 생성하여 커밋된 특정 변경 사항과 변경한 사람 및 시기를 기록할 수 있다. 커밋에는 일반적으로 변경 사항에 대한 간략한 설명인 커밋 메시지가 포함된다.
merge conflict
병합된 분기 간에 발생하는 차이다. 병합 충돌은 사람들이 같은 파일의 같은 줄을 다르게 변경하거나 한 사람이 파일을 편집하고 다른 사람이 같은 파일을 삭제할 때 발생한다. 분기를 병합하려면 먼저 병합 충돌을 해결해야 한다.
push a branch
브랜치를 원격 리포지토리에 성공적으로 푸시하면 로컬 브랜치의 변경 사항으로 원격 브랜치를 업데이트한다. "브랜치를 푸시"하면 Git은 원격 저장소에서 브랜치의 HEAD 참조를 검색하고 해당 브랜치의 로컬 HEAD 참조에 대한 직접적인 조상인지 확인한다. 일단 확인되면 Git은 모든 객체(로컬 HEAD ref에서 도달할 수 있고 원격 리포지토리에서 누락됨)를 원격 객체 데이터베이스로 가져온 다음 원격 HEAD ref를 업데이트한다. 원격 HEAD가 로컬 HEAD의 조상이 아니면 push가 실패한다.
메인 저장소
메인 저장소(Main repository)는 오픈소스 프로젝트의 깃허브 상의 메인 저장소를 의미한다. 개인이 기여하고 싶은 프로젝트의 저장소이므로 개인에게 쓰기 권한이 없고 일반적으로 이를 업스트림(Upstream)이라고 부른다.
나의 저장소
나의 저장소(My github repository)는 깃허브상에서 자신의 계정상에 존재하는 저장소로 메인저장소로 부터 포크(fork)한 저장소이다.
로컬 저장소
로컬 저장소(Local git repository)는 나의 컴퓨터사에 생성한 로컬 깃 저장소를 의미한다.
작업 공간
작업공간(Workspace)는 컴퓨터상에서 실제 내가 소스를 개발하고 수정하는 작업공간을 의미한다.
Git 동작 원리
기본적으로 깃(Git)프로젝트에 담겨있는 데이터들은 파일 시스템 상에서의 스냅샷(Snapshot)이라고 볼 수 있다. 실제로 프로젝트를 커밋(Commit)하여 적용할 때의 순간을 중요시한다는 특징이 있다. 파일 자체를 저장하기 보다 수정 내역 자체를 저장한다.
Git의 동작 원리를 바르게 이해하기 위해서는 Git 프로젝트의 세 가지 구성요소에 대해서 이해할 필요가 있다.
- Working Directory: 아직 커밋할 준비가 되지 않은, 작업하는 파일이 있는 디렉토리이다.
- **Staging Area:**커밋(Commit)을 수행할 파일들이 올라가는 영역으로 커밋할 준비가 된 변경 내용이 Git 저장소에 기록되기 전에 대기하는 장소이다.
- Git Directory: Git 프로젝트의 메타 데이터와 데이터 정보가 저장되는 디렉토리입니다.
Local 저장소와 Remote 저장소 구조

git add : 현재 작업 디렉토리에 있는 모든 또는 일부 변경 내용을 스테이징 영역으로 이동시킬 수 있다.
git commit : staging Area에 있는 commit 된 것들을 local repository(.Git directory)에 저장시킨다.
git push : local repository에 있는 것들을 remote 저장소에 업로드한다. 이 동작을 수행하고 나면, GitHub 홈페이지의 해당 브랜치에 저장된다.
댓글