使用 Git 也有一段時間了,除了常用的 commit, push 等常用基本指令外,還有許多很實用的指令,在這邊做一下紀錄。
本地相關
Init
git init #初始化 Git 專案。
Add
git add <pathspec>... #將一個或多個已變更的檔案新增至「待提交」
-
-A, --all
: 全部檔案。 -
-f, --force
: 允許新增已經被忽略的檔案。
Remove
git rm #刪除檔案並加入 Staged
--cached
: 移除已進入 Staged 的檔案,保留本地檔案-f
: 移除已進入 Staged 的檔案,並移除本地檔案
這邊移除並不會真正的從 Git 移除,只會讓他在接下來不會再被加入 Staged,如果要真正移除檔案,請看我之後會寫的文章。
Commit
git commit #提交變更。
-
-m, --message <message>
: 加上 Commit Message,預設是開啟指定編輯器。 -
--amend
: 修改上一筆的提交。 -
-S
: 使用 GPG 簽署此 Commit。
Status
git status #查看目前檔案的狀態。
Log
git log #查看提交歷史紀錄。
--show-signature
: 顯示 GPG 簽署相關資訊。
Reset
git reset [<commit>] #重置狀態。
-
--soft
: 僅重置HEAD
與Index
,工作目錄檔案的變更不會被重置。 -
--hard
: 重置HEAD
、Index
與工作目錄。
Branch
git branch #查看目前分支清單
git branch <name> #建立新分支
-
-d, --delete
: 刪除已合併的分支。 -
-D
: 刪除分支,即使他未合併。 -
-m, --move
: 更名分支。 -
-M
: 更名分支,即使目標分支已存在。
Checkout
git checkout <branch> #切換分支。
git checkout [<branch>] <file> #還原工作目錄的檔案。
-
-b <branch>
: 建立新分支並切換過去。 -
-B <branch>
: 建立新分支或重置已存在的分支並切換過去。 -
<branch>
相關: ref-
-
: 代表上一個 Checkout 的分支或 Commit,例如:假設我在 develop 分支切換到 master 後git checkout -
就可以回到 develop。 -
@{-N}
: 代表前 N 個 Checkout 的分支或 Commit,而-
等同@{-1}
。
-
Cherry-Pick
git cherry-pick <commit>... #取得 Commit 到目前分支
Stash
git stash #將未提交的檔案暫時放置臨時區
git stash list #查看 Stash 放了哪些東西
git stash pop #將最上層的一筆資料返回工作目錄
Rebase
git rebase [<branch>] #將該分支接到目標分支最上層
# 範例:
#此時就會將目前所在分支的 commit 接到 master 最前面,也就是讓目前所在分支保持最新狀態
git rebase master
-i
: 可以自訂對每個 Commit 的操作及調整其順序,而操作命令及縮寫如下 (可以打第一個縮寫代替)。p, pick
= 使用這個 commit。 (default)r, reword
= 使用這個 commit,但編輯 commit 訊息。e, edit
= 使用這個 commit,但暫停 rebase 來編輯這個 commit。s, squash
= 使用這個 Commit,但與前一個 commit 合併。f, fixup
= 類似 squash,差在會捨棄這個 commit 的訊息。x, exec
= 執行後面接的的 Shelld, drop
= 移除這個 commit
--committer-date-is-author-date
: 將新 Commit 的日期設為作者的日期(rebase 會產生新的 commit,不想改日期可以加上這個)
如果使用 Vim 來編輯,
:wq
存檔離開就可以完成 rebase
Merge
git merge <commit>... #將指定 Commit 合併到目前所在分支
Show
git show <object>... #顯示詳細資訊
Submodule
git submodule #列出子模組清單
git submodule add <repository> [<path>] #新增某遠端倉庫為子模組,執行後會自動 clone
git submodule init [<path>...] #初始化子模組
git submodule sync [<path>...] #同步
Verify GPG
git verify-commit <commit> # 驗證 Commit 的 GPG 簽署。
git verify-tag <commit> # 驗證 Tag 的 GPG 簽署。
Reflog
git reflog # 它會紀錄所有執行等指令,如果 Commit 不見,短時間內都還可以用它查。
遠端倉庫相關
Remote
git remote #列出遠端倉庫清單
git remote add <name> <repository> #新增一筆遠端倉庫
git remote get-url <name> #取得某筆遠端倉庫的 URL
git remote set-url <name> <newurl> #設定某比遠端倉庫的 URL
Clone
git clone <url> #下載遠端倉庫,預設遠端倉庫名稱為 origin
Push
git push #將本地的提交推到到預設的遠端倉庫
git push <repository>
-f, --force
: 強制推送,也就是強制覆蓋遠端的 commit (例如如果已經將 commit 推上去了,但又修改它,就必須要加上這個才推得上去)。--force-with-leas
: 跟-f
同功能但比它安全,它會去檢查遠端有沒有其他人的新提交,如果有就會不能推,才不會發生蓋掉別人的紀錄的事情發生。
Pull
git pull #將預設的遠端倉庫同步下來
git pull <repository>
-r, --rebase[=<false|true|preserve|interactive>]
: 如果設為 true 時,當遠端與本地有差異,使用 rebase 而不使用 merge。
Submodule
git submodule update --init --recursive # 初次 Clone 下來的專案要先執行這個把 submodule 給 Clone 下來
git submodule update --recursive # 更新 submodule
全域設定檔
預設路徑: ~/.gitconfig
[user]
name = Puck Wang
email = s9801077@gmail.com
[pull]
#這個設定了之後,pull 時就可以不用加參數
rebase = true
[alias]
#一大堆的別名,讓打指令更快速
ff = flow feature start
fh = flow hotfix start
pl = pull
ps = push
psf = push --force-with-lease
br = branch
co = checkout
cb = checkout -b
cd = checkout develop
cm = commit
st = status
sh = stash
mr = merge
sh = show
rb = rebase
rbc = rebase --continue
a = add
aa = add *
l = log
#以下是網路上找來的 log 指定,但用蠻久了,來源不清楚
ll = log --pretty=format:'%h %ad | %s%d [%Cgreen%an%Creset]' --graph --date=short
lo = log --oneline
lg = log --graph --pretty=format:'%Cred%h%Creset %ad |%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset' --abbrev-commit --date=short
lgg = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all
[core]
#設定套用全域忽略的設定檔
excludesfile = /Users/xxxxxx/.gitignore_global
[submodule]
# 執行 git pull 時,自動遞迴處理 Submodule
recurse = true
.gitignore_global
.DS_Store
.idea
.vs
Puck Wang
Hi! 我是 Puck Wang,這個部落格的作者,是一位全端網站開發者,常使用 .Net 和 React 進行開發,專注於架構研究,你可以在這個部落格看到我精選的筆記內容,希望對你會有所幫助。
更多關於我的訊息,可至關於關於頁面。