Reindeer Note Keep learning, growing & enjoying!

Git Basics & Common Commands

Basics

Git為分散型版控工具,不需要伺服器端就可以運作。

只記錄版本間不一樣的地方,例如:index.html兩次修改後的增加BBB、增加CCC。

diff

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

gitstep

安裝Git

紀錄程式學習歷程,使用工具為MacBook Pro。

打開terminal,輸入下列指令安裝Homebrew:

/bin/bash -c "$(curl -fsSL 
https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Brew

輸入下列指令,使用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

查詢當下所在的目錄內容,可使用下列三種方式:

  1. ls:顯示當下的目錄及檔案
  2. ls -a:顯示當下的目錄的所有目錄及檔案,包括隐藏的.和..等
  3. ls -al:顯示當下的目錄的所有目錄及檔案,包括隐藏的.和..等,並顯示詳細訊息,包括大小、屬性,建立時間
ls  # hello.rb

ls -a # .		..		.git		hello.rb

ls -al
# drwxr-xr-x   4 username  staff  4 Mar 12:40 .
# [email protected]  8 username  staff  4 Mar 12:36 ..
# drwxr-xr-x  10 username  staff  4 Mar 14:02 .git
# [email protected]  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>"
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分支