操作
基礎設定
查詢版本
1 | git version |
查詢設定細項
1 | git config --list |
開啟 git 設定檔案
1 | code ~/.gitconfig |
1 | open ~/.gitconfig |
輸入姓名
1 | git config -global user.name '名字' |
輸入信箱
1 | git config -global user.email '信箱' |
自訂 git 指令名稱 ( 將git status
指令簡短改成git st
)
1 | git config --global alias.st status |
本地資料夾新增數據庫
1 | git init |
增加/刪除檔案
- Untracked => 還沒被
add
過的檔案(新增的檔案) - Tracked not staged => 已被
add
過,但之後又做過編輯、刪除..等,還沒有再次add
的檔案 - Staged wait commit => 最後一次
add
版本 (存檔的概念,若之後有問題可以直接做git checkout [該檔名]
,即可把這個存檔紀錄叫回)
實際操作思路
- 存檔
就像小時候玩 gameboy 一樣,好不容易遇到了幻獸而且收服了他,你一定不會希望突然沒電或當機,所以機靈如你一定會立馬把這個里程碑儲存起來。 - 那 Git 呢? 很簡單,今天你的程式碼到一個里程碑了,只需要將關鍵的幾個檔案add
,基本上就完成了這個紀錄的儲存,之後隨便你怎麼修改,改爛了直接git checkout [該檔名]
即可時光倒流回暫存區
的版本 - 那想進一步回到上個 commit 點?而不是暫存區的話呢?
很簡單,查詢你想回去的 commit 點的commit id
,然後git checkout [id] [該檔名]
。 - 乾淨的 commit 紀錄
- 盡量別使用
git add .
+git commit
,比如說這次我新增了一個 navbar,共修改了 index.html 和 all.scss, 但過程中也有修改 all.js 和 member.html,但是這個 commit 的名稱我預計是’add navbar’,那就不須把不相干的其他兩隻檔案也加進這個紀錄中,所以我只需git add index.html all.scss
然後git commit -m 'add navbar'
就好。
- 盡量別使用
已進入儲存庫的 commit 是很難改變的,請謹慎,也盡量避免個資、商業機密等資料被簽入儲存庫。
將所有檔案加入索引
1 | git add . |
將單一檔案加入索引
1 | git add [檔名] |
查詢索引狀態
1 | git status |
將索引提交到本地數據庫
1 | git commit -m '說明文字' |
查詢歷史 commit 紀錄
1 | git log |
檔案還原
模式名稱 | master 的位置 | 索引 | 工作目錄 |
---|---|---|---|
--soft |
回到指定點 | 不變 | 不變 |
--mixed |
回到指定點 | 綠變紅 | 不變 |
--hard |
回到指定點 | 清空 | 清空 |
註: --mixed
為預設
往前一個 commit 點 | 往前數個 commit 點 |
---|---|
HEAD^ | HEAD^^^^ |
HEAD~ | HEAD~4 |
註 1: HEAD 可以用 commit id 取代git reset de2d32
註 2: 若不加上 HEAD 或是 commit id,系統預設為 HEADgit reset
=== git reset HEAD
常用指令
1 | git reset --hard HEAD^ // HEAD、工作區、索引皆退回前一個commit點 |
上面語法刪除錯了可以用此語法還原
1 | git reset --hard ORIG_HEAD |
恢復到 commit 點 ★
1 | git checkout [檔名] // 單一檔案回到最新commit點 |
覆蓋最後一次 commit
1 | git add [檔名] // 如果要多加檔案才要執行,單純改commit說明可以只執行下一行 |
查看所有 untracked 檔案
1 | git clean -n |
刪除所有 untracked 檔案
1 | git clean -f |
移除特定檔案的工作區變更
1 | git checkout -- [目標檔案名稱] |
新增本地/遠端數據庫
複製遠端數據庫
1 | git clone [url] |
如要 clone 最近一次的 history,而且也需要其他 branch,使用如下,
1 | git clone [url] --depth 1 --no-single-branch |
如要 clone 最近一次的 history,而且不需要其他 branch,使用如下,
1 | git clone [url] --depth 1 --single-branch |
or
1 | git clone [url] --depth 1 |
查詢遠端數據庫數量及名稱
1 | git remote |
將本地數據庫與遠端數據庫做連結
1 | git remote add [遠端數據庫名稱(預設為origin)] [遠端數據庫 url] |
可新增多個遠端數據庫
- 本地的 Git 數據庫可以同時有擁有多個遠端數據庫,常見的情況為一個遠端數據庫作為測試使用,當測試過通後,再推送至正式版的遠端數據庫,請注意,遠端數據庫稱不可重複。
1 | git remote add [自定義數據庫名稱(不重複)] [遠端數據庫 url] |
將本地數據庫推送到遠端數據庫
1 | git push [遠端數據庫名稱(預設為origin)] [遠端數據庫的分支名稱(預設為master)] |
設定預設推送的遠端數據庫
- 假如擁有多個遠端數據庫,輸入此指令後,未來輸入
git push
,Git 將會自動預設推送至你所設定的遠端數據庫的 master 分支。
1 | git push -u [某個已存在的遠端數據庫名稱] master |
將遠端分支拉下來與本地分支進行合併
1 | git pull |
將遠端儲存庫的最新版下載回來,下載的內容包含完整的物件儲存庫(object storage)。
這個命令不包含「合併」分支的動作。此時你的分支會多一個 FETCH_HEAD 的分支,而這個就是遠端數據庫的分支,可以等到你看過沒問題後,再用git merge FETCH_HEAD
做合併。
1 | git fetch [遠端數據庫名稱] [遠端分支名稱] |
重新命名遠端數據庫
1 | git remote rename [修改後的名稱] |
分支
只要記住使用 branch 其實就是在說:「我想要包含這一次的 commit 以及它的所有 parent 的 commit。」
顯示分支資訊
1 | git branch \\本地 |
新增分支
1 | git branch [分支名稱] |
切換分支
1 | git checkout [分支名稱] |
合併指定分支到目前分支
1 | git merge [分支名稱] |
合併指定分支到目前分支,並且將合併後的結果產生成一個最新的 commit 紀錄。樹狀圖會呈現一個小耳朵的結構,有利於開發者清楚辨識當時曾進行 merge 的動作
1 | git merge [分支名稱] --no-ff |
刪除分支
1 | git branch -D [分支名稱] |
刪除遠端分支
加個
:
即可
1 | git push origin :[分支名稱] |
標籤
使用情境 : 重大版本里程碑紀錄
查詢標籤
1 | git tag |
刪除標籤
1 | git tag -d [標籤名稱] |
新增輕量標籤
1 | git tag [標籤名稱] |
新增標示標籤
1 | git tag -am '標註內容' [標籤名稱] |
暫存
當你手上工作還沒做完也不想 commit 時就要切換到別的 branch (PM 說有一個 issue 要在 5 分鐘內解決),手中的修改內容也會跟著移動到新 branch 讓人會很困惑,這時可以把手上工作放到暫存裡,有點像先把這些檔案 ctrl + x 剪下來 (git stash
),之後再 ctrl + v 貼回你想要的 branch (git stash pop
),另外 git stash pop 後暫存即消失
技巧: 若不切回 master 而在 branch b 進行 pop 也可以將資料帶到該 branch
暫時儲存當前目錄
1 | git stash |
查詢 stash 列表
1 | git stash list |
還原暫存
1 | git stash pop |
清除最新暫存
1 | git stash drop |
清除全部暫存
1 | sit stash clear |
注意
--global
影響整個電腦中的設定,若不輸入則只影響目前資料夾的.git 設定- commit id 可以用
git log
查詢,需要輸入時可以輸入 id 前四碼,git 即可辨認
參考
細說 git reset 和 git checkout 的不同之處
超詳細 Git 圖解
我想要精通 Git
Git 教學系列 - Youtube
git 練習網站