19. Git 과 GitHub
Git 소개
- 2005년 리누스 토르발스가 개발한 분산 버전 관리 시스템.
- 코드 변경 이력 관리, 다수의 개발자 협업을 지원.
- 파일의 모든 변경 이력을 스냅샷처럼 기록해 실수 시 언제든 과거 상태로 돌아갈 수 있고, 원격 저장소를 통해 팀원과 변경 사항을 손쉽게 공유해 협업을 지원한다.
주요 개념 및 기능
1. 버전 관리
- 모든 변경 사항은 커밋(commit)으로 저장되며, 고유한 해시 값으로 식별됨.
2. 분산형 구조
- 모든 개발자는 로컬 저장소를 가지고 작업하며, 필요 시 원격 저장소와 동기화함.
3. 브랜치와 병합
- 브랜치(branch)를 통해 독립적 작업 가능.
- 병합(merge)을 통해 메인 브랜치로 통합.
4. 커밋
- 커밋은 작업 스냅샷이며, 메시지를 통해 설명 가능.
5. 리모트 저장소
- GitHub, GitLab, Bitbucket 등 원격 저장소와 연결하여 협업 가능.
6. pull과 push
git pull
: 원격 -> 로컬git push
: 로컬 -> 원격
7. 태그(tag)
- 특정 커밋에 이름을 붙여 릴리즈 버전 등을 관리.
비유를 통한 개념 이해
개념 | 비유 설명 |
---|---|
저장소 | 책 작업실 |
커밋 | “오늘 여기까지 썼다” 메모가 있는 저장본 |
브랜치 | 책의 여러 초안을 동시에 작성 |
병합 | 여러 초안을 하나의 최종 원고로 통합 |
충돌 | 같은 내용을 서로 다르게 수정해 충돌한 경우 해결 필요 |
Git 내부 구조
-
객체 데이터베이스 기반
- 블롭(blob): 파일 내용
- 트리(tree): 디렉토리 구조
- 커밋(commit): 특정 시점의 트리 가리킴
- 태그(tag): 커밋에 이름 부여
Git의 장점
- 빠른 속도: 대부분 작업이 로컬에서 수행됨.
- 데이터 무결성: 모든 데이터는 해시 기반으로 신뢰도 높음.
- 강력한 브랜칭 모델: 실험과 기능 개발을 안전하게 수행.
Git의 3가지 상태
Git 기본 명령어 실습
# 사용자 설정 (파일은 수정한 사람 정보를 지정한다)
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
# 로컬 저장소 생성 (git 으로 관리하고 싶은 디렉터리를 만들고 저장소로 지정한다)
$ mkdir my_project && cd my_project
$ git init
# 파일 추가 및 커밋 (디렉터리에 변경 사항을 만들고 기록한다)
$ echo "Hello, Git!" > hello.txt
$ git add hello.txt
$ git commit -m "Add hello.txt"
# 파일 수정 후 상태 및 변경 확인 (기록한 이후의 변경 사항에 대해서 git 이 인지하는 것을 확인한다)
$ echo "This is a Git tutorial." >> hello.txt
$ git status
$ git diff
# 변경 사항 저장 및 커밋 (다시 git 에 변경 사항을 기록한다)
$ git add hello.txt
$ git commit -m "Update hello.txt with tutorial message"
# 브랜치 생성 및 병합 (변경 사항이 있는 브랜치를 새로 만들고 수정 후 내용을 메인 브랜치에 적용한다)
$ git branch new-feature
$ git checkout new-feature
$ echo "Feature" >> hello.txt
$ git add hello.txt
$ git commit -m "Add feature"
$ git checkout main
$ git merge new-feature
- git add 상태가 있는건 모든 파일을 커밋으로 기록하고 싶지 않으니, add 를 통해서 스테이지로 올린 다음 그것 들만 commit 한다
- 커밋을 하면 이력으로 남아서 수정 사항이 기록된다.
GitHub 개요
- Git 기반 코드 호스팅 플랫폼
- 코드 협업, 리뷰, 프로젝트 관리, CI/CD 등 지원
주요 기능
기능 | 설명 |
---|---|
저장소 호스팅 | 공개/비공개 저장소 제공, 팀 단위 협업 지원 |
이슈 관리 | 버그 및 기능 요청 추적용 이슈 생성/관리 |
Pull Request | 브랜치 병합 전 코드 리뷰 및 승인 과정 |
프로젝트 보드 | 작업 항목을 시각화하는 칸반 보드 등 관리 도구 제공 |
GitHub Actions | 코드 변경 시 자동화 (빌드/테스트/배포 등) |
위키 | 프로젝트 관련 문서 관리 |
보안 기능 | 코드 스캔, 취약점 감지, 의존성 경고 등 |
기존 원격 저장소 작업물을 로컬로 가져오기
# 원격 저장소 클론
git clone <https://github.com/username/existing-project.git>
# 클론된 디렉토리로 이동
cd <existing-project>
# 새로운 브랜치 생성 및 체크아웃
git checkout -b new-feature
# 파일 수정 후 커밋
echo "Some changes" >> file.txt
git add file.txt
git commit -m "Modify file.txt"
# 원격 저장소에 푸시 (원격 저장소에 권한이 있어야 푸시 가능)
git push origin new-feature
github(원격 저장소에 키 등록하기)
# SSH 키 생성 및 등록 (-C 생략 가능)
$ ssh-keygen -t rsa -b 4096 -C "you@example.com"
cat ~/.ssh/id_rsa.pub
-
GitHub 웹사이트에 로그인 후 오른쪽 상단 프로필 → Settings 로 이동
-
왼쪽 메뉴에서 SSH and GPG keys 선택
-
New SSH key 버튼 클릭
-
Title: 키를 구분할 이름(예: “linux server, window pc”)
-
id_rsa.pub 내용 붙여넣기
-
Add SSH key 클릭
로컬 작업물 원격 저장소에 등록하기
# 원격 저장소 연결
$ git remote add origin <git@github.com:username/repo.git>
# 파일 추가 및 커밋
$ git add .
$ git commit -m "initial commit"
# 푸시
$ git push origin main
GitHub 파일 다운로드
# wget 사용
$ wget https://github.com/user/repo/raw/branch/file.txt
# curl 사용
$ curl -O https://github.com/user/repo/raw/branch/file.txt