# 🔗 Remote, push, pull: đưa project blog lên GitHub

> Sign in to view the full content of this lesson.

## Mục tiêu bài học

- Tạo repo trên GitHub và nối repo local với remote bằng `git remote add`.
- Push commit đầu tiên lên `main` và thiết lập upstream để lần sau chỉ cần `git push`.
- Pull thay đổi từ GitHub về máy mà không sinh commit rác.
- Đọc và xử lý lỗi `rejected ... non-fast-forward`.

## Ôn nhanh

Bài trước em đã nắm mô hình ba vùng: `git add` đưa file vào staging, `git commit` chốt vào repo local. Nhưng "local" nghĩa là nằm trên ổ cứng của em, xóa folder là mất hết. Hôm nay mình nối repo đó với GitHub để có bản backup thật và để người khác cùng làm việc.

```mermaid
flowchart LR
  WT["📝<br/>Working tree"] --> ST["📦<br/>Staging"]
  ST --> LOCAL["🗂️<br/>Repo local"]
  LOCAL -- "push ⬆️" --> REMOTE["☁️<br/>GitHub remote"]
  REMOTE -- "pull ⬇️" --> LOCAL
```

Ba khái niệm cần nhớ trước khi gõ lệnh:

- **Remote**: một cái tên trỏ tới URL của repo trên GitHub. Tên `origin` chỉ là quy ước, không bắt buộc.
- **`upstream`**: remote mặc định của một branch. Có upstream rồi thì `git push` và `git pull` không cần gõ tên remote nữa.
- **`origin/main`**: bản ghi của em về trạng thái `main` trên GitHub, cập nhật mỗi lần fetch/push.

## Ví dụ thực hành: đưa `blog-ca-nhan` lên GitHub

Tình huống thật: em đã có folder `blog-ca-nhan` với `index.html`, `css/style.css`, `README.md` và 2 commit từ bài trước.
