This page looks best with JavaScript enabled

git 常用指令整理

 · 

onmyzsh alias

cat ~/.oh-my-zsh/plugins/git/git.plugin.zsh


git version 版本

git config 檢查 git 目前設定

git config -l
cat .git/config 是專案的設定
cat ~/.gitconfig 是本機使用者設定


git remote -v 顯示遠端名稱及位置

alias grv=‘git remote -v’

add 新增遠端名稱及位置

git remote add ${name} ${url}
git remote add origin https://github.com/user/repo.git

set-url 修改遠端的網址

git remote set-url ${name} ${newurl}
例如將剛剛 add 的 https 改為 ssh
git remote set-url origin git@github.com:user/repo.git

rename 修改遠端的名稱

git remote rename ${old} ${new}

remove 移除遠端

git remote remove ${name}

update 從多個遠端下載更新

git remote updategit fetch --all


git clone 複製資料

git clone ${repository_url}

複製到指定目錄

git clone ${repository_url} ${directory}

--recurse-submodules 把 submodules 一起複製

git clone --recurse-submodules ${repository_url}
alias gcl=‘git clone –recurse-submodules’

--depth 只複製最新的幾次 commit

git clone --depth 10 ${repository_url}
因為資料量比較小, 做 cicd 的時候可以節省空間


git pull 抓取 & 整合

git pull 等同 git fetch + git merge FETCH_HEAD

  • 抓取預設遠端的目前版本並 整合
    • 預設方式是 merge, 就是根據本地及遠端產生新版本
    • 另一個方式是 rebase, 就是把本地的 commit 接在遠端現在下載到的最新 commit 之後

--rebase

git pull --rebase -v
alias gupv=‘git pull –rebase -v’

-v 囉唆模式

--autostash

自動 stash, 整合之後自動 stash pop, 預設建議只用在 rebase 的整合方式, 但可以從 config 改
git pull --rebase --autostash -v
alias gupav=‘git pull –rebase –autostash -v’


git push …


git fetch …

--depth

--dry-run 試跑


git init …

-q 安靜模式

--bare


git add …

加入追蹤

-A 全部加入無論是否追蹤

-n 測試執行 (dry run)

-u 加入所有追蹤的檔案


git rm …

移除追蹤

-r recursive

--cached 只從 index 移除


git diff …


git log …

--graph

--pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'

--oneline

git status …

-s 簡短模式


git branch …

-l ’m*' 列出符合

-d 刪除

-D (-df)

-f 強迫

-m 改名 (move)

-M (-mf)

-a 包含遠端全部列出


git commit …

-v 囉唆

-q 安靜

--dry-run 試跑

--amend 修改前一次的訊息 (因為會 reset 前一次的 commit)

-a 全部

-m 訊息


git merge …

git merge origin/$(git_main_branch)


git rebase …


git reset …


git switch …


git tag …


常用功能

error: cannot lock ref

git pull 時出現以下錯誤

error: cannot lock ref 'refs/remotes/origin/XXX': is at 07be2a0b18333b278a39ff24f7e247817e727b33 but expected 0371e1fceca317278bc572441a86de63f6dffdae
From github.com:YYY/ZZZ
 ! 0371e1f..0840175  WWW   -> origin/XXX  (unable to update local ref)

解決方式:git update-ref -d refs/remotes/origin/XXX

conflict 建議處理方式

假設 branch A B 有 conflict, 現在要用 B 提交

情況一: 直接使用 B 的版本

git switch B && git merge A # 把 A 合併到 B
git checkout --ours ${file} # 使用 B 的檔案

情況二: 使用 A 的版本

git switch B && git merge A # 把 A 合併到 B
git checkout --theirs ${file} # 使用 A 的檔案

情況三: 我全都要

git switch B
# 改成想要的樣子後重新提交
git add ${file}
git commit -m "fix: conflict"