Git - 記錄一次由于少輸入了一個參數導致的更改丟失
前言
某晚我激情開發了幾個小時,中途沒有進行commit存檔。準備睡覺時,我想創建一個新的分支并將今晚所有更改提交到新分支上(似乎應該開發時候就創建?)。
然后因為少輸入了一個參數,導致被跟蹤過的文件的更改全部消失了。
成因
我想創建并切換到api
分支:
git checkout -b api
結果一困少輸了個-b
,變成了:
git checkout api
結果我那晚開發的所有內容恰好都在api
這個文件夾下,于是所有的更改都沒了。
分析
在執行git checkout
命令時,可以將整個倉庫還原到一個分支/commit_hash/tag
,可以用于恢復一個文件(夾)。
當切換到分支/commit_hash/tag
時,正確的命令是git checkout 分支/commit_hash/tag
。
- 例如我有一個分支名為
dev
,那么我可以使用git checkout dev
命令切換到dev
分支; - 例如我有一個commit的hash為
9259d713a40e97f97af61a422631b723f5666aa5
,那么我可以使用git checkout 9259d713
命令切換到這次commit; - 例如我有一個tag名為
v0.1
,那么我可以使用git checkout v0.1
命令切換到這個tag; - 例如我想創建并切換到
dev
分支,那么我可以使用git checkout -b dev
命令。
若重名,則優先級分支 > 標簽 > commit_hash
。
當恢復一個文件(夾)時,正確的命令是git checkout -- 文件(夾)名
。
- 例如我有一個文件夾是
Solution
,那么我可以通過命令git checkout -- Solution
將文件夾Solution
恢復到暫存區或版本庫。
但是,如果我沒有加--
,git checkout
命令仍然會恢復這個文件夾!
誤操
我本來想創建并切換到一個分支api
:
git checkout -b api
結果因為困倦忘記輸入-b
了:
git checkout api
結果此時我還沒有api
分支,但正好有api
文件夾。
git
一看,心想,你這命令不規范,想還原一個文件夾但是沒有--
啊,你應該輸成git chcekout -- api
,太菜了吧,--
都不知道輸。還好我git
比較聰明,知道你的意思,雖然你沒有加--
,但我還是幫你把文件夾api
給還原了吧。
然后我一個晚上的更改就幾乎全被還原了。。。沒被還原的,只剩下一些未被跟蹤過的文件(新創建的文件)。然后我就在VsCode的時間線
里把文件一個一個恢復了一下。。。
竟然,,一丁點提示都沒有。
亡羊補牢
早就有人吐槽創建并切換到新分支也是checkout命令,因此從git 2.23開始引入了switch
命令。
以后再切換分支時,就使用git switch 分支名
;創建并切換到新分支時,就使用git switch -c 分支名
好了。
End
另:我的git版本為2.42.0.windows.2
。
原創不易,轉載經作者同意后請附上原文鏈接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/144929924