【三】版本之间穿梭切换
版本之間穿梭切換
- 1. 版本回退
- 2. 回退版本
- 3. 工作區(qū)和暫存區(qū)
- 4. 管理修改
- 5. 撤銷修改
- 6. 刪除文件
再穿梭前,我們先修改readme.txt文件,修改為:
Git is a distributed version control system. Git is free software.運行g(shù)it status命令看看結(jié)果:
git status命令可以讓我們時刻掌握倉庫的當前狀態(tài),例如上面的信息告訴我們readme.txt文件被修改了,還沒有add所以不能commit。
如果不知道或忘記了修改了什么,可以使用git diff查看修改的具體內(nèi)容(diff就是difference的縮寫):
紅色文字前面有個減號-的就是刪除的,綠色的前面有個加號+的就是新增的,以上信息告訴我們第一行新增了一個單詞distributed。
知道了修改了什么就可以放心提交了,提交還是兩步驟,第一步先git add,然后使用git status查看下狀態(tài):
這里信息告訴我們將要提交的修改包括readme.txt文件,然后第二步就可以提交了:
提交完成后,再使用git status查看倉庫的當前狀態(tài):
上面信息說明沒有需要提交的修改,而且工作目錄是干凈的。
1. 版本回退
先再來練習下,再修改一個版本,修改文件為:
Git is a distributed version control system. Git is free software distributed under the GPL.然后提交:
現(xiàn)在已經(jīng)有3個版本的提交記錄,使用git log查看:
git log命令顯示從最近到最遠的提交日志,我們可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是add a readme file。
如果嫌信息太多,可以加上--pretty=oneline就可以:
上面顯示的一大串的字符是commit id(版本號),這是SHA1計算出來的一個非常大的數(shù)字,用十六進制表示,每個人的不一樣,以自己的為準。
為什么commit id需要一大串字符表示呢?因為Git是分布式的版本控制系統(tǒng),避免大家版本號沖突。
2. 回退版本
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交cc1510...(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數(shù)不過來,所以寫成HEAD~100。
現(xiàn)在,我們要把當前版本append GPL回退到上一個版本add distributed,就可以使用git reset命令:
這里的HEAD^加引號是因為windows系統(tǒng)會把^當作換行符,不加引號會顯示“more?”,如果你看到了不要奇怪哦。
先來看看文件還原了沒有:
果然還原了。
再用git log看看現(xiàn)在版本庫的狀態(tài):
額。。。最新的append GPL版本不見了!那怎么回到最新的版本呢?如果你沒有清命令行記錄還是可以找到commit id的,如果清了咋辦呢?
還是有辦法的,Git提供了一個命令git reflog用來記錄你的每一次命令:
終于看到了append GPL的commit id是cc1510e,所以可以回去了:
commit id可以不用寫全,前幾位就可以了,只要能唯一代表就可以。
Git的版本回退速度非常快,因為Git在內(nèi)部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅是把HEAD從指向append GPL:
改為指向add distributed:
然后順便把工作區(qū)的文件更新了。所以你讓HEAD指向哪個版本號,你就把當前版本定位在哪。
3. 工作區(qū)和暫存區(qū)
Git和其他版本控制系統(tǒng)如SVN的一個不同之處就是有暫存區(qū)的概念。
工作區(qū)(Working Directory)
就是你在電腦里能看到的目錄,比如我的learngit文件夾就是一個工作區(qū):
版本庫(Repository)
工作區(qū)有一個隱藏目錄.git,這個不算工作區(qū),而是Git的版本庫。
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針叫HEAD。
前面講了我們把文件往Git版本庫里添加的時候,是分兩步執(zhí)行的:
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區(qū);
第二步是用git commit提交更改,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支。
因為我們創(chuàng)建Git版本庫時,Git自動為我們創(chuàng)建了唯一一個master分支,所以,現(xiàn)在,git commit就是往master分支上提交更改。
你可以簡單理解為,需要提交的文件修改通通放到暫存區(qū),然后,一次性提交暫存區(qū)的所有修改。
例如:我們再修改下readme.txt,然后再加一個LICENSE文件
使用git status查看下狀態(tài):
可以看到readme.txt是Changes not staged for commit(沒有添加到暫存區(qū),不能提交),而LICENSE是Untracked files(新文件沒有被跟蹤),使用git add后再看下狀態(tài):
現(xiàn)在,暫存區(qū)的狀態(tài)就變成這樣了:
所以,git add命令實際上就是把要提交的所有修改放到暫存區(qū)(Stage),然后,執(zhí)行g(shù)it commit就可以一次性把暫存區(qū)的所有修改提交到分支。
現(xiàn)在版本庫變成了這樣,暫存區(qū)就沒有任何內(nèi)容了:
4. 管理修改
為什么Git比其他版本控制系統(tǒng)設(shè)計得優(yōu)秀,因為Git跟蹤并管理的是修改,而非文件。
修改:新增一行,修改字符,刪除一行/字符,創(chuàng)建文件。。。
例如:
- 對readme.txt加一行
- git add添加暫存
- 再修改readme.txt剛才加的一行
- git commit提交到分支
- git status查看狀態(tài)
額。。。第二次修改沒有被提交?為什么呢?
回顧操作:第一次修改 -> git add -> 第二次修改 -> git commit
因為第二次修改沒有加到緩存區(qū),而git commit只提交緩存區(qū)的修改到當前分支,所以只提交了第一次的修改。
使用git diff查看下:
可見第二次確實沒有修改,我們可以繼續(xù)git add再git commit,也可以和后面修改的文件一起add再一起commit。
5. 撤銷修改
如果不小心修改錯了文件,怎么撤回呢?這里有兩種情況:
先來看情況1(未add到暫存區(qū)):
git提示我們git restore可以丟棄工作區(qū)的修改,執(zhí)行后工作區(qū)的文件被還原了。
情況2(已add到暫存區(qū)):
可以先用git restore --staged將文件從暫存區(qū)退回到工作區(qū):
然后再使用git restore丟棄工作區(qū)的修改:
然后再看下狀態(tài),是clean狀態(tài)的:
如果已經(jīng)提交到分支了,那就直接回退版本就行了。
6. 刪除文件
先添加一個文件test.txt,并提交:
此時刪除文件:
然后這里有兩個選擇,一是誤刪了需要恢復,二是真的需要刪除:
恢復刪除的文件
此時文件又回來了,工作區(qū)和版本庫相同了。
確認刪除
使用git rm刪除文件提交到暫存區(qū),然后再git commit提交到當前分支:
現(xiàn)在文件就從版本庫刪除了。
總結(jié)
以上是生活随笔為你收集整理的【三】版本之间穿梭切换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pandas 读取所有表头_像用exce
- 下一篇: 两个重要极限_算法数学基础-概率论最重要