---
# System prepended metadata

title: Git
tags: [Git]

---

###### <p style="text-align: right"> 建立日期：2021-01-01 / 更新日期：2021-01-02</p>


# Git


###### tags: `Git`


## Git 流程
![image alt](https://w3c.hexschool.com/img/72316309_2739111376108490_535994150261096448_n1fkzgd.jpg "git init - 建立數據庫")
圖片來源：[git init - 建立數據庫 by 洧杰](https://w3c.hexschool.com/git/7ca21e02 "W3HexSchool / Git 基礎操作 / git init - 建立數據庫")


## 基本 command 指令
| 指令 | 功能 |
| --- | --- |
| cd **路徑** | 移動路徑 |
| cd .. | 回上一層 |
| ls | 展開列表<br>Windows 命令提示字元無法使用，需使用 Git Bash |
| mkdir **資料夾名稱** | 開資料夾 |
| touch **檔名.副檔名** | 新增檔案<br>Windows 命令提示字元無法使用，需使用 Git Bash |


## 基礎環境指令
| 指令 | 功能 |
| --- | --- |
| git --version | 查詢安裝版本 |
| git config --global user.email "**email**" | 全域設定 Email |
| git config --global user&#46;name "**name**" | 全域設定使用者名稱 |
| git config --list | 查詢設定列表，可以看到 user.email、user&#46;name 等資料 |


## 新增本地 / 複製遠端數據庫
| 指令 | 功能 |
| --- | --- |
| git init | 初始化，新建數據庫，Git 開始對指定的資料夾進行版本控制 |
* 本地：新增資料夾 → cd 資料夾路徑 → `git init` → 成功的話資料夾後方會出現(master)
* 遠端：`git clone 遠端數據庫網址`


## 增加 / 刪除檔案(add 索引 → commit 記錄 → push 資料)
| 指令 | 功能 |
| --- | --- |
| git add **檔名.副檔名** | 增加至索引 - 單一檔案 |
| git add . | 增加至索引 - 全部檔案 |
| git status | 查詢狀態 |
| git commit -m '**更新訊息**' | 將索引提交至本地數據庫 |
| git log | 查詢 commit 歷史記錄 |
| git push | 將本地端資料更新到遠端數據庫 |


## 還原指令
| 指令 | 功能 |
| --- | --- |
| git reset HEAD **檔名.副檔名** | 取消索引 - 單一檔案 |
| git reset HEAD | 取消索引 - 全部檔案 |
| git checkout **檔名.副檔名** | 還原至最後一次 commit 狀態 - 單一檔案 |
| git reset --hard | 還原至最後一次 commit 狀態 - 全部檔案 |
| git reset --hard HEAD^ | 刪除最近一次 commit |
| git reset --hard ORIG_HEAD | 上面語法如果刪除錯了可以再用此語法還原 |
| git reset --soft HEAD^ | 刪除最近一次 commit，但保留異動內容 |
| git commit --amend | commit 後發現有幾個檔案忘了加入進去，想要補內容進去時 |


## 分支
| 指令 | 功能 |
| --- | --- |
| git checkout **commit 編號前4碼** | 移動到指定的 commit 紀錄，commit 編號可透過 git log 查看 |
| git checkout master | 移動回 master |
| git branch | 顯示所有本地分支 |
| git bracnch **分支名稱** | 新增分支 |
| git checkout **分支名稱** | 切換分支 |
| git merge **分支名稱** | 合併指定分支到目前的分支 |
| git branch -d **分支名稱** | 刪除分支 |
* HEAD：目前所在位置的指標


## 遠端數據庫操作
| 指令 | 功能 |
| --- | --- |
| git clone **遠端數據庫網址** | 複製遠端數據庫 |
| git remote | 查詢遠端數據庫 |
| git remote rename **遠端數據庫原名稱** **修改名稱** | 修改遠端數據庫名稱 |
| git push **遠端數據庫名稱** **遠端分支名稱** | 將本地分支推送到遠端分支 |
| git pull | 將遠端分支拉下來與本地分支進行合併 |
* git pull = git fetch + git merge
  不希望 pull 下來導致自己的數據庫太亂又擔心有衝突時，可以先使用 `git fetch origin(遠端數據庫) branch1(遠端分支)`，此時你的分支會多一個 FETCH_HEAD 的分支，這個就是遠端數據庫的分支，可以等到你看過沒問題後，再合併 FETCH_HEAD 也 ok。

## 標籤
| 指令 | 功能 |
| --- | --- |
| git tag | 查詢標籤 |
| git tag -n | 查詢詳細標籤 |
| git tag -d **標籤名稱** | 刪除標籤，不會影響 commit 內容 |
| git tag **標籤名稱** | 新增輕量標籤到目前的 commit |
| git tag **標籤名稱** **commit 編號前7碼** | 新增輕量標籤到指定的 commit 紀錄，commit 編號可透過 git log 查看 |
| git tag **標籤名稱** -a -m "**備註內容**" | 新增標示標籤 |
| git tag **標籤名稱** **commit 編號前7碼** -a -m "**備註內容**" | 新增標示標籤到指定的 commit 紀錄，commit 編號可透過 git log 查看 |
| git checkout **標籤名稱** | 切換到標籤的 commit |


## 暫存
| 指令 | 功能 |
| --- | --- |
| git stash | 暫時儲存當前目錄 |
| git stash list | 瀏覽 stash 列表 |
| git stash pop | 還原暫存 |
| git stash drop | 清除最新暫存 |
| git stash clear | 清除全部暫存 |


## 不要進版本控制的資料夾與檔案
| 指令 | 功能 |
| --- | --- |
| touch .gitignore | 若資料夾內沒有 .gitignore，新增此檔案，儲存要忽略的項目 |
### 編輯 .gitignore 內容
**[gitignore 大全](https://github.com/github/gitignore "A collection of useful .gitignore templates")**
* 忽略單一檔案：檔名.副檔名
* 忽略某檔案類型：*.副檔名
* 忽略資料夾：資料夾名稱/


## merge 訊息處理
若出現以下訊息，輸入 `:wq!` 即可
```
Merge branch 'feature1'
  
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
```

## 參考資料
* [Git - Documentation](https://git-scm.com/doc "Git - Documentation")
* [掌握 Git 與 Github 程式時光機](https://www.udemy.com/course/learninggit/ "Vue 出一個電商網站")
* [為你自己學 Git](https://gitbook.tw/ "Git 教學 - Git 書 - 為你自己學 Git | 高見龍")
* [Git & GitHub 教學手冊](https://w3c.hexschool.com/git/cfdbd310 "Git & GitHub 教學手冊 - Git 環境教學 | W3HexSchool")