# Git & Github ###### tags: `Lidemy` `note` `git` `github` `GIT101` [TOC] ---- ## git ### git 簡介 **git 就是幫你做版本控制的程式** 所謂的版本控制: > 報告.doc 報告_2.doc 報告_final.doc ... 或是多人專案要加新功能,同時又要先修上線版的 bug 的時候 * 一份報告有多種不同的版本,但我們希望把所有版本都保存下來。 * 有時候會需要優先使用穩定的版本,又同時需要開發新版本的時候。 [windows 安裝](https://git-scm.com/) [mac 安裝](https://git-scm.com/download/mac) ### git 基本指令 | 指令 | 用途 | | -- | -- | | `git init` | git 專案初始化 | | `git status` | 檢視目前狀態 | | `git add` | 決定檔案是否加入版本控制 | | `git -rm cached` | 將加入版本控制的檔案移除 | | `git commit` | 新建一個版本 | | `git commit -am` | 合併 `add` 跟 `commit` 兩個指令 | | `git log` | 歷史紀錄 | | `git checkout` | 回到某個指定版本 | ### .gitignore 在 git 專案中新建一個 .gitignore 檔案。 將不想加入版本控制的檔案名稱加入 `.gitignore` 檔案中,即忽略該檔案。 **.gitignore 檔案本身要加進版本控制內。** ### branch(分支) 為什麼需要 branch: * 一條線開發模式無法同步開發,開發新功能與 bug 修復會有衝突 * 可多人協做開發不同功能,完成後再合併 ### branch 相關指令 | 指令 | 用途 | | -- | -- | | `git branch -v` | 檢視現有分支 | | `git branch branch-name` | 開新分支 | | `git branch -d` | 刪除分支 | | `git checkout branch-name` | 切換到指定分支 | | `git merge branch-name` | 將指定分支合併到現在所在分支 | 當有 branch 合併發生衝突時,可手動解決衝突。 `<<<<< HEAD` 為現在所在分支的檔案內容 `>>>>> conflict branch` 為衝突分支的檔案內容 手動解決後再 commit 一次,即可合併衝突。 ## github ### github 簡介 Git 是版本控制的程式,Github則是放 git responsitory 的地方。 * 多人協作、共享一份專案(responsitory) * 放共同 .git 資料夾的地方 * 視覺化的 git ### 新增 github 專案 Github 右上加號新增專案 ![](https://i.imgur.com/gawLT2v.png) 用 command line 新增本地專案 ``` echo "# test" >> README.md git init git add README.md git commit -m "first commit" git remote add origin https://github.com/YuChing0923/test.git git push -u origin master ``` 用 command line 將已存在專案 push 到 github 上 ``` git remote add origin https://github.com/YuChing0923/test.git git push -u origin master ``` ### github 相關指令 | 指令 | 用途 | | -- | -- | | `git push` | 將本地檔案同步到 github 上 | | `git pull` | 將 github 檔案同步到本地端 | | `git clone` | 將 github 上的專案複製一份下來到本地 | ### github pages 到 git responsitory setting 啟用 github pages。即可直接預覽靜態網頁。 ![](https://i.imgur.com/uP9RApm.png) ### github flow [https://guides.github.com/introduction/flow/](https://guides.github.com/introduction/flow/) 開新 branch ![](https://i.imgur.com/Nn8c30y.png) 新增 commits(修改檔案) ![](https://i.imgur.com/NUgdhpN.png) 開 Pull Request ![](https://i.imgur.com/uP6rYC8.png) 專案共同成員 code review ![](https://i.imgur.com/B8fqHkq.png) Deploy ![](https://i.imgur.com/efjBw8y.png) Merge ![](https://i.imgur.com/kzFsz28.png) ### github 狀況 * 修改 commit message ``` js git commit --amend ``` * commit 之後,後悔想刪掉 ``` js git reset HEAD^ /* HEAD^ 表示最新更新的前一個狀態,也就是上一個 commit 的狀態 (預設為`git reset HEAD^ --soft`) */ ``` ``` js git reset HEAD^ --hard /* 完全刪除上一個 commit,改過的檔案也都恢復成原狀 */ ``` ``` js git reset HEAD^ --soft /* commit 後改過的檔案還是在 */ ``` * 還沒 commit,但改的東西不想要了,想回復到還沒改的狀態 ``` js git checkout -- file-name ``` * 改 branch 名稱 ``` js git branch -m new-name ``` * 把遠端的 branch 抓下來 ``` js git checkout branch-name ``` ### git hook 程式中的 Hook 通常表示:發生某件事情的時候通知我,也就是可以去偵測某些指令。 `.git/hooks/`資料夾中,有許多不同檔案可以達成偵測各種狀況。 例如:push 前,程式碼是否符合規範等等。