소프트웨어 기술(스타트업 위주)

git

git 정리 입니다.


1. Git Basic

Installing Git Locally

Git은 분산 버전 관리 시스템(DVCS)으로, 소스 코드의 변경 사항을 추적하고 협업을 용이하게 하는 도구입니다. 로컬 환경에 Git을 설치하면 로컬 저장소에서 버전 관리가 가능해집니다.

상세 설명

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 관련 확장 기능 제공

Previous
Docker
Next
linux