# Git 基礎筆記
## What ˊowOˋ?
### 版本控制?
版本控制是一個能夠記錄一個或一組檔案在某一段時間的變更,使得使用者以後能取回特定版本的系統。
## Why ˊ˙_˙ˋ?
### 為了什麼作版控?
為了以後能取回特定的版本,以及多人協作時大家的版本管理。
### 版本控制的方式?
#### 神奇的版控方法
上傳雲端?用另一份文件記錄別的文件的變動?
#### 中央式系統
所有版本控制的工作在一個伺服器進行,由中央權威管理存取權限「鎖上」檔案庫中的檔案,一次只讓一個開發者工作。
#### 分散式系統
開發者直接在各自的本地檔案庫工作,並容許多個開發者同時更動同一檔案,而各個檔案庫有另一個合併各個改變的功能。這個方式讓開發者能不靠網路也能繼續工作,也讓開發者有充分的版本控制能力,而不需經中央權威許可。
### 所以我們選擇使用 Git!
## When ˊ@w@ˋ?
當你所要記錄的版本變更是文字檔而不是 Binary 檔案的時候
## How ˊ˙o˙ˋ?
### 常見 Terminal 指令介紹
- `ls [-la]`:列出當前目錄下的檔案 / 資料夾(加上 `-la` 會顯示更詳細的資訊)
- `cd <path to directory>`:移動到Jㄍ `<path to directory>` 路徑的目錄
- `mkdir <directory name>`:在當前目錄下創建名為 `<directory name>` 的資料夾
### Git 基礎概念

1. working directory(工作區):
- 尚未被記錄或暫存下來的變更
- 透過 `git add <file name>` 將指定的變更暫存下來
2. staging area(暫存區):
- 暫存變更的區域
- 透過 `git commit -m "< commit message>"` 將當前暫存區內所有變更打包成一個版本,紀錄進本地儲存庫
3. local repo(本地儲存庫):
- 儲存每個版本紀錄的地方
- 透過 `git push <remote> <branch>` 將本地儲存庫推到遠端儲存庫
4. remote repo(遠端儲存庫):
- 由遠端伺服器所託管的儲存庫
### Git 紀錄的結構

- Commit:這些球球都是一個個版本紀錄
- Branch:每條線都是一條條分支
### Git 基礎常用命令
- `git config --global user.name "<GitHub Username>"`:設定全域使用者名稱 (同 GitHub 的就好)
- `git config --global user.email "<GitHub email>"`:設定全域使用者信箱 (同 GitHub 的就好)
- `git init`:在當前目錄下初始化出一個空的本地儲存庫
- `git status`:查看當前工作區與暫存區狀態
- `git log`:查看當前本地儲存庫的 commit 紀錄
- `git reflog`:查看過去 HEAD 指向過去的 commit 清單
- `git add <file name>`:將 `<file name>` 的變更放入暫存區
- `git commit -m "<message>"`:將當前暫存區中的所有變更打包成一個版本,並附加版本敘述訊息,紀錄進本地儲存庫
- `git branch <branch name>`:創建名為 `<branch name>` 的分支
- `git branch -D <branch name>`:刪除名為 `<branch name>` 的分支
- `git checkout <branch name>`:切換到名為 `<branch name>` 的分支
- `git checkout <file name>`:放棄在工作區中名為 `<file name>` 檔案的所有變更
- `git merge <target branch>`:將名為 `<target branch>` 的 分支合併到當前所在的分支
- `git push <remote> <branch>`:將本地儲存庫的狀態推到遠端儲存庫
- `git pull <remote> <branch>`:將遠端儲存庫的狀態拉到本地儲存庫
- `git reset`:將暫存區變更退回工作區
- `git reset [--mixed/--soft/--hard] <commit>`:挪動本地儲存庫 HEAD 指向的位置
- `mixed`:將指向位置相對未來紀錄的變更退回工作區
- `soft`:將指向位置相對未來紀錄的變更退回暫存區
- `hard`:將指向位置相對未來紀錄的變更消滅到連渣都不剩(不過其實還有救)
- `git revert <commit>`:將指定的 commit 做反向操作並留下一筆紀錄
- `git rebase <source branch>`:將當前所在的分支的根節點挪到名為 `<source branch>` 的分支葉節點上