Git重置



在Git中,命令git reset可以用來將當前HEAD重置到指定狀態。

這有效地將工作目錄和索引重置為與之前的提交匹配,或者將當前分支指標切換到指定的提交。

它做了什麼?

1. 與反轉git add類似,此過程有效地撤銷了已安排提交的更改。

2. 重置後,我們可以使用git restore從索引更新工作樹,或者使用git restore --source=<tree-ish>同時將提交內容複製到索引和工作樹。

語法

git reset [-q] [<tree-ish>] [--] <pathspec>…
git reset [-q] [--pathspec-from-file=<file> [--pathspec-file-nul]] [<tree-ish>]

git reset [<tree-ish>] [--] <pathspec>…​ 命令將指定路徑 (<pathspec>) 的索引條目重置為與<tree-ish>處的狀態匹配,而不影響工作樹或當前分支。

git reset (--patch | -p) [<tree-ish>] [--] [<pathspec>…​]

git reset --patch-p命令允許在索引和<tree-ish>(預設為HEAD)之間互動式選擇塊。

  • 透過反轉和將某些塊應用於索引,實際上撤消了已暫存提交的某些修改。

  • 此功能允許選擇性地修改或刪除暫存區中的更改,類似於git add --patch

git reset [<mode>] [<commit>]

命令git reset [<mode>] [<commit>] 根據<mode>修改索引和工作樹,並將當前分支頭重置為<commit>。

  • 如果未指定<mode>,則預設值為--mixed

    • --soft - 將修改保留為待提交的更改,並將分支頭移動到<commit>,而不改變工作樹或索引。

    • --mixed - 將更改標記為未暫存,並將索引重置為<commit>,同時保留工作樹中的修改。

    • --hard - 刪除<commit>之後的所有修改,並將工作樹和索引重置為<commit>。

    • --merge - Git處理未合併的索引項,重置索引,並更新<commit>和HEAD之間不同的工作樹檔案。

    • --keep - 與--merge類似,但如果對<commit>和HEAD之間不同的檔案進行了本地修改,則會停止。

    • --[no-]recurse-submodules - 更新工作樹時,它會更新子模組的工作樹以匹配超級專案中記錄的提交。

  • 藉助這些引數,Git在將倉庫狀態重置到特定提交時,可以更靈活地處理對索引、工作樹和子模組的修改。

選項

git reset命令可以使用以下選項

-q 或 --quiet

  • 使用-q--quiet選項時,Git會抑制所有輸出,只顯示錯誤訊息。



--refresh / --no-refresh

  • Git的--refresh選項確保在混合重置(git reset --mixed)之後更新索引。

  • 為了確保索引反映重置操作後的修改,預設情況下啟用此功能。

  • 另一方面,混合重置後,--no-refresh會阻止此自動索引重新整理。

git reset --refresh 

--pathspec-from-file=<file>

  • Git提供了一個名為--pathspec-from-file=<file>的選項,允許我們從檔案中指定pathspec模式,而不是直接從命令列指定。

  • 如果<file>為-,則從標準輸入讀取。

  • Pathspec元素可以根據core.quotePath配置變數的指示進行引用,並在檔案中由LFCR/LF分隔。

  • 對於有效管理冗長或複雜的pathspec模式,此選項很有用。



--pathspec-file-nul

  • Git的--pathspec-file-nul選項改變了--pathspec-from-file的行為。

  • 它指定將使用NUL字元來分隔檔案中的pathspec項;所有其他字元,包括換行符和引號,都將按字面解釋。

  • 當pathspec模式包含必須完全保留在檔案中的特殊或複雜字元時,此選項很有用。
git reset --pathspec-from-file=file-list.txt --pathspec-file-nul
  • --pathspec-from-file=file-list.txt − 告訴Git從file-list.txt讀取檔案路徑。

  • --pathspec-file-nul − 指定file-list.txt中的檔案路徑由空字元(\0)而不是預設的換行符(\n)分隔。

--

  • 帶有--的Git命令指示任何後續引數都應作為檔名或路徑而不是選項處理。

git rest -- <file>

它通常被稱為分隔符選項。它不是git reset獨有的,而是一個通用的Git約定,它告訴Git將--之後的任何內容解釋為檔案路徑。

--soft

  • 它將HEAD移動到指定的提交,但保持暫存區和工作目錄不變。

  • 更改仍然已暫存(索引不變)。

  • 工作目錄中沒有顯示更改。

git reset --soft HEAD~1

--mixed

  • 它將HEAD移動到指定的提交,並取消暫存任何已暫存的更改。

  • 這是預設選項。

  • 工作目錄保持不變。

  • 暫存區重置為指定提交的狀態。

git reset --mixed HEAD~1

--hard

  • 它將HEAD移動到指定的提交,並將暫存區和工作目錄都重置為與指定的提交匹配。

  • 所有未提交的更改都將丟失。

git reset --hard <commit>

謹慎使用git reset,尤其是在使用--hard選項時,因為它可能導致更改丟失。

--keep <commit>

  • 它將索引重置為指定的提交,但保留可以乾淨地應用於工作目錄的本地更改。

  • 如果與本地更改衝突,重置將停止。

git reset --keep <commit>

--merge <commit>

  • 它重置索引,但保留工作目錄中當前HEAD和指定提交之間不同的更改。

  • 如果合併失敗,則使用此選項,將其重置回乾淨狀態。

git reset --merge HEAD~1

因此,根據您使用的選項,git reset命令可以應用於工作目錄、暫存區(索引)或提交歷史記錄。

廣告