* <style> body{font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Microsoft JhengHei', Roboto, 'Helvetica Neue', Arial, sans-serif;} .red-color{color:#f00} .blue-color{color:#f00} </style> ###### tags: `git` # Git指令大全 > [time=Sun, Feb 2, 2020 11:48 PM] > [name=aikwdc00] > ## 基礎設定 ### 查詢版本 * git version ### 查詢設定列表 * git config --list ### 輸入姓名 * git config --global user.name "你的名字" ### 輸入email * git config --global user.email "你的email" --- ## 安裝 ### npm i --legacy-peer-deps #### 解釋: * npm i 是 npm install 的簡寫,用於安裝 package.json 中列出的所有依賴包。 * --legacy-peer-deps 選項告訴 npm 在安裝過程中忽略 peer dependencies 的衝突,這類似於 npm v6 的行為。這在某些情況下可以解決由於 peer dependencies 版本不兼容而導致的安裝錯誤。 ```javascript= npm i ``` #### 使用場景: * 當您在安裝某個套件時遇到 peer dependencies 衝突或錯誤,而您確信這些衝突不會影響項目的運行,則可以使用此選項來繞過安裝過程中的 peer dependencies 檢查。 ```javascript= npm i --legacy-peer-deps ``` --- ## 新增本地/遠端數據庫 ![](https://i.imgur.com/vxaoub7.png) * 名詞補充 > 儲存庫(repository) ### 在本地資料夾新增數據庫 * git init ### 複製遠端數據庫 * git clone "url" ### 把遠端的 HTTPS 網址註冊起來,並且將這個遠端主機命名為 origin,origin 是可以改的 * git remote add origin "url" ### 查詢遠端數據庫 * git remote ### 顯示 Git 用來讀寫遠端簡稱時所用的網址 * git remote -v ### 修改名稱 * git remote rename 原名稱 修改名稱 ### 推送至遠端數據庫 之1 * git push origin(預設遠端主機名稱) master(分支名稱) ### 推送至遠端數據庫 之2 * git push -u origin(預設遠端主機名稱) master(分支名稱) > -u 是 --set-upstream 的縮寫,一旦設定過 upstream,以後就不用每次都要打 origin master。 --- ## 增加/刪除檔案 ### 增加檔案進入索引 * git add 檔案名稱 ### 增加全部檔案進入索引 * git add . ### 查詢狀態 * git status ### 顯示歷史紀錄 * git log * git log --oneline -n * (n 是最近幾多次的提交記錄) ### 將索引提交到數據庫 * git commit -m '更新訊息' ### 用commit 查詢哪個分支 ```javascript= git show {hash} ``` --- ## 還原指令 * 還原前,至少有個commit紀錄。 > HEAD 永遠會指向「工作目錄」中所設定的「分支」當中的「最新版」。 所以當你在這個分支執行 git commit 後,這個 HEAD 符號參照也會更新成該分支最新版的那個 commit 物件。 > ORIG_HEAD 簡單來說就是 HEAD 這個 commit 物件的「前一版」,經常用來復原上一次的版本變更。 > FETCH_HEAD 使用遠端儲存庫時,可能會使用 git fetch 指令取回所有遠端儲存庫的物件。這個 FETCH_HEAD 符號參考則會記錄遠端儲存庫中每個分支的 HEAD (最新版) 的「絕對名稱」。 > MERGE_HEAD 當你執行合併工作時 (關於合併的議題會在日後的文章中會提到),「合併來源」的 commit 物件絕對名稱會被記錄在 MERGE_HEAD 這個符號參照中。 ### 將已加入索引的全部檔案取消索引 * git reset HEAD > HEAD 是什麼 ? HEAD 是一個指標,指向某一個分支,通常你可以把 HEAD 當做「目前所在分支」看待。 ### 單一檔案取消索引 * git reset HEAD 檔案名稱 ### 恢復單一檔案到最新 commit 狀態(最後一次commit紀錄) * git checkout 檔案名稱 ### 還原工作目錄與索引,會跟最後一次 commit 保持一樣 * git reset --hard ### 還原工作目錄與索引,並刪除最近一次 commit * git reset --hard HEAD^ > git reset --hard HEAD 此種模式完全不保留原始 commit 結點的任何資訊,會連同資料夾中實體檔案內容都進行重置,也就是直接將工作區、暫緩區及 git 目錄都重置成目標Reset結點的資料內容。 > [資料來源](https://github.com/zlargon/git-tutorial/blob/master/patch/reset.md) #### example > Kwokde-MacBook-Pro:test stevechung$ git log --oneline -5 // 最近5次提交記錄 ba2f0a4 (HEAD -> master, origin/master) test4 //最新提交的記錄 f3a6683 test1 // 上一個提交的記錄 4f0f054 test2 6fefa2d test1 77f9ec8 reset * git reset --hard HEAD~n > n 等於往上第幾個提交版本 回復之前指定的提交版 > 如果想回復到 f3a6683 test1 , 輸入 git reset --hard HEAD~ 如果你想回復到 4f0f054 test2 , 輸入 git reset --hard HEAD~2 如果你想回復到 6fefa2d test1 , 輸入 git reset --hard HEAD~3 如此類推。 ### 還原工作目錄與索引,並保留最近一次 commit * 使用 git revert 指令來回滾該 commit。假設你要回滾的 commit 的哈希值是 abc123,你可以這樣做: ```javascript= git revert abc123 // 這樣會創建一個新的 commit 來撤銷指定的 commit 的變更。 ``` * 如果你需要回滾多個 commit ```javascript= git revert abc123 def456 // 這樣將依次回滾這些 commit 並生成新的 commit 記錄。 ``` ### 還原到指定的commit * git reset --hard <commit id> > 除了可以還原之先前的 patch 之外,我們也可以透過 git reset --hard <commit_id> 跳至我們最後一次 commit 的 patch ### 上面語法如果刪除錯了可以再用此語法還原 * git reset --hard ORIG_HEAD ### 刪除最近一次 commit,但保留異動內容 * git reset --soft HEAD^ #### 如果你想要還原最近一次的 commit,但是保留異動的內容,你可以使用 git reset 命令。具體來說,你應該使用 git reset --soft HEAD~1。這個命令會將 HEAD 指針移動到前一個 commit,但是保留你的工作目錄和暫存區不變。 ```javascript= git reset --soft HEAD~1 // 不加上 ~1,那麼 Git 會將 HEAD 指針重設到當前的 commit,而不是前一個 commit。換句話說,這個命令實際上並不會改變任何東西,因為 HEAD 已經指向當前的 commit。 ``` ## 如果你想要撤銷最近一次的 commit,並且不保留變更的檔案(變更的檔案會回到未 staged 狀態),你可以使用以下的命令: ```javascript= git reset --mixed HEAD~1 ``` ### commit 後發現有幾個檔案忘了加入進去,想要補內容進去時 * git commit --amend * 按下insert键开始修改-esc后按下:wq离开 ### 假設你回覆之前的版本後,又想回復到最新提交的版本 1. git reflog :查看所有訊息版本 2. git reset --hard commit_id * 根據 commit id 回覆到指定版本 ## 分支 ### 顯示所有本地分支 * git branch ### 新增分支 * git branch 分支名稱 ### 新增分支第二個方法 * git checkout -b 分支名稱 ### 切換分支 * git checkout 分支名稱 ### 合併指定分支到目前的分支 * git merge 分支名稱 ### 刪除分支 * git branch -d 分支名稱 遠端數據庫操作 ### 本地分支推送遠端分支 * git push origin test:test ### 用關鍵字查詢分之 ```javascript= git branch | grep {branch_name} ``` ### [救回誤刪的分支](https://github.com/doggy8088/Learn-Git-in-30-days/blob/master/zh-tw/17.md#%E6%95%91%E5%9B%9E%E8%AA%A4%E5%88%AA%E7%9A%84%E5%88%86%E6%94%AF) ### 複製遠端數據庫 * git clone 遠端數據庫網址 > clone後,如果檔案本身有複數的分支,可以使用git checkout 分支名稱切換分支即可。 ### 查詢遠端數據庫 * git remote --- ## 將本地分支推送到遠端分支 ### 遠端數據庫名稱 遠端分支名稱 * git push ### 將遠端分支拉下來與本地分支進行合併 * git pull ### 提交測試分支到遠端 * git push origin test:tese * 提交本地test分支作为远程的test分支 ### 如果回滾(git reset --hard)後,重推 * git push origin HEAD --force * ## 標籤 ### 查詢標籤 * git tag ### 查詢詳細標籤 * git tag -n ### 刪除標籤 * git tag -d 標籤名稱 ### 新增輕量標籤 * git tag 標籤名稱 ### 新建一个tag在指定commit * git tag 標籤名稱 commit ### 新增標示標籤 * git tag -am "備註內容" 標籤名稱 * -a 可以追蹤紀錄 ### 切換標籤 * git checkout 標籤名稱 ### tag 補充 * 在 Git,「標籤(tag)」是一個指向某一個 Commit 的指標。 > [【冷知識】標籤跟分支有什麼不一樣?](https://gitbook.tw/chapters/tag/tag-vs-branch.html) > 其實標籤跟分支真正的差別,是「分支會隨著 Commit 而移動,但標籤不會」。在「對分支的誤解」章節曾介紹過,當 Git 往前推進一個 Commit 的時候,它所在的分支會跟著往前移動。但標籤一旦貼上去之後,不管 Commit 怎麼前進,標籤還是留在原來貼的那個位置上。 --- ## 暫存 ### 暫時儲存當前目錄 * git stash ### 瀏覽 stash 列表 * git stash list ### 還原暫存 * git stash pop ### 清除最新暫存 * git stash drop ### 清除全部暫存 * git stash clear ### stash 補充 * 當只用暫存後,需要透過還原才看得到 * 當還原或清除後,列表內會清空 * 暫存紀錄可以覆蓋其他的branch,在覆蓋前需要先確認分支位置。 ## 查看某個文件的歷史紀錄 ### 如果你知道圖片的文件路徑,可以使用: * 這將顯示該圖片的完整歷史記錄,即使文件曾被改名、移動,也會顯示。 ```javascript= git log --follow -- path/to/image.png // ex git log --follow -- src/images/gameIcon/maintenance/image.png // result commit abc1234 Author: Your Name <your@email.com> Date: 2022-01-15 Updated game icon commit def5678 Author: Another User <another@email.com> Date: 2021-07-10 Changed icon design ``` ### 查看文件的詳細變更 * 如果想 查看圖片的二進制變更(例如大小、格式等),可以加上 --stat: ```javascript= git log --follow --stat -- path/to/image.png // result commit abc1234 Author: Your Name <your@email.com> Date: 2022-01-15 Updated game icon src/images/gameIcon/maintenance/image.png | Bin 50023 -> 51200 bytes // 這表示圖片大小從 50023 bytes 變成 51200 bytes。 ``` ### 找出所有修改過的圖片 * 如果你不確定哪些圖片曾經被修改,可以使用: ```javascript= git log --diff-filter=A -- '*.png' '*.jpg' '*.webp' // 這將顯示 曾經被新增 的圖片,從而找到較早的圖片。 ``` * 如果要找 所有修改過的圖片,可以用: ```javascript= git log --name-only -- '*.png' '*.jpg' '*.webp' ``` ### 查看圖片在特定日期的狀態 * 如果你知道某張圖片在 2020年1月1日 左右有變更,你可以這樣查: ```javascript= git log --before="2020-01-01" -- path/to/image.png // 這樣只會顯示 2020年1月1日之前 的修改紀錄。 ``` * 如果要查詢 2020 年 1 月 1 日之後的變更: ```javascript= git log --after="2020-01-01" -- path/to/image.png ``` ### 找出某個圖片的歷史版本 ```javascript= git checkout <commit_hash> -- path/to/image.png ``` * 你可以從 方法 1 (git log) 找到 commit_hash,然後用這個指令還原舊版本的圖片。 ## 其他 ### 生成一个可供发布的压缩包 * git archive ## 參考連結 > [單元測試:Mocha、Chai 和 Sinon](https://cythilya.github.io/2017/09/17/unit-test-with-mocha-chai-and-sinon/) > [[Git][教學] 01 - Git 介紹與在Windows系統下安裝](https://progressbar.tw/posts/1) > [阮一峰的网络日志](http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html) > [猴子git](https://backlog.com/git-tutorial/tw/reference/) > [30 天精通 Git 版本控管](https://github.com/doggy8088/Learn-Git-in-30-days/blob/master/zh-tw/README.md) > [為你自己學 Git](https://gitbook.tw/) > [Git 官方繁體教學](https://git-scm.com/book/zh-tw/v2) > [git 常用命令(含删除文件)](https://www.cnblogs.com/springbarley/archive/2012/11/03/2752984.html) > [解決github項目體積過大的問題](https://juejin.cn/post/6844903848864137229) > [Git - 刪除遠端分支 (以 GitHub、GitLab 為例)](https://titangene.github.io/article/git-delete-remote-branch.html)