---
title: "05 - Push 與 Pull"
type: note
specialty: Programming
tags: [git-github, 05-push與pull]
---

# 05 - Push 與 Pull

← [[04-GitHub入門]] | 下一篇 → [[06-分支管理]]

---

## ⬆️ Push：把本地推到 GitHub

```bash
# 第一次 push（需要設定 upstream）
git push -u origin main

# 之後每次 push 只需要
git push
```

> `-u` 是 `--set-upstream` 的縮寫，設定預設的推送目標。
> 第一次設定後，以後直接 `git push` 就夠了。

### 完整的第一次 push 流程

```bash
# 1. 初始化（如果還沒有）
git init

# 2. 加入所有檔案
git add .

# 3. 建立第一個 commit
git commit -m "Initial commit"

# 4. 連接 GitHub repo
git remote add origin git@github.com:username/repo-name.git

# 5. Push！
git push -u origin main
```

---

## ⬇️ Pull：從 GitHub 拉下最新版本

```bash
git pull
```

`git pull` 實際上是兩個指令的組合：

```
git fetch   ← 從 GitHub 抓取最新資料（但不合併）
+
git merge   ← 將抓下來的內容合併到本地
```

### 什麼時候要 pull？

- 在多台電腦上工作時，每次開始工作前先 pull
- 和別人合作時，在 push 之前先 pull

---

## 🔄 多台電腦的同步工作流程

**電腦 A（家裡）完成工作後：**

```bash
git add .
git commit -m "更新筆記"
git push
```

**電腦 B（醫院）開始工作前：**

```bash
git pull
# 現在就有最新的筆記了，可以繼續編輯
```

---

## ⚠️ Push 被拒絕怎麼辦？

最常見的錯誤訊息：

```
! [rejected]  main -> main (fetch first)
error: failed to push some refs
```

這代表 GitHub 上有你本地沒有的新 commit（例如在另一台電腦 push 過）。

### 解法

```bash
# 先 pull（把遠端的拉下來合併）
git pull

# 確認沒有衝突後，再 push
git push
```

---

## 💥 Merge Conflict（合併衝突）

如果兩邊都修改了同一個檔案的同一個地方，Git 就不知道要保留哪個版本，會出現衝突。

```
CONFLICT (content): Merge conflict in notes.md
Automatic merge failed; fix conflicts and then commit the result.
```

Git 會在衝突的地方標記：

```
<<<<<<< HEAD
這是你本地的版本
=======
這是 GitHub 上的版本
>>>>>>> origin/main
```

### 解決衝突的步驟

1. 打開衝突的檔案，手動選擇要保留的內容（刪掉 `<<<<<<<`、`=======`、`>>>>>>>` 這些標記）
2. 存檔
3. `git add 衝突的檔案`
4. `git commit -m "解決合併衝突"`
5. `git push`

---

## 🗑️ 強制覆蓋遠端（危險！謹慎使用）

```bash
# 強制 push，會覆蓋遠端的版本
git push --force
```

> [!warning] 只在你確定遠端的版本不重要時才使用。
> 多人協作時絕對不要用，會讓別人的工作消失！

---

## 📌 小結

| 指令 | 用途 |
|------|------|
| `git push -u origin main` | 第一次 push（設定 upstream） |
| `git push` | 之後的 push |
| `git pull` | 從 GitHub 拉取最新版本 |
| `git fetch` | 只抓取，不合併 |

---

← [[04-GitHub入門]] | 下一篇 → [[06-分支管理]]
