소프트웨어 기술(스타트업 위주)
git
git 정리 입니다.
1. Git Basic
Installing Git Locally
Git은 분산 버전 관리 시스템(DVCS)으로, 소스 코드의 변경 사항을 추적하고 협업을 용이하게 하는 도구입니다. 로컬 환경에 Git을 설치하면 로컬 저장소에서 버전 관리가 가능해집니다.
상세 설명
Git을 로컬 환경에 설치하려면 공식 웹사이트에서 다운로드하거나 패키지 관리자를 사용하여 설치할 수 있습니다.
- Windows: Git for Windows
- macOS:
brew install git
- Linux:
sudo apt install git
특성
- 오프라인에서도 로컬 저장소에서 버전 관리를 할 수 있음
- 모든 변경 이력이 로컬에 저장됨
- 원격 저장소(GitHub, GitLab, Bitbucket 등)와 동기화 가능
2. Repository
2.1 Repository Initialization
Git 저장소(Repository)는 프로젝트의 파일과 변경 이력을 저장하는 디렉터리입니다. .git
폴더가 생성되면 해당 디렉터리는 Git 저장소로 관리됩니다. Git 저장소를 초기화할 때 git init
명령어를 사용합니다. 글로벌 설정과 로컬 설정을 구성할 수 있습니다.
Local vs Global Config
- Local Config: 특정 저장소에만 적용되는 Git 설정
- Global Config: 사용자 단위로 적용되는 Git 설정
2.2 Git Config 설정
# 전역 사용자 이름 및 이메일 설정
$ git config --global user.name "Your Name"
$ git config --global user.email "your.email@example.com"
# 로컬 저장소에서만 적용되는 설정
$ git config --local user.name "Your Repo Name"
$ git config --local user.email "repo.email@example.com"
git init (저장소 초기화)
# 현재 디렉터리를 Git 저장소로 초기화
$ git init
예시
$ mkdir my_project
$ cd my_project
$ git init
Initialized empty Git repository in /my_project/.git/
2.3 Intro and Git Commands
Committing Changes
커밋(Commit)은 변경된 파일을 저장하는 Git의 핵심 기능입니다. 커밋을 수행하면 변경 이력이 영구적으로 저장됩니다.
$ git commit -m "Initial commit"
특성
- 각 커밋에는 고유한 SHA-1 해시가 있음
- 변경 사항을 추적할 수 있음
Staging Area
Staging Area(스테이징 영역)는 커밋할 변경 사항을 임시로 보관하는 공간입니다. Git은 파일을 직접 커밋하지 않고, 먼저 스테이징 영역에 추가한 후 커밋합니다.
$ git add filename
특성
- 실수로 변경 사항을 커밋하는 것을 방지할 수 있음
- 원하는 파일만 선택적으로 커밋 가능
Working Directory
작업 디렉터리(Working Directory)는 사용자가 실제로 파일을 수정하는 공간입니다. Git이 관리하는 프로젝트의 현재 상태를 나타내며, 변경 사항을 추가하면 Git이 이를 추적합니다.
특성
- 변경된 파일은
git status
명령어로 확인 가능
예시
$ git status
On branch main
Untracked files:
(use "git add <file>..." to include in what will be committed)
new_file.txt
2.4 .gitignore
.gitignore
파일은 Git에서 추적하지 않을 파일을 지정하는 설정 파일입니다. 코드 저장소에서 불필요한 파일(로그, 빌드 결과, 환경 설정 파일 등)이 커밋되지 않도록 방지할 수 있습니다.
특성
- 특정 패턴을 지정하여 여러 파일을 한 번에 제외 가능
구체적인 예시
# .gitignore 파일 생성 및 내용 추가
$ echo "*.log" >> .gitignore
$ echo "node_modules/" >> .gitignore
2.5 Viewing Commit History
물리적인 정의
Git의 커밋 히스토리를 조회하면 프로젝트의 변경 내역을 시간순으로 확인할 수 있습니다. git log
명령어를 사용하여 변경 이력을 조회합니다.
특성
- 커밋의 날짜, 작성자, 메시지를 확인할 수 있음
- 브랜치별 변경 이력을 볼 수 있음
예시
$ git log --oneline
3. Branching Basics
Creating Branch
$ git branch new-branch
Renaming Branch
$ git branch -m old-name new-name
Deleting Branch
$ git branch -d branch-name
Checkout Branch
$ git checkout branch-name
Merging Basics
$ git merge branch-name
4. GitHub Essentials
Creating Account
GitHub Interface
- Repository, Pull Requests, Issues 개요
Setting Up Profile
# SSH Key 추가
$ ssh-keygen -t rsa -b 4096 -C "your.email@example.com"
Creating Repositories
$ git remote add origin https://github.com/user/repo.git
$ git push -u origin main
5. Git Remotes
Cloning Repositories
$ git clone https://github.com/user/repo.git
Managing Remotes
$ git remote -v
Pushing / Pulling Changes
$ git push origin main
$ git pull origin main
Fetch Without Merge
$ git fetch origin
6. Merge Strategies
기본적으로 git은 가능하면 fast-forward로 병합 합니다. fast-forward : 브랜치 포인터만 앞으로 당겨주는 방식의 병합.
Fast-Forward vs Non-FF
# Fast-Forward Merge
$ git merge feature-branch
# Non-Fast-Forward Merge
$ git merge --no-ff feature-branch
Rebase
브랜치의 기반(base)을 다른 브랜치로 옮겨서 커밋 기록을 깔끔하게 재배열 하는 명령어 git merge 와의 차이점 -> git merge 는 merge 커밋이 추가되지만 git rebase 는 커밋 수 그대로
$ git rebase main
Squash
여러 개의 커밋을 하나로 뭉쳐서 깔끔하게 정리하는 것
$ git rebase -i HEAD~3
Handling Conflicts
$ git merge branch-name
# 충돌 해결 후
$ git add resolved-file
$ git commit
Cherry Picking Commits
$ git cherry-pick <commit-hash>
7. Collaboration on GitHub
Forking vs Cloning
$ git clone https://github.com/user/repo.git
Issues
- 버그, 기능 요청 등을 관리
Pull Requests
- PR from a Fork
# Fork 후 로컬로 클론하여 PR 생성
Collaborators
코드 리뷰 및 권한 설정
Labelling Issues / PRs
- 카테고리별 정리
Commenting
- Reactions, Mentions, Saved Replies
8. Best Practices
Commit Messages
- 의미 있는 커밋 메시지 작성
Branch Naming
feature/add-login -> 해당 브랜치를 만들고 그 브랜치로 이동하겠다는 명령어
$ git checkout -b feature/add-login
PR Guidelines
- 코드 리뷰 요청
Code Reviews
- 피드백을 통한 개선
Contribution Guidelines
- 오픈소스 기여 지침
Clean Git History
$ git rebase -i
9. Documentation
Markdown
- 문서화의 기본
Project Readme
- 프로젝트 개요 제공
GitHub Wikis
- 문서화 용이
CITATION files
- 연구 논문 등에 사용
10. Working in a Team
Collaborators / Members
- 권한 및 역할 설정
GitHub Organizations
- 기업/팀 프로젝트 관리
Teams within Organization
- 팀별 권한 설정
11. Git Stash Basics
현재 브랜치에서 작업중인 변경사항을 임시저장 하고 싶을 때 사용
$ git stash
$ git stash save
$ git stash apply
$ git stash pop
$ git stash list
12. History
Linear vs Non-Linear
- 깔끔한 vs 복잡한 히스토리
HEAD
- 현재 브랜치의 최신 커밋
Detached HEAD
특정 commit 해시코드로 이동하는 것 해당 시점에서 코드가 잘 동작했던 시점인지 확인하려고 사용.
$ git checkout <commit-hash>
Git Log Options
$ git log --graph --oneline
13. Undoing Changes
Git Revert
지정한 커밋을 되돌리고 반대되는 새로운 커밋을 만듭니다. 협업 상황에서 사용 합니다.
$ git revert <commit-hash>
Git Reset
과거 커밋으로 이력 자체를 변경 -> 기존 커밋 삭제되어버림 공유된 브랜치에서는 사용 금지
- --soft
커밋만 취소하고 파일은 그대로 스테이징된 상태 -> 보통 메시지를 잘못 썼을 때 사용
$ git reset --soft HEAD~1
- --mixed
커밋 + 스테이지 모두 초기화 -> 파일은 그대로 남아 있음 -> 커밋을 취소하고 다시 작업하고 싶을 때
$ git reset --mixed HEAD~1
- --hard
완전히 롤백 ( 파일의 변경 사항도 사라짐) 복구 안되어요~
$ git reset --hard HEAD~1
14. Viewing Diffs
Between Commits
$ git diff commit1 commit2
Between Branches
$ git diff branch1 branch2
Staged Changes
$ git diff --staged
Unstaged Changes
$ git diff
로컬 브랜치가 원격보다 앞섰는지 / 뒤처졌는지 확인
git fetch
git log --oneline --left-right origin/main...main
브랜치 차이 시각화
git diff origin/main..main
15. Rewriting History
Git Commit --amend
마지막 커밋 수정하고 싶을 때
$ git commit --amend
Git Rebase
$ git rebase -i HEAD~3
Git Filter-Branch
$ git filter-branch --tree-filter 'rm -rf sensitive-file' HEAD
Git Push --Force
$ git push --force
16. Tagging
Managing Tags
$ git tag -l
과거 커밋에 태그 달기
$ git tag v1.0.0 a1b2c3
-> a1b2c3 이라는 커밋에 태그 v1.0.0 달기
Pushing Tags
$ git push origin --tags
Checkout Tags
$ git checkout tags/tag-name
GitHub Releases
- 태그 기반으로 릴리즈 관리
17. Git Hooks
What and Why?
- Git 이벤트 발생 시 자동 실행 스크립트
로컬에서 .git 에 접근해서 script 설정을 하면 되는데요. husky 설치해서 연동 권장 드립니다.
npm install husky --save-dev
//초기화
npx husky install
// .husky/ 디렉토리가 생성되고 package.json에 prepare 스크립트가 추가됨
Client vs Server Hooks
- 클라이언트 측: 개발자 환경
- 서버 측: 원격 저장소 적용
Common Hooks
- Pre-Push
git push 하기 전에 자동으로 실행하는 스크립트가 뭔지 보고 싶을 때 사용 합니다.
$ cat .git/hooks/pre-push
- Pre-Commit
$ cat .git/hooks/pre-commit
- Post-Update
원격 저장소에 push 실행된 후 실행되는 훅
$ cat .git/hooks/post-update
- Post-Checkout
$ cat .git/hooks/post-checkout
- Commit-Msg
$ cat .git/hooks/commit-msg
Git Patch
$ git format-patch -1
Submodules
저장소 안에 또다른 저장소를 세팅할 때 사용. 버전관리를 별도로 하고 싶을 대 공통 컴포넌트나 공통 api, 유틸등을 따로 관리하고 싶을 때 사용.
- Adding / Updating
$ git submodule add https://github.com/user/repo.git
What and Why Use?
독립적인 저장소 포함 가능
19. GitHub Actions
Usecases
- CI/CD 자동화
What Are These?
- GitHub 내 자동화 기능을 도와줍니다. 테스트, 빌드, 배포, 코드 포맷, PR 상태체크 자동화를 도와줍니다.
YAML Syntax
파일 위치 : .github/workflows/*.yml
# .github/workflows/test.yml
name: Run Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout 코드
uses: actions/checkout@v3
- name: Node.js 설치
uses: actions/setup-node@v3
with:
node-version: 18
- name: 의존성 설치
run: npm install
- name: 테스트 실행
run: npm test
코드가 push되거나 PR이 생성되면
GitHub 서버에서 Node.js 환경을 설정하고
npm install & npm test를 자동으로 실행합니다.
jenkins 등의 역할을 대체합니다.
20. GitHub API
REST API
$ curl -H "Authorization: token YOUR_TOKEN" https://api.github.com/user
GraphQL API
- 더 효율적인 데이터 쿼리 가능
21. Creating Apps
알고있으면 좋을 내용 OAuth Apps
- 인증 기반 서비스 개발 가능 -> 사용자가 Github로 로그인해서 대시보드를 보는 서비스 만드록 싶을 때
GitHub Apps
- 특정 작업 자동화 가능 -> PR이 올라오면 자동으로 검사하고 댓글을 다는 봇을 만들 때
22. Webhooks
github actions 과 비슷한 역할을 해요 하지만 한가지 차이점은 wehooks 는 외부시스템에 알림 or 연동 하는 것이에요 jenkins 나 slack 에 특정 트리거를 주고 싶을 때 사용하는 것이에요.
Deploying Static Websites
name: Deploy
on: push
jobs:
deploy:
steps:
- run: echo "Deploying..."
23. GitHub Pages
정적 웹사이트를 GitHub Pages에 배포하는 것 예: 포트폴리오, 문서, 블로그 등을 쉽게 배포할 수 있어요
Deploying Static Websites
$ gh pages deploy
Custom Domains
- 사용자 지정 도메인 설정 가능
Static Site Generators
- Jekyll, Hugo 지원
24. 기타
git flow git & github flow 방식
사용자가 많고 대규모, 이미 운영중인 서비스 : git flow 방식 권장
스타트업, 신규구축 : github flow 권장
GitHub Gists
- 코드 스니펫 공유 가능
GitHub Packages
- 패키지 호스팅
GitHub Codespaces
- 클라우드 개발 환경 제공
GitHub Security
- 코드 분석 및 보안 점검 가능
GitHub Sponsors
- 오픈소스 개발자 후원 가능
GitHub Copilot
- AI 기반 코드 자동완성
GitHub Models
- GitHub 내 데이터 모델
GitHub Marketplace
- GitHub 관련 확장 기능 제공