[TOC]
## 簡介
在這一節里,我們將會學習:
- 什么是 Git ?
- 如何為 Git 做初始化配置?
- Git 的基本使用;
- 什么是 GitHub?
- 如何添加 SSH Key 到 GitHub 上?
- 如何新建 GitHub 項目?
- 如何提交代碼到 GitHub?
## 什么是 Git?
Git 是 Linux 的創始人 Linus Torvalds 開源的一款分布式版本控制系統,以幫助開發者更好的對項目進行版本管理。每一個優秀的開發者在進行項目開發時都會第一時間給自己的項目加上 Git ,以便能更好的追蹤代碼修改,進行版本回溯等操作。在多人協作的開發過程中, Git 更是必不可少的。因此,本書中將使用 Git 來管理項目的所有代碼,讓你在閱讀本書的時候能夠體會到 Git 的強大,了解實際開發中我們對 Git 的應用。
在現代化的項目開發中,Git 基本上是標配。
## Git 的基本設置
上一節我們安裝的虛擬機 Homestead 中 已經安裝了 Git ,本教程的所有 Git 操作都會發生在 Homestead 虛擬機中,因此我們需要先對其進行設置。
首先我們對 Git 進行用戶名和郵箱進行設置,請參照下面格式,替換為你自己常用的用戶名和郵箱來完成設置:
```shell
$ git config --global user.name "Your Name"
$ git config --global user.email your@example.com
```
>[info] 解釋: --global 選項代表對 Git 進行全局設置。
這里個人信息設置的作用,是為你在代碼提交時自動署名標記,方便查看提交日志時區分作者。如:

接下來設置 Git 推送分支時相關配置:
```shell
$ git config --global push.default simple
```
此設置是 Git 命令 push 的默認模式為 simple,當我們執行 git push 沒有指定分支時,自動使用當前分支,而不是報錯。
## Git 初體驗
對于有經驗的開發者來說,在他每次新建完開發項目的時候,首先要做的第一件事就是將自己的項目納入到 Git 代碼版本管理中,完成這個操作一般需要以下這幾個步驟:
接下來我們新建一個名為 Demo 的項目來試驗。以下命令請跟著我操作。
1、對 Git 進行初始化:
```shell
$ mkdir ~/Code/Demo
$ cd ~/Code/Demo
$ touch readme.md
$ git init
```
2、將項目所有文件納入到 Git 中:
```shell
$ git add -A
```
我們可以通過在 `.gitignore` 文件中進行設置,來選擇忽略掉一些我們不想納入到 Git 版本管理中的文件(如緩存文件)。因此上面描述的『所有文件』指的是 **不在** `.gitignore` 中被忽略的文件。
3、檢查 Git 狀態:
```shell
$ git status
```

上面命令將會向你輸出存放在 Git 暫存區的文件,這意味著這些文件還未真正提交到 Git 中。
4、保留改動并提交:
```shell
$ git commit -m "Initial commit"
```
上面這行命令會將暫存區的文件都提交到 Git,`-m` 選項后面帶的參數表示本次提交的簡單描述。
5、查看歷史提交記錄:
```shell
$ git log
commit 9e3eb5194f6fe4f505b07e152bf84c78273f45a5 (HEAD -> master)
Author: zhanghong <zhanghong_bean@126.com>
Date: Tue Sep 17 02:22:13 2019 +0000
Initial commit
```
從輸出信息中可以很清晰的看到每次提交的作者、日期、描述等信息。注意看這里的 `Author` 項的內容就是我們上面設置的用戶信息。 按 `q` 可退出查看。
## Git 的強大
通過上面 Git 的基本講解,你可能還無法真正體會到 Git 的強大。在平時開發中,我們有時候可能會因為手誤或其它原因將某些重要文件刪除。如果之前有將此文件納入到 Git 中,這時便可以利用 Git 來對誤刪文件進行恢復。請看下面演示。
我們先假裝不小心刪除 readme.md 文件:
```shell
$ rm readme.md
$ ll
```
使用 `ll` 打印出文件目錄列表時,能看到 `readme.md` 文件已被成功移除。
查看 Git 狀態:
```shell
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: readme.md
no changes added to commit (use "git add" and/or "git commit -a")
```
能看到有相關提示顯示 `readme.md` 文件已被刪除,這時你可以選擇將刪除的文件進行恢復或提交。
下面我們使用 Git 進行恢復被刪除文件:
```shell
$ git checkout -f
$ ll
```
這時能看到 `readme.md` 文件已成功恢復。`git checkout -f` 的作用是將在暫存區的更改文件進行強制撤銷。
上面強大的功能僅為 Git 的冰山一角,后面教程將講解更多關于 Git 的使用。如果你想學習更多關于 Git 相關的知識,可以查閱 [《Pro Git》](https://git-scm.com/book/zh/v2) 一書進行學習。
## 什么是 GitHub ?
[GitHub](https://github.com/) 是目前全球最大的代碼托管平臺,許多非常著名的項目如 [Linux](https://github.com/torvalds/linux)、[composer](https://github.com/composer/composer)、[ThinkPHP](https://github.com/top-think/framework) 等都托管在 GitHub 上。開發者們利用 GitHub 來進行團隊協作開發,查閱或收藏別人開源項目的優秀代碼,針對某個 Bug 進行技術討論等。使用 GitHub 的好處非常多,[本書項目代碼](https://github.com/zhanghong/ThinkBBS) 也托管在 GitHub 上面。
如果要使用 GitHub,你需要完成下面這幾步操作:
### 1. 注冊 GitHub 賬號
如果你還沒有 GitHub 賬號的話,請先 [注冊](https://github.com/join?source=header-home)。

### 2. 為 GitHub 賬號設置 SSH Key
出于安全考慮,Github 服務器和我們本地的通訊要求使用 SSH Key 來驗證。在前面『環境部署』的章節中,我們已經在主機中生成過 SSH Key,并且 Homestead 在初始化時,通過 Homestaed.yaml 文件中的 `keys` 選項已經把主機中的 SSH Key 私鑰復制到虛擬機中,所以這里我們無需再次生成 SSH Key。
接下來將 SSH Key 添加到 ssh-agent 中:
```shell
$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa
```
我們再回到 主機中 打印出公鑰 id_rsa.pub 文件里的內容,并把輸出的內容復制到剪貼板里:
```shell
> cat ~/.ssh/id_rsa.pub
```

最后我們需要將公鑰添加到 GitHub 賬號,先打開 [Github SSH 令牌管理頁面](https://github.com/settings/keys) ,然后把你剛剛復制的令牌按照下圖示例添加:

### 3. 提交代碼到 Github
在配置完 GitHub 賬號之后,我們便可以開始在上面存放項目代碼了。首先 [新建一個 GitHub 倉庫](https://github.com/new),取名為 hello_demo,填上 `Description` 項目描述,`Initialize this repository with a README` 這一項無需勾選,因為 Demo 已默認幫我們創建好了 `readme.md` 文件。

創建完成之后,使用以下命令將代碼上傳到 GitHub 上(將 `your_username` 替換為你自己的 GitHub 用戶名):
```shell
$ cd ~/Code/Demo
$ git remote add origin git@github.com:your_username/hello_demo.git
$ git push -u origin master
```
至此,項目已成功托管到 GitHub 上。

后面我們如果對本地代碼進行了改動,只需運行這 3 條命令即可將代碼推送到安全可靠的 GitHub 上:
>[warning] 以下命令作為知識重溫,不需要執行。
1、保存到暫存區:
```shell
$ git add -A
```
2、輸入描述信息并提交到本地的 Git:
```shell
$ git commit -m "Say something"
```
3、將代碼推送到 GitHub:
```
$ git push
```
- 第一章 基礎信息
- 序言
- 關于作者
- PHP和ThinkPHP
- 如何正確閱讀本書
- 寫作約定
- 開發規范
- 章節體例
- 本書源碼
- 第二章 舞臺布置
- 開發環境
- 產品分解
- Git和GitHub
- 創建項目
- 數據庫視圖管理工具
- 統一代碼風格
- 目錄結構
- 配置信息
- 后臺應用搭建
- 助手函數
- 前臺布局模板
- 基礎控制器
- 小結
- 第三章 注冊登錄
- 數據遷移
- 表單提交
- 表單驗證
- 模型驗證
- 短信提供商
- 發送短信
- 手機驗證
- 注冊提醒
- 登錄與退出
- 重置密碼
- 數據填充
- 小結
- 第四章 用戶相關
- 個人中心
- 編輯個人資料
- 上傳圖片
- 上傳頭像
- 顯示頭像
- 限制頭像分辨率
- 裁剪頭像
- 顯示注冊時間
- 授權訪問
- 小結
- 第五章 帖子列表
- 話題分類
- 話題模型
- 話題列表
- 性能優化
- 分類話題列表
- 話題列表排序
- 用戶發布的話題
- 分頁器美化
- 小結
- 第六章_帖子CURD
- 創建話題
- 生成摘要
- 編輯器優化
- 上傳圖片
- 顯示話題
- 編輯話題
- 刪除話題
- 小結
- 第七章 帖子回復
- 回復模型
- 回復列表
- 發表回復
- 刪除回復
- XSS 安全漏洞
- 小結
- 第八章 角色權限和管理后臺
- 多角色用戶權限
- 用戶管理
- 話題管理
- 回復管理
- 小結
- 第九章 雜項
- 邊欄活躍用戶
- 用戶最后登錄時間
- 邊欄資源推薦
- 站點首頁
- 小結
- 第十章 總結
- 全書總結
- 附錄
- 淺談ThinkPHP6.0 路由