---
# System prepended metadata

title: Git 入門筆記
tags: [Git, 網頁前端, 導師實驗計畫第四期]

---

# Git 入門筆記
Git 可以幫助我們更有效的進行版本控制，便於多人協作、管理多個版本。
## 如何安裝
### Windows
至 [Git官網](https://git-scm.com/) 下載並安裝，完成後使用 Git Bash。
### MacOS
打開 terminal，輸入 `git --version`，MacOS 10.9 以上會自動引導安裝，若無則可參考 [官網說明](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) 進行操作。

## Git 常用指令
| 指令 | 功能 | 說明 |
| -------- | -------- | -------- |
| git init | 初始化 | 在資料夾內使用，會產生檔名為 `.git` 之隱藏檔案，會將需要被 git 所控制的檔名寫入檔案中 |
| git status | 狀態查詢 | 查看目前狀態<br>commit 前：<br>untracked 尚未加入版本控制<br>staged 已加入版本控制
| git add 檔名 | 加入版本控制 | |
| git add .（或資料夾名稱） | 加入版本控制 | 資料夾下所有檔案都加入版本控制 |
| `git rm --cached 檔名` | 取消加入版本控制 | |
| git commit | 新建一個版本 | 送出後會進入 vim 編輯器<br> 若 commit message 內容較長可以寫在裡面<br>內容較短則使用<br>`git commit -m "message here"`<br>(使用 `-m` 前 無論新舊檔案都要記得 `add`)
| `git commit -am "message"` | 快速新建版本 | 效果等同 `git add .` + `git commit -m`<br>`-am` 只對先前 `add` 過的檔案有效，新的檔案必須手動 `add` 後才能 `-am`
| git log | 歷史紀錄 | |
| `git log --oneline` | 單行歷史紀錄 | |
| `git checkout 版本代碼` | 切換到某個版本 | |
| git checkout master | | 切換到 master 這個 branch 的最新狀態 |

## 基本操作流程統整
### 初始化
* 對要控制的資料夾下 `git init`
`git add` 將檔案加入版本控制，用 `git status` 檢查
* 可以把資料夾中不需要進行版本控制的檔案寫入 `.gitignore` 檔（記得要把這個檔案加入版本控制資料夾裡面）
* 通常會將使用者相關檔案、作業系統產生檔案等與專案本身較無關的檔案加入
如果不自己寫入 .gitignore，就要在每次 commit 時手動忽略
### commit
* 通常會在完成一個小進度的時候才進行 commit
* 如果修改的檔案已經 add 過，在後續 commit 時就可以使用 `git commit -am "message"`
* commit 後可用 `git diff` 指令觀看這一次改了什麼地方

## Branch 分支
### 為什麼需要 branch？
在發展新功能與進行 bug fix 時，可以分頭進行（平行），做完了確定後再合併。
| 指令 | 功能 | 說明 |
| -------- | -------- | -------- |
| git branch -v | 看現在有哪些 branch | |
| git branch `branch name` | 新建 branch | |
| git branch -d `branch name` | 刪除既有 branch | |
| git checkout -b `branch name` | 新增 branch 之後直接切換過去 | |
| git merge `branch name` | 將 branch 併回 master | 合併後就可以把 branch 刪掉<br>merge 時若遇到衝突，手動解決衝突後再 commit

## Github
### 把 code 放上 Github
新增一個 repo 之後會跑出教學說明。
#### 已經有 repo 的做法
```
git remote add origin https://github位址
git push (-u) origin master
```
### push 最新狀態
```
git push origin master / branch 名稱
```
### pull 已 push 之檔案
```
git pull origin master
```
### 把別人的 repo 抓下來
```
git clone 網址 //抓到本地
```
fork 則是直接複製一份 repo 到自己的 github 上。
### 在 github 上要求 merge
點擊 Compare & pull requests

## 特殊狀況
### 更改送出的 commit message
```
git commit --amend
```
### 刪除 commit
```
git reset HEAD^
```
HEAD 表示最新的 commit，`^` 則是代表前一個
```
git reset HEAD^ --hard //全都不要了，就像根本沒發生過
git reset HEAD^ --soft(預設) //commit 不要了，但修改過的檔案狀態還是在
```
### 還沒 commit，將檔案回覆到之前的狀態
```
git checkout -- 檔案名稱
git checkout --. //所有檔案
```
### 更改 branch 的名字
```
git branch -m 新名稱
```
### 把遠端的 branch 抓下來
```
git checkout branch 名稱
```
## Hook
發生某事的時候讓程式自動通知我。
### Git hook
.git 資料夾 -> hooks 資料夾，裡面的小程式會有說明文字
最常使用到「在 commit 之前檢查」的功能
`exit 1`：不送出 commit
`exit 0`：送出 commit

## 參考資料
[Lidemy【GIT101】Git 超新手入門](https://www.lidemy.com/)

###### tags: `導師實驗計畫第四期` `網頁前端` `Git`