Git學習筆記(2)——版本的回退,和暫存區的理解


本文主要記錄了版本的回退,以及工作區,暫存區概念的理解。


//開始之前,先回顧上次的內容,修改文件如下,並提交到版本庫。
Git is a distributed version control system.
Git is free software distributed under the GPL.

1、查看版本庫的信息

ubuntu@myubuntu:~/joe/learngit$ 
git log
    //可以看到,下面有3個版本
commit 71038bf6cbd05ef559549a13a351aa8465be6c4d   //這一行是每個版本的ID
Author: joe <little_star13@163.com>
Date:   Sat May 9 15:06:17 2015 +0800

    append GPL

commit 942f575de9e925d256ca4a704e1a37de18697baf
Author: joe <little_star13@163.com>
Date:   Sat May 9 14:51:16 2015 +0800

    add distributed

commit b401faf255e6a9480b1ed903a2b392ccf4628910
Author: joe <little_star13@163.com>
Date:   Sat May 9 11:01:44 2015 +0800

    joe's first txt
ubuntu@myubuntu:~/joe/learngit$ 
git log --pretty=oneline
    //我們還可以簡單的顯示信息
71038bf6cbd05ef559549a13a351aa8465be6c4d append GPL
942f575de9e925d256ca4a704e1a37de18697baf add distributed
b401faf255e6a9480b1ed903a2b392ccf4628910 joe's first txt

2、版本的回退

//在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。
ubuntu@myubuntu:~/joe/learngit$ 
git reset --hard HEAD^

HEAD 現在位於 942f575 add distributed
ubuntu@myubuntu:~/joe/learngit$ 
cat readme.txt
     //查看一下文件內容,發現已經回退了。
Git is a distributed version control system
Git is free software
ubuntu@myubuntu:~/joe/learngit$ 
git log --pretty=oneline
    //重新查看一下版本信息,發現剩下了2個
942f575de9e925d256ca4a704e1a37de18697baf add distributed    //也就是退回去以后,就不能回來了。其實是可以的。
b401faf255e6a9480b1ed903a2b392ccf4628910 joe's first txt
ubuntu@myubuntu:~/joe/learngit$ 
git reset --hard 71038bf6
        //只要知道某個版本的ID,我們就可以前去。(ID就是版本信息前面的一串字符串,我們只要記住前幾位就可以,git會自動分配檢測的。)
HEAD 現在位於 71038bf append GPL
ubuntu@myubuntu:~/joe/learngit$ cat readme.txt 
Git is a distributed version control system
Git is free software distributed under the GP
ubuntu@myubuntu:~/joe/learngit$ 
git reflog
    //如果不知道ID,也沒有版本信息,我們可以查看命令日志記錄。
71038bf HEAD@{0}: reset: moving to 71038bf6
942f575 HEAD@{1}: reset: moving to HEAD^
71038bf HEAD@{2}: commit: append GPL
942f575 HEAD@{3}: commit: add distributed
b401faf HEAD@{4}: commit (initial): joe's first txt

3、概念理解:

工作區(Working Directory):比如learngit文件夾就是一個工作區。

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

前面我們把文件往Git版本庫里添加的時候,是分兩步執行的:

第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;

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

因為我們創建Git版本庫時,Git自動為我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。你可以簡單理解為,需要提交的文件修改通通放到暫存區,然后,一次性提交暫存區的所有修改。

(為了深刻的理解這些感念,建議親自寫些文件測試一下,修改下文件,查看下狀態,添加后再查看狀態,提交后再次查看下狀態。)


4、為什么Git比其他版本控制系統設計得優秀,因為Git跟蹤並管理的是修改,而非文件。

測試思想:修改內容,添加(不要提交),然后再修改,提交。你會發現第二次的修改沒有被提交。

這是因為:Git管理的是修改,當你用git add命令后,在工作區的第一次修改被放入暫存區,准備提交,但是,在工作區的第二次修改並沒有放入暫存區,所以,git commit只負責把暫存區的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。

提交后,用git diff HEAD -- readme.txt命令可以查看工作區和版本庫里面最新版本的區別:

//首先查看工作區是干凈的
ubuntu@myubuntu:~/joe/learngit$ git status
位於分支 master
無文件要提交,干凈的工作區
ubuntu@myubuntu:~/joe/learngit$ ls
abc.c  readme.txt
//修改了文件
ubuntu@myubuntu:~/joe/learngit$ vi readme.txt 
ubuntu@myubuntu:~/joe/learngit$ 
git diff HEAD -- readme.txt
    //查看一些區別
diff --git a/readme.txt b/readme.txt
index 6398377..3f762ee 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3,4 +3,3 @@ Git is free software distributed under the
 Are you ok?
 Yes,i am fine.
 What about you?
-i am bad!
     //區別以紅色標記,很明顯
ubuntu@myubuntu:~/joe/learngit$
git status
    //查看狀態,發現沒有暫存add
位於分支 master
尚未暫存以備提交的變更:
  (使用 "git add <file>..." 更新要提交的內容)
  (使用 "git checkout -- <file>..." 丟棄工作區的改動)

    修改:     readme.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
ubuntu@myubuntu:~/joe/learngit$
git add readme.txt
     //add以后,查看狀態,是沒有提交
ubuntu@myubuntu:~/joe/learngit$ git status
位於分支 master
要提交的變更:
  (使用 "git reset HEAD <file>..." 撤出暫存區)

    修改:     readme.txt

ubuntu@myubuntu:~/joe/learngit$
git diff HEAD -- readme.txt
    //查看對比,依然是有差異,雖然add了,但是還是和版本庫是有差異的。
diff --git a/readme.txt b/readme.txt
index 6398377..3f762ee 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3,4 +3,3 @@ Git is free software distributed under the
 Are you ok?
 Yes,i am fine.
 What about you?
-i am bad! 
ubuntu@myubuntu:~/joe/learngit$
git commit -m "del a line"
        //只有正真提交以后,才沒有差異
[master 010726f] del a line
 1 file changed, 1 deletion(-)
ubuntu@myubuntu:~/joe/learngit$ 
git diff HEAD --
 readme.txt
ubuntu@myubuntu:~/joe/learngit$ 
git status
    //工作區也干凈了
位於分支 master
無文件要提交,干凈的工作區
ubuntu@myubuntu:~/joe/learngit$


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM