Git Basics & Common Commands
06 May 2020Basics
Git為分散型版控工具,不需要伺服器端就可以運作。
只記錄版本間不一樣的地方,例如:index.html兩次修改後的增加BBB、增加CCC。

Git可分為三大區塊:Working Directory 工作目錄、Staging Area 暫存區域、Repository 儲存庫,Git指令在三大區塊間移動檔案。

安裝Git
紀錄程式學習歷程,使用工具為MacBook Pro。
打開terminal,輸入下列指令安裝Homebrew:
/bin/bash -c "$(curl -fsSL 
https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
輸入下列指令,使用Homebrew安裝git:brew install git
確認git安裝路徑及版本:
which git      # /usr/local/bin/git
git --version  # git version 2.25.0
- /usr/local對Finder預設隱藏,想要開啟的話,打開一個Finder,按下command+shift+G,在彈出的目錄輸入/usr/local就可以找到
 
開始使用
terminal先進入想要版控的目錄,宣告要進行版控git init
查詢當下所在的目錄內容,可使用下列三種方式:
- ls:顯示當下的目錄及檔案
 - ls -a:顯示當下的目錄的所有目錄及檔案,包括隐藏的.和..等
 - ls -al:顯示當下的目錄的所有目錄及檔案,包括隐藏的.和..等,並顯示詳細訊息,包括大小、屬性,建立時間
 
ls  # hello.rb
ls -a # .		..		.git		hello.rb
ls -al
# drwxr-xr-x   4 username  staff  4 Mar 12:40 .
# drwxr-xr-x@  8 username  staff  4 Mar 12:36 ..
# drwxr-xr-x  10 username  staff  4 Mar 14:02 .git
# -rw-r--r--@  1 username  staff  4 Mar 17:19 hello.rb
directory, d代表目錄; - 代表檔案,後面的九個字母要三個三個分別看
| 第一組 | 第二組 | 第三組 | 
|---|---|---|
| user | group | others | 
| rwx | r-x | rwx | 
| 使用者可讀可寫可執行 | 群組可讀不可寫可執行 | 其他人可讀可寫可執行 | 
- read, r 可讀
 - write, w 可寫入
 - execute, x 可執行
 - ”-“ 無法使用該功能
 
如何修改權限 chmod (change mode)
方法一:二進位
ls -al # -rw-r--r--    index.html
chmod 700 index.html
ls -al # -rwx------    index.html
方法二:直接指定user, group or others
chmod g+x index.html
ls -al # -rwx--x---   index.html
Common Commands
touch:建立檔案git add:從工作目錄移到暫存區域git commit:從暫存區域移到本地儲存庫- 對已經存在Repository的檔案,在還沒add的狀況下加-a,
git commit -a -m "<context>" 
- 對已經存在Repository的檔案,在還沒add的狀況下加-a,
 
touch index.html                # 建立index.html
git add index.html              # index.html移至暫存區
git commit -m "add index.html"  # index.html移至儲存庫,並備註add index.html
git log:檢視git紀錄- 另外加上
--oneline與--graph,可以看到不一樣的格式輸出 git log -p <path>可以檢視該路徑的紀錄
- 另外加上
 git status:查看目前狀態rm;git rm:從工作目錄刪除檔案--cached不會從工作目錄刪除檔案,僅讓檔案不受Git管控
rm index.html                      # 刪除index.html
git add index.html                 # 將此次的變化移至暫存區(刪除index.html)
git commit -m "delete index.html"  # 將此次的變化移至儲存庫
---
git rm index.html                  # 刪除index.html,並將此次的變化移至暫存區
git commit -m "delete index.html"  # 將此次的變化移至儲存庫
---
git rm index.html --cached         # 讓index.html不再受Git管控
mv;git mv:變更檔案名稱
mv index.html hello.html           # index.html更名為hello.html
---
git mv index.html hello.html       # index.html更名為hello.html,並將此次的變化移至暫存區
- 修改git紀錄
    
git commit --amend -m修改最後一次commit紀錄git reset拆掉commit,再重新commit--mixed,--soft,--hard
 
git commit --amend -m "Hello, world"  # 最後一次commit訊息改成Hello, world
git reset e19f41a      # 回復至e19f41a的狀態
git reset e19f41a^     # 回復至e19f41a前一次的狀態
git reset e19f41a^^^   # 回復至e19f41a前三次的狀態
# 假設HEAD & master目前在e19f41a,也可改寫成下列:
git reset HEAD^
git reset master^
| 符號 | 英文 | 中文 | 使用 | 意義 | 
|---|---|---|---|---|
| ~ | Tilda | 取代符號 | HEAD~; HEAD~2 | 回到前一次;回到前兩次 | 
| ^ | Caret | 插入號 | HEAD^; HEAD^^ | 同上 | 
git reset --mixed   # commit拆出的檔案會移至工作目錄
git reset --soft    # commit拆出的檔案會移至暫存區
git reset --hard    # commit拆出的檔案會丟掉
| Type | mixed (default) | soft | hard | 
|---|---|---|---|
| commit移出的檔案 | 回工作目錄 | 回暫存區 | 丟掉 | 
git checkout:切換分支或復原檔案
git checkout mouse        # 切換至mouse分支
---
git checkout index.html   # 復原index.html
---
git checkout HEAD~  # 回復至一個版本以前的檔案,覆蓋工作目錄的檔案,並更新暫存區
git checkout HEAD~2 # 回復至兩個版本以前的檔案,覆蓋工作目錄的檔案,並更新暫存區
git blame:查看檔案每一行code歷史紀錄- -L:只顯示指定行數的紀錄
 
git blame index.html          # 顯示index.html每一行紀錄
---
git blame -L 3,8 index.html   # 顯示index.html 5~8行紀錄
git reflog;git log -g:查看HEAD移動紀錄
git reflog  # 查看HEAD移動紀錄
git log -g  # 查看HEAD移動紀錄
git branch:新增分支- -m 修改分支名稱
 - -d 刪除分支
 
git branch cat             # 新增cat branch
git branch -m cat dog      # cat更名為dog
git branch cat e12k45      # 到commit'e12k45'新增cat分支
git checkout -b cat e12k45 # 到commit'e12k45'新增cat分支,HEAD移動至cat分支
---
git branch -d hello    # 刪除hello分支
git merge:合併分支
git checkout master  # 切換至master branch
git merge cat        # master合併car branch
git rebase:合併分支
# 有cat, bird兩個分支,都源自於master分支
git rebase bird   # 剪下bird分支,接上cat分支