* <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 ``` --- ## 新增本地/遠端數據庫  * 名詞補充 > 儲存庫(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 分支名稱 ### 合併指定分支到目前的分支 ```javascript= * git merge 分支名稱 ``` ### 用 --squash 合併你的分支(這會把所有變更放到 staging area,但不 commit) ```javascript= // 用 --squash 合併你的分支(這會把所有變更放到 staging area,但不 commit) git merge --squash 分支名稱 // 提交成一個 commit git commit -m "CXP1-2580: feat(scope): your commit message" ``` ### 刪除分支 * 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 ### 修改 core.ignorecase 設定 #### 查看目前設定 ```javascript= // 查看當前設定是 true(忽略)還是 false(不忽略)。 git config core.ignorecase ``` #### 關閉忽略大小寫 ```javascript= // 讓 Git 區分大小寫。 git config --local core.ignorecase false ``` ## 參考連結 > [單元測試: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)
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.