# GIT 常見指令 ###### tags: `工具` `git` `教育訓練` `PIXNET` ## 配置 ``` git config --global user.name "rainbow" git config --global user.email "rainbow@pixnet.tw" git config -l ``` --- ## repo ### 複製遠端 repo ``` git clone git@git.srv.pixnet:pixwww ``` ### 確認遠端伺服器網址 ``` 確認目前Git遠端伺服器網址: `git remote -v` 更換Git遠端伺服器位網址: `git remote set-url` 假如不用 SSH 密鑰:用 `https` git remote set-url origin https://git.pixnet.systems/pixnet/pixfront.git git remote set-url origin git@git.pixnet.systems:pixnet/pixpanel2.git ``` ### 知道本地分支有哪些: ``` git branch --l ``` ### 查看遠端所有分支:(遠端分支會用红色表示出来) ``` git branch -a ``` ### 取得遠端分支:( Git versions ≥ 1.6.6 ) ``` git fetch git checkout test ``` ### 切換分支: ``` git checkout 分支名稱 ``` ### 刪除分支: ``` git branch -D 分支名稱 ``` ### 砍遠端分支: ``` git push origin :ticket[票號] ``` --- ## 開發時 ### 檢視所有檔案的狀態: ``` git status ``` ### 程式變更: ``` git diff ``` ### git 新增修改: 讓 programmer 可以一一檢視被更動的地方, 並且可以決定是否要加入這次的 commit。 **git add -p** ``` 多了一行「Stage this hunk [...]?」的提示。 * y:確認將這個區塊( hunk ) stage 上去 * n:不要將此 hunk stage 上去 * q:直接離開對話 * a:將目前 hunk 所屬檔案裡面的所有 hunk 都 stage 上去 * d:a 的相反功能 * /<regex>:搜尋符合給定的 regular expression ( regex ) 的 hunk * s:將這個  hunk 分割成更小的 hunk * e:手動更改目前的 hunk * ?:help ``` ### 捨棄本地檔案變更: ``` git checkout -- 檔名 ``` ### 當暫時不要 commit 檔案時: ``` git stash: git stash save -u <message> 指令,就可自訂暫存版的註解 git stash list git stash pop git stash clear ``` ### Commit 指令: ``` git 查看某個 commit 的改動 git show COMMIT git commit git commit -m “訊息” git Commit 還原 git reset HEAD^ --hard / --soft ``` ### 當 git Commit 還原到本地,會 stage 起來,所以要 unstage: git reset HEAD 檔案路徑/檔案 --- ## 開發完 ### git Push: ``` git push git push origin 分支名稱 ``` ### 合併: ``` git merge 回 master: git merge --no-ff ``` ### 下 Tag: ``` 刪除本地標籤: git tag -d 標籤名 刪除遠端 git push origin :標籤名 新增本地標籤: git tag -a 標籤名 新增遠端 git push origin 標籤名 ``` ### 檢視最後一次提交的修改的內容: ``` git show ``` ### git 樹狀圖: ``` tig ``` ### 檢視提交的歷史記錄 最常用的選項之一為 -p,用來顯示每個更新之間差別的內容。 另外還可以加上 -2 參數,限制為只輸出最後兩個更新。 ``` git log git log -p -2 ``` ### git reflog 全部 git 的操作記錄,裡面詳細記載你曾經下過的 git 指令 --- ## 其他情境 ### 還原 ``` git reset --hard tag_ABC git push -f ``` ### 某兩個commit ID的差異檔 ``` git diff old_commit new_commit ``` ### 比對單一檔案 在後面加檔案路徑 ``` git diff old_commit new_commit -- [file] ``` ### 還沒開 local branch 就 commit 了怎麼辦? ``` (master)git commit (master)git checkout -b fix_abc (fix_abc)git checkout master (master)git reset --hard HEAD~1 # 清掉最新的 commit,新增的 commit 只保留在 branch fix_abc (master)git checkout fix_abc (fix_abc)arc diff master ``` ### cherry-pick:撿別的分支的 Commit 過來合併 #### 轉移多個提交 commitID_1 & commitID_2 ``` git cherry-pick commitID_1 commitID_2 ``` #### 轉移從 commitID_1 到 commitID_10 的所有提交 必須按照正確的順序放置 ``` // commitID_1 到 commitID_10 的所有提交(不包含 commitID_1) git cherry-pick commitID_1..commitID_10 // commitID_1 到 commitID_10 的所有提交(有包含 commitID_1) git cherry-pick commitID_1^..commitID_10 ``` --- ## tig 將許多Git的功能,處理成更加直觀及快捷的交互操作 透過 Tig 可以很方便的讓我們直接在 cli 查看 git log, diff, blame...等 ``` brew install tig ``` ### 基本操作 #### 啟用 tig cli 介面 ``` tig ``` #### 退出介面 ``` q ``` #### 上下移動 ``` 可以透過 j (上) k (下)的方式來移動 ``` #### stage 狀態變更 可以針對 staged changes 與 unstaged changes 直接透過快捷鍵 u 來切換 可以透過 j/k 上下移動至 staged changes,按下 u 即可變成 unstaged changes ``` u ``` #### 查看 untracted file 以及變更狀態 進入 tig 介面時,可以按下小寫 s 查看 ``` Changes to be committed: (no files) Changes not staged for commit: (no files) Untracked files: ? test.txt ``` #### 在 tig 使用 commit tig 主介面中,按下大寫C 進行 git commit #### 查看至目前提交的內容 b 可以進入 blame ,查看至目前所提交的文件 #### 查看分支紀錄 m 可以查看目前分支的commit 紀錄 --- ## Commit 進階 --- ### 基本分類 ``` refactor fix remove feat ``` ### git log --pretty=format 指定自訂的輸出格式 ``` %s 標題 %cd 提交者日期 %cn 提交者名字 ``` ### 特殊應用 ``` // 篩選作者&自產格式 git log --author=rainbow --pretty=format:"[http://phabricator.srv.pixnet/rPIXSTREAMTOPIC%H %h] - %s" ``` --- ## 其他問題 ### SSH ``` SSH cat ~/.ssh/ (Tab) cat ~/.ssh/id_rsa.pub 複製 key ``` --- ## 進階使用 - [當想要使用多組版控帳號](https://hackmd.io/5n4Y0SBTQ-CpkhROMDd_Mg) - [讓你的 Git 一次 Push 到多個不同的遠端吧](https://yami.io/git-multiple-origin/) --- ## 可參考的資料 1. [Git Intro](https://git-scm.com/book/zh-tw/v1/ ) 2. [Git達人教你搞懂GitHub基礎觀念](http://www.ithome.com.tw/news/95283 ) 3. [「你知道 Git 是怎麼一回事嗎」](http://s.itho.me/modernweb/2017/day1/202-4-%E9%AB%98%E8%A6%8B%E9%BE%8D.pdf) 4. [Git 版本控制系統 ihower 的Git 教室](https://ihower.tw/git/) 5. [Source Tree 簡介](https://superbil.github.io/slide/sourcetree/ ) 6. [cherry-pick 進階使用](http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html)