目錄
5.版本回退
5.1選項hard&后悔藥
5.2后悔藥&commit id
5.3版本回退的原理
6.撤銷修改
6.1情況一
6.2情況二
6.3情況三
?7.刪除文件
Git重要能力之一馬,版本回退功能。Git是版本控制系統,能夠管理文件歷史版本。本篇以ReadMe文件為例。
- 版本回退 是回到某一次提交或者回退操作的時候版本 (用提交記錄的commit id即可)
- 版本撤銷 是直接定位某個文件需要撤銷的內容。
5.版本回退
版本回退命令:git reset
版本回退命令本質是:將版本庫里面的內容回退的。
git reset也存在多個選項。
git reset 命令語法格式為:
git reset [--soft | --mixed | --hard] [HEAD]? 你想要回退到的版本的commit id(提交記錄)
- Git reset 只是回退版本庫(本地倉庫)中的內容。關于工作區和暫存區的內容回退,需要git reset --選項 后面的選項來決定。
- 版本回退是回退一次 add或者commit 操作,不是一個僅僅某個文件的版本。(這次提交的所有文件的版本都不算)
- --soft:只回退版本庫中的內容
--mixed:會回退版本庫和暫存區的內容(默認選項)
--hard:會回退版本庫和暫存區和工作區的內容。(注意?hard要慎用,一旦使用hard選項,版本庫/暫存區/工作區所有的內容都回退到上一個版本。如果文件少,代碼少,可以用commit id找回來;如果文件過大,操作頻繁,很可能導致丟失一些新開放的代碼
git log --pretty=oneline?或者 git log 用來查看 每次提交的記錄
git reset 除了以上的版本回退的操作,還可以將文件回退到當前版本HEAD。
HEAD當前版本:意思就是工作區和暫存區的內容版本和版本庫中一致。(看選項)
背景?回退操作:
ReadMe文件原本只有hello linux
ReadMe文件修改之后增加了一行aaaaaaaaaa
git reset [--soft | --mixed | --hard] [HEAD]
git reset --soft //僅工作區的內容
git reset --mixed //是工作區和暫存區的內容——默認選項
git reset --hard //是工作區和暫存區和版本庫的內容——慎用
git reset HRAD //(HEAD就是表示回退到當前版本,不需要選項,因為選項是默認選項)//就是工作區和暫存區的內容一起回到版本庫內容一致
git reset HRAD^ //回退到上一個版本
git reset HRAD^^ //回退到上上個版本
//后面都要接commit id或者文件名
5.1選項hard&后悔藥
git reset --hard 7f0ea7a49fc354e7f07696609b0c9e8ec261d0b8
用戶此刻后悔了,能不能撤銷剛剛的操作。
當然可以,剛剛已經答應了最新的commit id,我們知道我們原來版本(回退之前)的commit id,所以還可以回退到原來的文件版本。因為我們可以找到commit id,且并沒有將modify的ReadMe的commit id清除掉.
5.2后悔藥&commit id
?git reflog :用來記錄每一次的提交命令。
每一次提交或者是回退操作都有各自操作對應commit id
我們照樣也可以使用一部分的commit id來回退
以上的前提是我們能找到commit id,在開發的過程中,我們會進行很多次的git操作,會把commit id沖刷掉,找不到。
5.3版本回退的原理
版本回退的速度是非常快的,版本回退的速度為什么快呢?
只需要修改的master的指向(指針)
6.撤銷修改
git checkout? -- 需要撤銷的文件名
- 將工作區的文件回到醉經一次的add或者commit時的一個狀態
- 注意:必須加上-- 這兩根橫線,不然就是另外一層含義
背景?撤銷操作
版本12:hello linux aaaaaaaaaaaa
版本3:xxxxx code(需要撤銷這行代碼)
6.1情況一
情況一:只在工作區的ReadMe文件修改了內容
解決辦法:
- 手動撤銷——不推薦,容易出錯? ??
- git checkout --[filename] --推薦
6.2情況二
情況二:在工作區的ReadMe文件修改了內容并且add到了暫存區。
解決辦法:
- 回退命令 git reset HEAD (默認選項--mixed)暫存區回退到當前版本,回到撤銷情況一? ?
- 使用git checkout 撤銷命令。或者是直接git reset --hard HEAD 一步到位
6.3情況三
情況三:在工作區的ReadMe文件修改了內容并且add到了暫存區和commit提交到了版本庫中。
- 前提時:commit 之后沒有push
- 撤銷的目的是 不影響遠程倉庫的代碼。
- 解釋:我們使用操作只能截止到commit操作,而不能使用Push操作。有個這個大的前提,我們的撤銷才算有效。含義:將來在公司運行一些代碼,是運行的/跑的 遠程倉庫的代碼。(所以我們主要是圍繞遠程倉庫來玩)撤銷主要就是撤銷我們本地一些錯誤的,不好的代碼。修改完才能推送到遠程倉庫。
- 遠程倉庫:暫時不用理解。
- 工作區——add——>暫存區——>commit——>版本庫——>Push——>遠程倉庫
因為上面兩種撤銷情況我們都不需要考慮,都沒有commit到版本庫中,不可能到遠程倉庫。這種情況,版本庫中有了,我們不知道,遠程倉庫里是否被Push了。所以前提條件就是,遠程倉庫沒有被Push,這個撤銷操作才算有效。
解決辦法:
- 前提條件:commit 之后沒有push?? ?
- 使用git reset --hard commit id
- 一步一步回到撤銷情況二?撤銷情況一?再用git checkout
7.刪除文件
刪除一個已經更新到版本庫中的文件(兩種做法)?
//做法1
rm file
git add file
git commit -m "delete file"//做法2
git rm file //把工作區和暫存區的文件一步到位刪除
git commit -m "delete file"