# Git & GitHub 핵심 정리

> Git은 명령어를 외우는 것이 아니라 **로컬(Local)과 원격(Remote)이 어떻게 상호작용하는지 이해하는 것**이 가장 중요하다.

* * *

# Git이란?

*   **Git** : 버전 관리 시스템(VCS)
    
*   **GitHub** : Git 저장소를 온라인에서 관리하고 협업하기 위한 서비스
    

쉽게 말하면

```text
Git      = 버전 관리 프로그램

GitHub   = Git 저장소를 올려두는 클라우드
```

* * *

# Git의 전체 구조

```text
                  Git

        내 컴퓨터(Local)

 ┌──────────────────────────┐
 │                          │
 │   Working Directory      │
 │     (작업 공간)           │
 │                          │
 └──────────────────────────┘
              │
          git add
              │
              ▼
 ┌──────────────────────────┐
 │      Staging Area        │
 │   (커밋할 파일 선택)       │
 └──────────────────────────┘
              │
        git commit
              │
              ▼
 ┌──────────────────────────┐
 │    Local Repository      │
 │      (.git 폴더)         │
 └──────────────────────────┘
              │
         git push
              │
              ▼
================================== Internet
              │
              ▼
 ┌──────────────────────────┐
 │    Remote Repository     │
 │        GitHub            │
 └──────────────────────────┘
```

여기서 가장 중요한 것은

> **commit은 GitHub에 저장하는 것이 아니라 Local Repository에 저장하는 것이다.**

* * *

# 기본 작업 흐름

평소 개발할 때는 거의 항상 아래 순서를 반복한다.

```text
코드 수정
     │
     ▼
git status
     │
     ▼
git add .
     │
     ▼
git commit
     │
     ▼
git push
```

* * *

# GitHub에서 프로젝트 가져오기

처음 프로젝트를 시작할 때

```bash
git clone https://github.com/user/project.git
```

동작 과정은

```text
GitHub
   │
git clone
   │
   ▼
내 컴퓨터(Local)
```

프로젝트 전체가 복사된다.

* * *

# GitHub 최신 코드 가져오기

협업에서는 작업 전에 항상

```bash
git pull
```

을 실행하는 습관이 중요하다.

```text
GitHub
    │
git pull
    │
    ▼
Local
```

최신 코드가 내려온다.

* * *

# 브랜치(Branch)

브랜치는 **독립된 개발 공간**이다.

예를 들어 로그인 기능을 개발한다고 하면

```text
main
 │
 ├───────────────
 │
 ▼
feature/login
```

브랜치를 생성한다.

```bash
git switch -c feature/login
```

또는

```bash
git checkout -b feature/login
```

* * *

# 왜 브랜치를 사용할까?

만약 모든 사람이 main에서 개발하면

```text
main

A 작업

B 작업

C 작업

D 작업
```

서로 충돌이 자주 발생한다.

그래서

```text
             main

        /      |      \

 login   payment   chat
```

처럼 기능마다 브랜치를 만든다.

* * *

# 로컬 브랜치와 원격 브랜치

예를 들어

### Local

```text
main

feature/login
```

### GitHub

```text
main
```

GitHub에는 아직 브랜치가 없다.

이 상태에서

```bash
git push
```

를 하면

```text
fatal:
The current branch feature/login
has no upstream branch.
```

오류가 발생한다.

왜냐하면

```text
Local

feature/login

      ?

Remote

(없음)
```

Git이 연결할 브랜치를 모르기 때문이다.

* * *

# 원격 브랜치 생성

처음 한 번만

```bash
git push -u origin feature/login
```

을 실행하면

```text
Local

feature/login
      │
      │
      ▼
Remote

feature/login
```

원격 브랜치가 생성된다.

그리고 앞으로는

```bash
git push
```

만 입력하면 된다.

* * *

# 브랜치 병합(Merge)

기능 개발 완료

↓

```text
main

│

├────────── feature/login
```

↓

```bash
git switch main
git merge feature/login
```

↓

```text
main
(로그인 기능 포함)
```

실무에서는 직접 merge보다

```text
feature/login

        │

        ▼

 Pull Request

        │

        ▼

      main
```

방식을 가장 많이 사용한다.

* * *

# 협업 시나리오

## ① 작업 시작

```bash
git pull
```

↓

최신 코드 받기

* * *

## ② 브랜치 생성

```bash
git switch -c feature/login
```

* * *

## ③ 개발

```text
코드 작성
```

* * *

## ④ 저장

```bash
git add .

git commit -m "Login"
```

* * *

## ⑤ GitHub 업로드

```bash
git push -u origin feature/login
```

* * *

## ⑥ Pull Request 생성

GitHub에서

```plaintext
feature/login

↓

main
```

으로 PR 생성

* * *

## ⑦ 코드 리뷰

리뷰 후 Merge

↓

main 업데이트

↓

```bash
git pull
```

다음 작업 시작

* * *

# Merge Conflict

예를 들어

A

```text
login.js

10번째 줄 수정
```

B

```text
login.js

10번째 줄 수정
```

둘 다 수정하면

```bash
git pull
```

시

```text
<<<<<<< HEAD

내 코드

=======

상대 코드

>>>>>>> origin/main
```

처럼 표시된다.

직접 수정 후

```bash
git add .

git commit

git push
```

하면 충돌이 해결된다.

* * *

# Git 주요 명령어

| 명령어 | 설명 |
| --- | --- |
| `git clone` | 프로젝트 복사 |
| `git status` | 상태 확인 |
| `git add .` | 변경 파일 추가 |
| `git commit -m ""` | 로컬 저장 |
| `git push` | GitHub 업로드 |
| `git pull` | 최신 코드 가져오기 |
| `git branch` | 브랜치 목록 |
| `git switch` | 브랜치 이동 |
| `git merge` | 브랜치 병합 |
| `git log --oneline` | 커밋 기록 |

* * *

# Git 전체 흐름 한 장으로 보기

```text
GitHub에서 프로젝트 받기
            │
            ▼
       git clone
            │
            ▼
      Local Repository
            │
       코드 수정
            │
            ▼
        git add
            │
            ▼
      git commit
            │
            ▼
        git push
            │
            ▼
         GitHub
            │
     Pull Request
            │
            ▼
          Merge
            │
            ▼
       git pull
            │
      다음 작업 시작
```

* * *

# 핵심 요약

*   Git은 **버전 관리 시스템**, GitHub는 **원격 저장소 서비스**이다.
    
*   `commit`은 **GitHub가 아니라 Local Repository에 저장**하는 작업이다.
    
*   `push`를 해야 비로소 GitHub에 업로드된다.
    
*   작업 전에는 `git pull`을 통해 최신 코드를 받아오는 습관이 중요하다.
    
*   기능 개발은 `main`이 아닌 **브랜치**에서 진행한다.
    
*   원격 브랜치가 없다면 `git push -u origin <브랜치명>`으로 생성하고 연결한다.
    

* * *

정리하면서 저도 개념이 더 선명해졌습니다. 피드백은 언제나 환영합니다.
