# git學習筆記 (ref 為你自己學git)
###### tags: `learning`
## Configuration
1. 設定使用者
```
git config --global user.name "<usr_name>"
git config --global user.email "<email>"
git config --list
```
- 特定專案設定特定使用者
```
//該專案的路徑下
git config --local user.name "<usr_name>"
git config --local user.email "<email>"
```
2. 設定alias
```
git config --global alias.<縮寫指令> "<原本指令>"
```
或是直接到`/.gitconfig`中修改
- EX1
```
git config --global alias.l "log --oneline --graph"
//之後只要輸入`git l`就可以看到精美ㄉlog圖 <3
```
- EX2
```
git config --global alias.ls 'log --graph --pretty=format:"%h <%an> %ar %s"'
// output: <hash> <<name>> <time> <msg>
```
## 開始使用git
1. 初始化目錄 : 在想要進行版本控制的目錄下執行`git init`
- 初始化之後該目錄底下會出現`.git`
- 之後若要刪除版本控制,刪除`.git`即可
2. 查詢目錄的狀態
`git status`
- Ex1

- Ex2

3. git指令

- 把welcome.html加入版本控制
1. 剛創檔的status

2. `git add <file_name>` (可用`*`表示全部, ex `git add *.html`)
確認修改此檔案,交給git處理,把檔案加到暫存區(commit之前一定要add)
- 此時的status

:::info
Note: `git add .` = `git add --all`
把該目錄&子目錄下的所有檔案都加到暫存區
:::
3. `git commit` : 把暫存區的東西加入Repository
- `git commit -m "<msg>"`
- `git commit`會無視沒有`git add`的檔案
- "**這次修改做了什麼**"
:::info
Note: 使用`git commit -a -m "<msg>"` 可以不用`git add`
但只適用於修改檔案,如果是**新增的檔案**還是需要`git add`
:::
- 修改commit msg (也視為一次新的commit)
- 修改最新Commit的msg : `--amend`
`git commit --amend -m "<new_msg>"`
- 修改舊commit的msg
- 追加檔案到最新一次的commit(不想再發一次commit)
`git commit --amend --no-edit`
> `--amend` 表修改
> `--no-edit` 表不要跳出修改msg的視窗
- 取消commit
`git reset`
1. `git reset <old_commit_hash>` : 回復到該commit
2. `git reset <old_commit_hash>^` : 回復成該commit的前一次commit
3. `git reset master^^` : master指向最新一次commit,回復成最新commit的前兩次commit
4. `git reset HEAD~5` : HEAD也指向最新一次commit,回復成前五次的commit
:::info
reset有三種模式
1. `--mixed` : 預設為此模式, 把拆出來的檔案從暫存區丟掉,但還是在工作目錄,如果需要再commit就需要`add`回去
2. `--soft` : 移動HEAD,即把拆出來的檔案丟到暫存區,直接commit即可
3. `--hard` : 直接把拆出來的東西丟掉,不會存在工作目錄中
:::
5. 如果不小心reset成舊commit,一樣可以再reset成最新的commit
`git reset <restore_commit> --hard`
> `--hard`代表強迫放棄之前reset的內容
4. 查看log
- `git log`
- SHA-1 Hash: commit的身分證字號,不會重複
- who: 誰commit
- when: 啥時commit
- what: commit msg
:::info
some attribute
1. `--oneline : hash + msg`
2. `--author='<usr_name>'` or `--author='<usr1>\|<usr2>/usr2.>.'`
3. `--grep='<str_in_msg>'` : 搜尋msg中的特定字串
4. `-S "<str_in_file>"` : 搜尋commit檔案中特定字串
5. `--since "<ex_9am>" --until "<ex_12am>" --after "<ex_2017-01>"` : 列出2017-01之後每天9am-12am的commit
:::
5. 刪除檔案 : 類似修改檔案(**只要有修改,之後一定要commit**)
- 法I: 直接刪之後,`git add`
- 法II: `git rm <file_name>`
:::info
Note: 只是想刪除該檔案的git控制,而不是真的想刪檔,用`git rm --cached`
:::
6. 改檔名
- `git mv <old_name> <new_name>`
7.