---
# System prepended metadata

title: GIT 常見指令
tags: [PIXNET, 教育訓練, 工具, git]

---

# GIT 常見指令
###### tags: `工具` `git` `教育訓練` `PIXNET`

## 配置

```
git config --global  user.name "rainbow"
git config --global  user.email "rainbow@pixnet.tw"
git config -l
```

---

## repo

### 複製遠端 repo

```
git clone git@git.srv.pixnet:pixwww
```

### 確認遠端伺服器網址

```
確認目前Git遠端伺服器網址： `git remote -v`
更換Git遠端伺服器位網址： `git remote set-url`
假如不用 SSH 密鑰：用 `https`

git remote set-url origin https://git.pixnet.systems/pixnet/pixfront.git
git remote set-url origin git@git.pixnet.systems:pixnet/pixpanel2.git
```

### 知道本地分支有哪些：

```
git branch --l
```

### 查看遠端所有分支：(遠端分支會用红色表示出来)

```
git branch -a
```


### 取得遠端分支：( Git versions ≥ 1.6.6 )

```
git fetch
git checkout test
```

### 切換分支：

```
git checkout 分支名稱
```

### 刪除分支：

```
git branch -D 分支名稱
```

### 砍遠端分支：

```
git push origin :ticket[票號]
```

---

## 開發時

### 檢視所有檔案的狀態：

```
git status
```

### 程式變更：

```
git diff
```

### git 新增修改：
讓 programmer 可以一一檢視被更動的地方，
並且可以決定是否要加入這次的 commit。


**git add -p**
```
多了一行「Stage this hunk [...]?」的提示。

* y：確認將這個區塊( hunk ) stage 上去
* n：不要將此 hunk stage 上去
* q：直接離開對話
* a：將目前 hunk 所屬檔案裡面的所有 hunk 都 stage 上去
* d：a 的相反功能
* /<regex>：搜尋符合給定的 regular expression ( regex ) 的 hunk
* s：將這個  hunk 分割成更小的 hunk
* e：手動更改目前的 hunk
* ?：help
```


### 捨棄本地檔案變更：

```
git checkout -- 檔名
```

### 當暫時不要 commit 檔案時：

```
git stash：
git stash save -u <message> 指令，就可自訂暫存版的註解
git stash list
git stash pop
git stash clear
```

### Commit 指令：

```
git 查看某個 commit 的改動
git show COMMIT

git commit
git commit -m “訊息”

git Commit 還原
git reset HEAD^ --hard / --soft
```

### 當 git Commit 還原到本地，會 stage 起來，所以要 unstage：
git reset HEAD 檔案路徑/檔案



---

## 開發完

### git Push：

```
git push 
git push origin 分支名稱
```

### 合併：

```
git merge 回 master：
git merge --no-ff
```

### 下 Tag： 

```
刪除本地標籤：
git tag -d 標籤名

刪除遠端
git push origin :標籤名

新增本地標籤：
git tag -a 標籤名

新增遠端
git push origin 標籤名
```

### 檢視最後一次提交的修改的內容：

```
git show
```

### git 樹狀圖：

```
tig
```

### 檢視提交的歷史記錄
最常用的選項之一為 -p，用來顯示每個更新之間差別的內容。 另外還可以加上 -2 參數，限制為只輸出最後兩個更新。

```
git log
git log -p -2
```

### git reflog
全部 git 的操作記錄，裡面詳細記載你曾經下過的 git 指令


---

## 其他情境

### 還原

```
git reset --hard tag_ABC
git push -f
```

### 某兩個commit ID的差異檔

```
git diff old_commit new_commit
```

### 比對單一檔案 在後面加檔案路徑

```
git diff old_commit new_commit -- [file]
```

### 還沒開 local branch 就 commit 了怎麼辦？

```
(master)git commit
(master)git checkout -b fix_abc
(fix_abc)git checkout master
(master)git reset --hard HEAD~1 # 清掉最新的 commit，新增的 commit 只保留在 branch fix_abc
(master)git checkout fix_abc
(fix_abc)arc diff master
```

### cherry-pick：撿別的分支的 Commit 過來合併

#### 轉移多個提交 commitID_1 & commitID_2
```
git cherry-pick commitID_1  commitID_2
```

#### 轉移從 commitID_1 到 commitID_10 的所有提交
必須按照正確的順序放置

```
// commitID_1 到 commitID_10 的所有提交(不包含 commitID_1)
git cherry-pick commitID_1..commitID_10

// commitID_1 到 commitID_10 的所有提交(有包含 commitID_1)
git cherry-pick commitID_1^..commitID_10
```

---

## tig

將許多Git的功能，處理成更加直觀及快捷的交互操作
透過 Tig 可以很方便的讓我們直接在 cli 查看 git log, diff, blame...等

```
brew install tig
```


### 基本操作

#### 啟用 tig cli 介面

```
tig
```

#### 退出介面

```
q
```

#### 上下移動

```
可以透過 j (上) k (下)的方式來移動
```

#### stage 狀態變更
可以針對 staged changes 與 unstaged changes 直接透過快捷鍵 u 來切換
可以透過 j/k 上下移動至 staged changes，按下 u 即可變成 unstaged changes

```
u
```

#### 查看 untracted file 以及變更狀態
進入 tig 介面時，可以按下小寫 s 查看

```
Changes to be committed:
  (no files)
Changes not staged for commit:
  (no files)
Untracked files:
? test.txt
```

#### 在 tig 使用 commit
tig 主介面中，按下大寫C
進行 git commit

#### 查看至目前提交的內容
b 可以進入 blame ，查看至目前所提交的文件

#### 查看分支紀錄
m 可以查看目前分支的commit 紀錄

---

## Commit 進階


---

### 基本分類
```
refactor
fix
remove
feat
```

### git log --pretty=format 指定自訂的輸出格式

```
%s	標題
%cd	提交者日期
%cn	提交者名字
```

### 特殊應用

```
// 篩選作者＆自產格式
git log --author=rainbow --pretty=format:"[http://phabricator.srv.pixnet/rPIXSTREAMTOPIC%H %h] - %s"
```

---

## 其他問題

### SSH
```
SSH
cat ~/.ssh/ (Tab) 
cat ~/.ssh/id_rsa.pub 
複製 key
```

---

## 進階使用

- [當想要使用多組版控帳號](https://hackmd.io/5n4Y0SBTQ-CpkhROMDd_Mg)
- [讓你的 Git 一次 Push 到多個不同的遠端吧](https://yami.io/git-multiple-origin/)

---

## 可參考的資料

1. [Git Intro](https://git-scm.com/book/zh-tw/v1/ )
2. [Git達人教你搞懂GitHub基礎觀念](http://www.ithome.com.tw/news/95283 )
3. [「你知道 Git 是怎麼一回事嗎」](http://s.itho.me/modernweb/2017/day1/202-4-%E9%AB%98%E8%A6%8B%E9%BE%8D.pdf)
4. [Git 版本控制系統 ihower 的Git 教室](https://ihower.tw/git/)
5. [Source Tree 簡介](https://superbil.github.io/slide/sourcetree/ )
6. [cherry-pick 進階使用](http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html)