Git(二) 版本回退與分割槽概念

2021-10-05 01:33:14 字數 4058 閱讀 4917

git具有"快照"功能,每當你覺得檔案修改到一定程度的時候,就可以「儲存乙個快照」,這個快照在git中被稱為commit。一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的乙個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失。在git中,我們用git log命令檢視歷史記錄。

比如,我們對readme進行了三次修改。顯示的記錄是從最近到最早。

$ git log

commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (head -> master)

author: michael liao

date: fri may 18 21:06:15 2018 +0800

commit e475afc93c209a690c39c13a46716e8fa000c366

author: michael liao

date: fri may 18 21:03:36 2018 +0800

add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0

author: michael liao

date: fri may 18 20:59:18 2018 +0800

wrote a readme file

如果嫌輸出資訊太多,看得眼花繚亂的,可以試試加上–pretty=oneline引數:

$ git log --pretty=oneline

e475afc93c209a690c39c13a46716e8fa000c366 add distributed

eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file

你看到的一大串類似1094adb…的是commit id(版本號),git的commit id不是1,2,3……遞增的數字,而是乙個sha1計算出來的乙個非常大的數字,用十六進製制表示。為什麼commit id需要用這麼一大串數字表示呢?因為git是分布式的版本控制系統,後面我們還要研究多人在同乙個版本庫里工作,如果大家都用1,2,3……作為版本號,那肯定就衝突了。

鋪墊完成,現在開始講如何版本回退:

首先,git必須知道當前版本是哪個版本,在git中,用head表示當前版本,也就是最新的提交1094adb…(注意我的提交id和你的肯定不一樣),上乙個版本就是head^ ,上上乙個版本就是head^^ , 當然往上100個版本寫100個 ^ 比較容易數不過來,所以寫成head~100。

$ git reset --hard head^

head is now at e475afc add distributed

檢視一下readme的內容:果然還原了!

$ cat readme.txt

git is a distributed version control system.

git is free software.

再返回去:

$ git reset --hard 1094a
tips:版本號沒必要寫全,前幾位就可以了,git會自動去找。當然也不能只寫前一兩位,因為git可能會找到多個版本號,就無法確定是哪乙個了。那麼問題又來了,舉個極端栗子:

現在,你回退到了某個版本,關掉了電腦,第二天早上就後悔了,想恢復到新版本怎麼辦?找不到新版本的commit id怎麼辦???!!!

$ git reflog

e475afc head@: reset: moving to head^

e475afc head@: commit: add distributed

eaadf4e head@: commit (initial): wrote a readme file

工作區(working directory)

就是你在電腦裡能看到的目錄,比如我的learngit資料夾就是乙個工作區:

版本庫(repository)

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

分支和head的概念我們以後再講。

前面講了我們把檔案往git版本庫里新增的時候,是分兩步執行的:

第一步是用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區;

第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

因為我們建立git版本庫時,git自動為我們建立了唯一乙個master分支,所以,現在,git commit就是往master分支上提交更改。

你可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

git is a distributed version control system.

git is free software distributed under the gpl.

git has a mutable index called stage.

$ git status

on branch master

changes not staged for commit:

(use "git add ..." to update what will be committed)

(use "git checkout -- ..." to discard changes in working directory)

modified: readme.txt

untracked files:

(use "git add ..." to include in what will be committed)

license

no changes added to commit (use "git add" and/or "git commit -a"

)

git非常清楚地告訴我們,readme.txt被修改了,而license還從來沒有被新增過,所以它的狀態是untracked。

(3)現在,使用兩次命令git add,把readme.txt和license都新增後,用git status再檢視一下:

$ git status

on branch master

changes to be committed:

(use "git reset head ..." to unstage)

new file: license

modified: readme.txt

現在暫存區就是醬紫:

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

commit之後:再用git status檢視一下狀態:

到此就是今天的內容啦!另外,概念一定要掌握清楚,所有操作都是基於原理和概念的

Git系列(二)版本回退

複習 在 git系列 一 中知道了如何初始化版本倉庫,將檔案新增到倉庫以及將檔案提交到倉庫。對應的git命令分別為 git init git add filename git commit m message message是對當前提交做的解釋說明 以及用git status來檢視當前倉庫的狀態。g...

Git版本回退(二)

前文的版本回退操作是在工作區進行的。有時候你已經把修改的 放到了暫存區,但是你想回退暫存區的 該怎麼做?我們這次增加乙個檔案,名字叫license。然後使用git status來檢視工作區的狀態。可以看到,git告訴我們license是未被跟蹤的檔案,也就是說它不在當前的git版本倉庫中。因為這是我...

Git 七 版本回退

現在,你已經學會了修改檔案,然後把修改提交到git版本庫,現在,再練習一次,修改readme.txt檔案如下 git is a distributed version control system.git is free software distributed under the gpl.然後嘗試...