git reset
:重置分支的歷史與工作區?
核心作用??:移動當前分支的指針(即改變分支的歷史),并可選地修改暫存區(Index)和工作目錄(Working Directory)。常用于撤銷提交或合并操作。
三種模式??
-
???
--soft
?模式?
行為??:僅移動分支指針(HEAD),不修改暫存區和工作目錄。
??使用場景??:撤銷提交但保留修改,允許重新提交。git reset --soft HEAD~1 # 撤銷最后一次提交,修改保留在暫存區
- ???
--mixed
?模式(默認)
行為??:移動分支指針,并重置暫存區,但保留工作目錄的修改。
使用場景??:撤銷提交和暫存操作,需重新?add
?后再提交git reset HEAD~1 # 等效于 git reset --mixed HEAD~1
- ???
--hard
?模式
行為??:移動分支指針,并強制重置暫存區和工作目錄到指定提交的狀態。
使用場景??:徹底丟棄最近的提交和所有修改(慎用!)。git reset --hard HEAD~1 # 丟棄最后一次提交及所有修改
關鍵特點??
影響分支歷史??:reset
?會改變分支的指針,從而修改提交歷史。
??適用場景??:撤銷本地提交、合并沖突后重置等操作。
git checkout
:切換分支或檢出內容?
核心作用??:切換分支,或檢出指定提交/文件到工作目錄。??不修改分支歷史??,主要用于切換上下文或恢復文件。
切換分支?
git checkout <branch-name> # 切換到另一個分支
- 行為??:
- 移動 HEAD 到目標分支,更新工作目錄和暫存區為該分支的最新狀態。
- 如果工作目錄有未提交的修改,Git 會阻止切換(除非使用?
-f
?強制切換或修改被忽略)。
分離頭指針(Detached HEAD)???
git checkout <commit-hash> # 檢出一個提交,進入分離頭狀態
- 行為??:
- HEAD 直接指向提交而非分支,此時的新提交不會屬于任何分支(需手動創建分支保存)。
- 適用于臨時調試或實驗性修改。
檢出文件
git checkout HEAD -- file.txt # 從 HEAD 恢復文件到工作目錄和暫存區
git checkout <branch> -- file.txt # 從其他分支恢復文件
- 行為??:
- 將指定文件恢復到目標版本(覆蓋工作目錄和暫存區),不影響 HEAD 位置。
- 常用于撤銷對單個文件的修改。
關鍵特點??
- ??不修改分支歷史??:
checkout
?僅切換上下文或恢復文件,不會改變分支的提交記錄。 - ??適用場景??:切換分支、臨時查看舊版本代碼、撤銷文件修改。
reset
?與?checkout
?的核心區別??
功能?? | git reset | git checkout |
---|---|---|
??操作對象?? | 當前分支(修改分支指針) | 分支、提交或文件(不修改分支歷史) |
??影響范圍?? | 分支歷史、暫存區、工作目錄 | 工作目錄、暫存區(僅文件操作時) |
??是否改變提交歷史?? | 是 | 否(除非在分離頭模式下提交) |
??典型場景?? | 撤銷本地提交 | 切換分支、恢復文件 |
總結??
- ??用?
reset
?當你想撤銷提交或修改分支歷史??(如回退到舊版本)。 - ??用?
checkout
?當你想切換分支、查看舊版本代碼,或恢復單個文件??。
??慎用?git reset --hard
??:它會永久丟棄未提交的修改!
場景:需要將工作目錄的修改與上一個提交??完全合并為一個新提交??,并可能修改提交信息,怎么做呢?
以下是分步解決方案,可根據你的需求選擇兩種方法:
git reset --soft
?和?git commit --amend
???都是對本地提交歷史的修改??。如果這些提交已經推送到遠程倉庫(如 GitHub、GitLab),直接修改本地歷史后,再推送會遇到問題。如果提交已推送到遠程倉庫需要告知團隊成員
??方法一:使用?git reset --soft
適用場景??:需要將工作目錄的修改與上一個提交??完全合并為一個新提交??,并可能修改提交信息。
步驟??:
- ??撤銷最近一次提交,但保留修改在暫存區??
git reset --soft HEAD~1
此時,之前的提交內容和工作目錄的新修改都會保留在暫存區(git status
?會顯示所有修改已暫存)。
- 查看狀態確認修改已合并?
git status # 確認所有修改已加入暫存區
- ??提交合并后的內容?
git commit -m "合并工作區修改與上一個提交"
方法二:使用?git commit --amend
?
適用場景??:僅需將工作目錄的修改??追加到上一個提交??,且不修改提交信息(或微調)。
步驟??:
- ??將工作目錄的修改加入暫存區??:
git add . # 或指定文件 git add file1.txt
- ??將修改合并到上一個提交??:
git commit --amend --no-edit # 保留原提交信息
??如果想修改提交信息,去掉?--no-edit
git commit --amend -m "新的提交信息"
??方法?? | git reset --soft | git commit --amend |
---|---|---|
??是否修改提交歷史?? | 是(生成新提交) | 是(覆蓋原提交) |
??是否保留原提交信息?? | 需手動輸入新提交信息 | 可保留或修改原提交信息 |
??適用場景?? | 完全重寫提交內容與信息 | 快速追加修改到原提交 |