---
# System prepended metadata

title: Git 學習筆記
tags: [Git]

---

# Git 學習筆記

###### tags: `Git`
[TOC]

位於索引中的檔案 : Tracked files(追蹤的檔案)
不再索引內的檔案 : Untracked files(未被追蹤的檔案)

> - working tree 是工作目錄
> - 只要 **被索引中的檔案內容** 跟 **工作目錄中的檔案內容**<span style="color:red;">**一致**</span>
>   就會被稱為一個 "_Stage_"狀態
> - 只要 **被索引中的檔案內容** 跟 **工作目錄中的檔案內容**<span style="color:red;">**不一致**</span>
>   就會被稱為一個 "_Unstage_"狀態
>   <br>

![](https://i.imgur.com/xFkkXIE.jpg)

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)
