1. 程式人生 > 實用技巧 >Git 常見問題與異常處理清單!

Git 常見問題與異常處理清單!

一、基本概念

使用 Git 首先要弄清楚一些概念,從網上找了一張圖:

Git 簡化版操作過程模型

最常用的就是圖中的 6 個命令,但在使用之前首先要弄清楚幾個名詞概念:

  • Remote:遠端倉庫;
  • Repository:本地倉庫;
  • Index/Stage:Git 追蹤樹,暫存區;
  • workspace:本地工作區(即你編輯器的程式碼)

二、git commit 修改提交資訊

1. 已 commit 未 push

已經執行 commit,要想更改 commit 資訊(修改最近一次提交)。

bash
git commit --amend

執行上述命令後,進入註釋頁面進行修改,修改後儲存退出。

然後使用git log --pretty=oneline檢視內容,可以發現已經成功修改了。

需要注意的是此項命令會修改提交時的 commit_id,即會覆蓋原本的提交,需要謹慎操作。

2. 已 commit 已 push

已經執行 commit,且已經 push 的提交(修改最近一次提交)。

bash
git commit --amend

執行上述命令後,進入註釋頁面進行修改,修改後儲存退出。

然後執行強制推送命令:

bash
git push --force-with-lease origin master

三、git commit 漏提交檔案

commit 時,遺漏提交部分更新,有兩種解決方案:

方案一:再次 commit

bash
git commit -m "提交訊息"

此時,git 上會出現兩次 commit。

方案二:遺漏檔案提交到之前 commit 上

bash
git add <missed-file> # missed-file 為遺漏提交檔案
git commit --amend --no-edit

--no-edit表示提交訊息不會更改,該操作會修改上一次提交的內容,但不會要求你編輯提交資訊,仍保持上一次 commit 的 message。

四、git commit 提交錯誤檔案

提交錯誤檔案,需要回退到上一個 commit 版本,再重新 commit。

方案一:git reset

直接刪除指定的 commit。

bash
# 修改版本庫,保留暫存區,保留工作區
# 將版本庫軟回退 1 個版本,軟回退表示將本地版本庫的頭指標全部重置到指定版本,且將這次提交之後的所有變更都移動到暫存區。
git reset --soft HEAD~1

# 修改版本庫,修改暫存區,修改工作區
# 將版本庫回退 1 個版本,不僅僅是將本地版本庫的頭指標全部重置到指定版本,也會重置暫存區,並且會將工作區程式碼也回退到這個版本
git reset --hard HEAD~1
# Git 版本回退,回退到特定的 commit_id 版本,可以通過 git log 檢視提交歷史,以便確定要回退到哪個版本(commit 之後的即為ID);
git reset --hard <commit_id> 

# 如果需要撤銷已經 push 到遠端的 commit,使遠端的倉庫也回退到相應的版本,需要在 push 時加上引數 --force:
git push origin <分支名> --force

方案二:git revert

撤銷某次操作,此次操作之前和之後的 commit 和 history 都會保留,並且把這次撤銷作為一次最新的提交。

bash
# 撤銷前一次 commit
git revert HEAD

#  撤銷前前一次 commit
git revert HEAD^

# 撤銷指定的版本,撤銷也會作為一次提交進行儲存
git revert <commit_id>

git revert是提交一個新的版本,將需要 revert 的版本的內容作為一次新的 commit 再反向修改回去,版本會遞增,不影響之前提交的內容。

區別:git revert 和 git reset

相對之下,git revert更加優雅,以前的一篇部落格對比過兩個命令。

  • git revert是用一次新的 commit 來回滾之前的 commit,git reset是直接刪除指定的 commit。
  • 在回滾這一操作上看,效果差不多。但是在日後繼續 merge 以前的老版本時有區別。因為git revert是用一次逆向的 commit「中和」之前的提交,因此日後合併老的 branch 時,導致這部分改變不會再次出現,但是git reset是直接把某些 commit 在某個 branch 上刪除,因而和老的 branch 再次 merge 時,這些被回滾的 commit 應該還會被引入。
  • git reset是把 HEAD 向後移動了一下,而git revert是 HEAD 繼續前進,只是新的 commit 的內容和要 revert 的內容正好相反,能夠抵消要被 revert 的內容。

來源:百度雲盤資源