---
# System prepended metadata

title: 什麼是 Git ，什麼是版本控制？

---

# 什麼是 Git ，什麼是版本控制？

可以想像成，建立新資料夾（但還是有差別），備份你所有修改過的檔案，可以輕鬆找到舊版本

* 好處和用途：

一個人的版本控制：可以讓你輕易的存取和備份
團隊的版本控制：如果版本太多可以避免搞混

## Git vs Github

Git 版本控制的程式
Github 放 Git repository 的地方

## Git:幫你做版本控制的程式

1. 需要新版本：開一個資料夾
2. 不想加入版本控制：不要加入資料夾
3. 避免版本號衝出：用看似亂數的東西當作資料夾名稱
4. 知道最新版本：用一個檔案來存

## Git 指令

* ＄ git init - 初始化  -rm -r .git(刪除 git )
* ＄ git status - 查看狀況（看檔案是否有加入資料夾）
* ＄ git add - 把還沒追蹤的檔案加入版本控制，＄ git add . -把全部檔案加入追蹤 ＄git rm --cached '檔案名稱' 可以把檔案取消追蹤
* ＄ git commit - m '敘述' - 新的版本 （可以把一個 commit 想成一個資料夾）
* ＄ git log  - 歷史紀錄，＄ git log --oneline - 顯示比較短的代碼
* ＄ git checkout ＋ '版本號'- 回到之前版本 or ＋ 'branch name' or -b 'branch name' -直接切換過去
* .gitignore - 可以把不想要被加入版本控制的檔案放進去， git 就不會進行追蹤
* ＄ git diff - 可以看出新版本和舊版本差異
* ＄ git branch ＋ '名稱' - 新增 branch， -v 查看 所有 branch , -d 刪除 branch
* ＄ git merge ＋ 'branch 名稱' - 把分支合併進來

>Tips:把 add + commit = git commit -am '檔案名稱'，但是如果是新的檔案則不會加入暫存區

# 從零開始用 Git

1. ＄git init (先讓資料夾被 git 版本控制)
2. 建立 .gitignore 忽略不要的檔案可以想像成這檔案會被排除在資料夾外
3. ＄git add . 把全部檔案加入版本控制（可以把東西放進資料夾內）
4. ＄git -commit -m or -am (推薦) 新增一個新的版本（可以想像建立一個新資料夾，把東西放進去）
5. 成功放入暫存區

## 如何回到舊版（切換資料夾）

如果回到舊版本，首先： 
1. ＄ git log 查詢版本號
2. ＄ git checkout + '版本號'
4. 完成

> 如果需要切換回原版本 ＄ git checkout master - 回到現在版本


## 為什麼需要 branch （分支）

我們需要其他的 branch 做其他的事
如一條 branch 可以 bug fix，一條做新功能開發
P.S. 做任何新的作業時，要養成開一個新的 branch 的好習慣

## 如果 branch(分支)有衝突的話

需要手動去修改衝突，決定是否要留下或是刪除，修改完後 commit


# Github的基本功能

* 創建倉庫
* Push code
* Pull request
* Clone files
## 如果沒有倉庫

1. 先建立倉庫 ＄ git init
2. ＄ git add README.md (可以用別的檔案)
3. ＄ git commit -m 'first commit'
4. ＄ git remote add origin（可改名稱） ' github 倉庫網址'
5. ＄ git push -u origin master(github 上的 master) 
## 如果有倉庫

1. ＄ git romote add origin(可改名稱) ' github 倉庫網址'
2. ＄ git push -u origin master(github上的 master) 
## 如何上傳一個新的 branch?

1. 在本地創建一個新的 branch
2. Checkout 到新的 branch
3. ＄ git push origin 'branch 名稱'
## 如何從你的倉庫下載最新的檔案？

1. ＄ git pull origin master
## 如何從別人的倉庫下載檔案？

1. ＄ git clone + 'github 提供的網址'

P.S. 因為是別人的倉庫，如果本身沒有權限是無法做 push 的動作，如果需要修改，可以使用 fork 之後做修改和 push

# Git 狀況劇

## Commit 錯字如何修改
* 輸入 ＄ git commit --amend 即可修改
P.S 如果已經 push 就沒救了，所以在 push 前最好多檢查一次

## 我已經 commit 了 但是我又不想了

* ＄ git reset HEAD^ -- hard or --soft 
（回到上一個 commit 的狀態）
* ＄ git reset HEAD^ -- hard (當作完全不存在)
* ＄ git reset HEAD^ -- soft (檔案還是會在) 
P.S. 如果沒有輸入 hard or soft 預設值會是 --mixed (變成 Modifiedor Untracked ，內容一樣是新版本)

參考資料：[Git reset 的三種模式( soft mixed hard )比較](https://ithelp.ithome.com.tw/articles/10187303)

## 我不想要檔案了（如何回覆到原始狀況）

*  ＄ git checkout -- '檔案名稱'

P.S. 如果 -- '.' ，把所有改過卻還沒 commit 的檔案 回到原始狀況

## 修改 branch 名稱

* ＄ git branch -m '新的 branch 名稱'

## 把遠端 branch 抓下來

* ＄ git checkout ('遠端 branch 名稱')

P.S 有些舊版本也許不行

## 什麼是 Hook?

* 發生事情的時後的通知





