# Git 學習筆記
###### tags: `Git`
[TOC]
位於索引中的檔案 : Tracked files(追蹤的檔案)
不再索引內的檔案 : Untracked files(未被追蹤的檔案)
> - working tree 是工作目錄
> - 只要 **被索引中的檔案內容** 跟 **工作目錄中的檔案內容**<span style="color:red;">**一致**</span>
> 就會被稱為一個 "_Stage_"狀態
> - 只要 **被索引中的檔案內容** 跟 **工作目錄中的檔案內容**<span style="color:red;">**不一致**</span>
> 就會被稱為一個 "_Unstage_"狀態
> <br>

Command: **git**
- `-m` = message
- `init` = 建立
- `add` = 加入 GIT 索引
- `rm` = 刪除
- `status` = 看目前狀態
#### git diff
_顯示差異_
- `HEAD` = 比對變更與目前最新版的變更差異
- `-cached` = 索引裡的變更與本地儲存庫最新的變更差異
- `--binary` = 比對二進位檔案差異
- `--name-only` = 比對工作目錄檔案,列出檔案名稱
- `--name-status` = 列出工作目錄及索引之間有多少檔案是被異動的
> git diff 'src-commit' 'tgt-commit' commit 與 commit 比較差異
> git diff 'commit' 與目標 commit 差異
#### git reset
_重置索引_
- `-p` = 選取索引中的那些變更有哪些內容要從索引中移除
- `HEAD` = 重置索引及分支(加 ~1 是恢復前一版本,以此類推)
- `--mixed` = 重置 HEAD 及索引(預設值)
- `--hard` = 重置 HEAD,索引及工作目錄
- `--hard ORIG_HEAD` = 回復前版本(永遠回復 reset 之前的版本)
#### git revert
_還原歷史上的版本,做相反的 commit_
- `-h` = help 列出功能
- `--abort` = 取消
- `--continue` = 繼續
- `--quit` = 停止
#### git clone
_下載遠端儲存庫_
> git clone --no-checkout 'URL' 'Filename' 會以 filename 為主並且不做 checkout
> git clone --bare 'url' 把儲存庫的本身下載下來
#### git log
_看紀錄_
- `--oneline` = 短的 log 版本
- `--oneline --graph` = log 版本+線圖可加 "-數字" 以顯示筆數
> git log --oneline --graph --all -10 全部的歷史資料取 10 筆
#### git reflog
_會記錄工作目錄底下做過的每一次的版控紀錄_
#### git checkout
_取出/取回_
- `-- 'name'` = 從索引裡面把 name 檔案的內容整個複製回工作目錄
- `--orphan` = 建立全新分支且沒有 parents
> checkout -b "Filename" 可以新增分支後切換
#### git switch
_切換分支_
#### git clean
_清除工作目錄_
- `-f` = 強制刪除
- `-d` = 刪除整個工作目錄
- `-x` = 執行清除任務,並忽略.gitignore 設定
- `-n` = 看那些檔案會被清除
#### git stash
_暫存工作目錄的變更_
- `save 'message'` = 暫存
- `pop` = 取回暫存
#### git branch
_查看分支/新增分支_
- `-d` = 刪除分支(只能刪除已經合併的分支)
- `-D` = 強制刪除分支
- `-r` = 列出所有遠端追蹤分支
- `-a` = 列出所有遠端+本地分支
> git branch --merged 列出所有已合併過的分支
> git branch --no-merged 列出所有未合併過的分支
> git branch --merged | egrep -v "(^\*|master|develop)" | xargs git branch -d 刪除所有已合併過的分支(CMD/Powershell 不可用)
#### git merge
_合併分支_
- `--ff` = 快轉合併(預設)
- `--no-ff` = 非快轉合併
- `--ff-only` = 僅有快轉合併
- `--no-commit` = 不提交的合併
- `--abort` = 放棄合併
- `--squash` = 壓縮後合併(不可以與關閉快轉機制一起使用,且不會有合併線圖出現)
> git merge --no-ff --no-commit 'branchName' 合併可以不 commit
#### git rebase 'commit_id'
_重訂基底合併_
- `-i`
- `--continue` = 繼續
- `--skip` =
- `--abort` = 取消
#### git cherry-pick
_正向挑選合併_
- `--continue` = 繼續
- `--quit` = 停止
- `--abort` = 取消
#### git push
_推送至遠端_
- `--all` = 全部分支推送
> git push -u origin master 將本地分支(master)與遠端分支(origin)建立連結
> git push origin --delete 'branchName' 刪除遠端分支(要先把本地刪除)
#### git fetch
_將遠端儲存庫的變更下載回來_
- `--prune` 將遠端已刪除的分支剪除
#### git pull
_將遠端儲存庫拉下來_
> pull = git fetch + git merge
> git pull --rebase = git fetch + git rebase
#### git remote
_遠端_
- `-v` = 列出網址
- `-h` = remote 的 help
- `set-url` = 更改網址
> git remote set-url origin 'new url' 將舊網址改成新網址
#### git commit
_建立版本_
#### git apply
_套用版本(進版)_
- `--check` = 確認檔案
- `--reverse` = 退版(簡寫-R)
<br>
<hr>
#### git config
_GIT 的設定_
> 加上 --global 可以設定
- `core.quotepath` = 改 false 可顯示中文
- `core.editor` = 查看目前編輯器
> git 只能顯示 ASCII 的字元
- git bash 以外的環境要改中文
`set LC_ALL=C.UTF-8`
> 更改環境變數 (永久儲存)
> `setx LC_ALL C.UTF-8`
> MAC/Linux
> `export LC_ALL=C.UTF-8`
### 衝突問題
顯示訊息:
1. content = 內容衝突
建議用手動合併
### 參考資料
1. [為自己學 GIT-另一種合併方式(使用 rebase)](https://tinyurl.com/yfgcs498)