
前兩篇(基本操作、歷史與分支)都在自己的電腦上。這篇是最後一段:跟遠端倉庫同步、把手邊的修改先收起來,以及幾個平常少用、出事時很需要的指令。
用法一樣:點指令按鈕看動畫,按「重播」再看一次。終端機輸出照 Git 2.43 的實際格式整理。
遠端:push、fetch、pull
這組有兩個面板,上面是你的電腦,下面是遠端伺服器。push 時提交從上往下送,fetch 時從下往上拿。
這裡有個常見的誤解。git diff origin/master..master 常被說成「遠端有、本地沒有的」,但 diff 的兩個點只是直接比兩端的檔案。遠端新增的檔案在結果裡反而像被刪掉,因為本地沒有它。想知道的通常是這三件事之一:
- 本地自己改了什麼:
git diff origin/master...master(三個點,從分岔點開始比)。 - 本地多了哪些提交:
git log origin/master..master。 - 遠端多了哪些提交:
git log master..origin/master。
git push origin :分支名 這種冒號寫法,現在多半寫成 git push origin --delete 分支名,比較好讀。git pull 是 fetch 再合併。兩邊都有新提交時,新版 Git 會先停下來,要你用 --rebase 或 --no-rebase 指定怎麼合(或設定 pull.rebase)。不想讓它直接合進來的話,先 fetch,看過再合。
暫存手邊的修改
改到一半,臨時要切去修 bug,又不想提交半成品,就用 git stash 先收起來。
常有人說 stash@{0} 是「第一次暫存」,剛好相反,stash@{0} 是最新的一筆,越舊編號越大。apply 套用後 stash 還留在清單裡;想套用完順便刪掉,用 git stash pop。
查詢、救援與維護
最後一組比較雜:底層查詢、找回歷史、搜尋和倉庫維護。平常不太會打,但 reflog 值得記住。reset --hard 跳到錯的提交、rebase 弄丟提交,或 branch -D 刪錯分支,第一步都是 git reflog。但它只記得提交過的東西,還沒提交的修改不在 reflog 裡。
幾個重點:
HEAD@{5}是 HEAD 五步之前的位置,跟HEAD~5(往回 5 代祖先)不是同一件事。v2.0是附註標籤時,git rev-parse v2.0拿到的是標籤物件的 hash,要提交的 hash 得寫v2.0^{commit}。- reflog 只存在你的電腦,不會被 push。預設保留 90 天,已經沒有分支指到的項目是 30 天。
git gc不會刪掉 reflog 還指得到的提交,沒人指到的物件預設也要過兩週才清。
這篇的指令速查
git remote add、git push、git push origin :<分支>、git push --tags:設定遠端和推送git fetch、git fetch --prune、git pull:下載、清理、下載並合併git diff A..B、A...B、--stat:比較兩個分支git stash、list、show -p、apply:暫存手邊的修改git ls-files、git ls-tree、git rev-parse:底層查詢git reflog、HEAD@{n}、master@{yesterday}:找回走過的位置git log --graph、git show-branch:看分支關係git grep:搜尋追蹤中的檔案git gc、git fsck:維護和檢查
系列前兩篇:

留言