版本之間穿梭切換
- 1. 版本回退
- 2. 回退版本
- 3. 作業區和暫存區
- 4. 管理修改
- 5. 撤銷修改
- 6. 洗掉檔案
再穿梭前,我們先修改readme.txt檔案,修改為:
Git is a distributed version control system.
Git is free software.
運行git status命令看看結果:

git status命令可以讓我們時刻掌握倉庫的當前狀態,例如上面的資訊告訴我們readme.txt檔案被修改了,還沒有add所以不能commit,
如果不知道或忘記了修改了什么,可以使用git diff查看修改的具體內容(diff就是difference的縮寫):

紅色文字前面有個減號-的就是洗掉的,綠色的前面有個加號+的就是新增的,以上資訊告訴我們第一行新增了一個單詞distributed,
知道了修改了什么就可以放心提交了,提交還是兩步驟,第一步先git add,然后使用git status查看下狀態:

這里資訊告訴我們將要提交的修改包括readme.txt檔案,然后第二步就可以提交了:

提交完成后,再使用git status查看倉庫的當前狀態:

上面資訊說明沒有需要提交的修改,而且作業目錄是干凈的,
1. 版本回退
先再來練習下,再修改一個版本,修改檔案為:
Git is a distributed version control system.
Git is free software distributed under the GPL.
然后提交:

現在已經有3個版本的提交記錄,使用git log查看:

git log命令顯示從最近到最遠的提交日志,我們可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是add a readme file,
如果嫌資訊太多,可以加上--pretty=oneline就可以:

上面顯示的一大串的字符是commit id(版本號),這是SHA1計算出來的一個非常大的數字,用十六進制表示,每個人的不一樣,以自己的為準,
為什么commit id需要一大串字符表示呢?因為Git是分布式的版本控制系統,避免大家版本號沖突,
2. 回退版本
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交cc1510...(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100,
現在,我們要把當前版本append GPL回退到上一個版本add distributed,就可以使用git reset命令:

這里的
HEAD^加引號是因為windows系統會把^當作換行符,不加引號會顯示“more?”,如果你看到了不要奇怪哦,
先來看看檔案還原了沒有:

果然還原了,
再用git log看看現在版本庫的狀態:

額,,,最新的append GPL版本不見了!那怎么回到最新的版本呢?如果你沒有清命令列記錄還是可以找到commit id的,如果清了咋辦呢?
還是有辦法的,Git提供了一個命令git reflog用來記錄你的每一次命令:

終于看到了append GPL的commit id是cc1510e,所以可以回去了:

commit id可以不用寫全,前幾位就可以了,只要能唯一代表就可以,
Git的版本回退速度非常快,因為Git在內部有個指向當前版本的HEAD指標,當你回退版本的時候,Git僅僅是把HEAD從指向append GPL:

改為指向add distributed:

然后順便把作業區的檔案更新了,所以你讓HEAD指向哪個版本號,你就把當前版本定位在哪,
3. 作業區和暫存區
Git和其他版本控制系統如SVN的一個不同之處就是有暫存區的概念,
作業區(Working Directory)
就是你在電腦里能看到的目錄,比如我的learngit檔案夾就是一個作業區:

版本庫(Repository)
作業區有一個隱藏目錄.git,這個不算作業區,而是Git的版本庫,
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指標叫HEAD,

前面講了我們把檔案往Git版本庫里添加的時候,是分兩步執行的:
第一步是用git add把檔案添加進去,實際上就是把檔案修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支,
因為我們創建Git版本庫時,Git自動為我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改,
你可以簡單理解為,需要提交的檔案修改通通放到暫存區,然后,一次性提交暫存區的所有修改,
例如:我們再修改下readme.txt,然后再加一個LICENSE檔案
使用git status查看下狀態:

可以看到readme.txt是Changes not staged for commit(沒有添加到暫存區,不能提交),而LICENSE是Untracked files(新檔案沒有被跟蹤),使用git add后再看下狀態:

現在,暫存區的狀態就變成這樣了:

所以,git add命令實際上就是把要提交的所有修改放到暫存區(Stage),然后,執行git commit就可以一次性把暫存區的所有修改提交到分支,

現在版本庫變成了這樣,暫存區就沒有任何內容了:

4. 管理修改
為什么Git比其他版本控制系統設計得優秀,因為Git跟蹤并管理的是修改,而非檔案,
修改:新增一行,修改字符,洗掉一行/字符,創建檔案,,,
例如:
- 對
readme.txt加一行 git add添加暫存- 再修改
readme.txt剛才加的一行 git commit提交到分支git status查看狀態

額,,,第二次修改沒有被提交?為什么呢?
回顧操作:第一次修改 -> git add -> 第二次修改 -> git commit
因為第二次修改沒有加到快取區,而git commit只提交快取區的修改到當前分支,所以只提交了第一次的修改,
使用git diff查看下:

可見第二次確實沒有修改,我們可以繼續git add再git commit,也可以和后面修改的檔案一起add再一起commit,
5. 撤銷修改
如果不小心修改錯了檔案,怎么撤回呢?這里有兩種情況:
- 修改后還沒有
add到暫存區 - 已經
add到暫存區了,又做了修改
先來看情況1(未add到暫存區):

git提示我們git restore可以丟棄作業區的修改,執行后作業區的檔案被還原了,
情況2(已add到暫存區):
可以先用git restore --staged將檔案從暫存區退回到作業區:

然后再使用git restore丟棄作業區的修改:

然后再看下狀態,是clean狀態的:

如果已經提交到分支了,那就直接回退版本就行了,
6. 洗掉檔案
先添加一個檔案test.txt,并提交:

此時洗掉檔案:

然后這里有兩個選擇,一是誤刪了需要恢復,二是真的需要洗掉:
-
恢復洗掉的檔案

此時檔案又回來了,作業區和版本庫相同了, -
確認洗掉
使用git rm洗掉檔案提交到暫存區,然后再git commit提交到當前分支:

現在檔案就從版本庫洗掉了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/267408.html
標籤:其他
上一篇:機器學習01-基本概念
下一篇:Git之Feature分支
