這篇文章將介紹git restore
和git switch
兩個命令。
想要了解爲什麼新增了git restore
和git switch
命令,需先介紹下git checkout
命令。
如果你對git還不瞭解,可以查看我的另一篇文章:教你係統學習Git
1. git checkout
1.1 切換分支
git checkout
的功能根據上下文決定,這一點經常讓新手感到疑惑。
git checkout
經常用來切換本地分支,即切換HEAD指向的分支。例如,從main
分支切換到develop
分支。
git checkout develop
也可以讓HEAD
指針指向指定的提交,而非一個分支。此時,會進入分離分支狀態(detached HEAD state)。
git checkout 175b4f9d037d022b81dde5bdce3b2d536b1f8dcc
1.2 恢復文件
當爲git checkout
參數添加文件時,事情開始變得奇怪起來。它會捨棄本地修改,使用分支狀態替換。例如,切換到dev
分支後對test.txt
文件做了一些修改,你可以使用當前分支最後提交中test.txt
文件替換當前文件,即恢復到指定提交中的狀態。
git checkout -- test.txt
查看git checkout文檔,會發現該命令還有一個常被忽略的參數:
git checkout <tree-ish> -- <pathspec>
<tree-ish>
代表很多不同的東西,但最常見的是代表提交哈希和分支名。默認爲當前分支,但也可以是任意分支、任意提交。
因此,當前在dev
分支,想要將test.txt
文件改變爲main
分支的版本,可以使用以下命令:
git checkout main -- test.txt
總結來看,給git checkout
命令傳遞分支、提交作爲參數,它會把所有文件修改到指定版本狀態;如果指定了文件名稱,它只會修改指定文件到指定版本。
2. git switch
雖然上面部分已經介紹了git checkout
的使用細節,但確實很容易讓新手產生疑惑。git 2.23版本引入了兩個新的命令:git switch
和git restore
,每個命令只做git checkout
的一部分工作。git checkout
仍然可以使用,但這兩個命令對新手更友好。
git switch
用來切換分支或提交。
git switch dev
使用git checkout
時,可以傳入提交,切換到 detached HEAD 狀態。git switch
默認不支持此操作,需提供-d
標記:
git switch -d 175b4f9d037d022b81dde5bdce3b2d536b1f8dcc
另一點不同是,使用git checkout
把創建、切換合併到一個命令時,使用-b
標記:
git checkout -b new_branch
使用git switch
創建並切換到新分支,使用-c
標記:
git switch -c new_branch
3. git restore
git checkout
傳遞文件切換文件狀態部分功能由git restore
實現。使用git restore
命令可以把文件恢復到指定狀態:
git restore -- test.txt
如果指定了 path,但 restore source 中不存在,則會移除文件以達到和指定版本一致的狀態。
參考資料:
- New in Git: switch and restore
- git-switch - Switch branches
- git-restore - Restore working tree files