GIT學習(二)_使用GIT

前面已經安裝並測試成功安裝了GIT工具,接下來就是具體的使用了。

一、設置開發者個人信息

在任何一個系統之中都會存在有多個開發者(多人協作開發),而在GIT之中,對於每一個開發者(單機),都需要開發者自己定義自己的名字和email郵件地址,以便進行聯繫。

設置全局信息

GIT是分佈式版本控制系統,每個單機都有自己的基本信息:開發者名字,email地址等。

姓名:git config --global user.name"czl"
email:git config --global user.email"[email protected]"
查詢全局信息:git config -l

這裏寫圖片描述

二、創建倉庫(版本庫)

創建版本庫(repository)
版本庫就是倉庫,在此倉庫中的所有內容都會被Git管理,倉庫中的所有文件修改、刪除、更新都會被記錄下來,可以隨時恢復到某一特定狀態。
初始化倉庫:git init
如果要開發項目,首先必須創建一個倉庫,在電腦選擇一個磁盤創建文件夾,如:

d:
md myproject

此時定義D盤中創建的myproject文件件爲倉庫,首先進入文件夾;

cd myproject

然後初始化倉庫(將此目錄變爲可以被GIT管理的倉庫)

git init

這裏寫圖片描述

注意此時myproject文件中會創建一個“.git”的目錄,這個目錄就是倉庫信息,不能更改,也不能刪除。不同於SVN、CVS等版本控制系統,以SVN爲例,SVN會在每個子目錄下面創建.svn文件夾,該文件夾包含一些配置文件,這些配置文件可以建立對版本庫的跟蹤(實際上這是版本控制系統的共性)。這些配置文件會記錄工作區的文件名稱、修改時間和版本等信息,通過時間戳的對比可以快速掃描工作區的改動。在.svn文件夾下還包括原始文件的拷貝,這些拷貝文件可以脫離版本庫獨立操作。此外,SVN的版本庫與工作區是分離的。

注:.svn目錄並不是本地倉庫,而是爲了建立與遠端版本倉庫的關聯而引入的配置文件,所以SVN的版本庫與工作區是分離的。

SVN這樣的設計的好處是在提交的時候可以只針對差異部分進行提交,因爲改動的文件可以與原始文件的拷貝進行差異比較。然而,缺點就是會加倍佔用工作區的空間,而且當在工作區目錄下針對文件內容進行搜索的時候,會因爲.svn目錄還有原始文件的拷貝使得搜索結果加倍,混淆真正的搜索結果。

三、添加文件

倉庫創建完成後,就可以進行文件的基本管理了。建議所有的文件都是用UTF-8編碼格式,以免出現編碼錯誤等問題。
新建一個hello.java文件,保存於D:/myproject文件下,此文件屬於git倉庫管理目錄。使用以下命令查看當前狀態:

git status

這裏寫圖片描述
git status狀態查詢操作上可以發現有如下幾個提示信息:

  • 現在的開發屬於主分支:On branch master;
  • 初始化倉庫的提交:Initial commit;
  • 未標記的文件:Untracked files
  • 還有提示命令:(use “git add …” to include in what will be committed)
  • 未標記文件列表,示例中只有一個:hello.java

添加文件到倉庫

  • 增加文件到暫存區:git add 文件名稱
  • 提交文件:git commit -m"註釋"

    git add hello.java

    然後查詢狀態git status
    這裏寫圖片描述

現在文件並沒有真正提交到主分支上(主分支是真正要運行的程序的所有代碼)。

注意:所有修改的代碼都會被git自動監測,所有的代碼在使用commit提交前必須得先使用add添加到暫存區,否則不會有任何代碼提交。
此處代碼提交,可以將addcommit合併一步執行git commit -a -m"註釋"

提交文件信息,執行此命令之後,hello.java文件就被提交到主分支上,也就意味程序發佈成功。例如:

git commit -m"new java file to be create"

這裏寫圖片描述

git工具下用戶每一次進行的提交實際上都會被日誌記錄下來,此時可以查看提交日誌信息。使用git log 文件名就可以查看詳細日誌信息。
這裏寫圖片描述

注意:提交信息中的一串字符串可以理解爲每次提交的唯一標識ID號,多次提交就會有多個。

四、修改倉庫文件

當文件修改之後

  • 查看修改結果:git status
  • 修改前後文件對比:git diff 文件名稱
  • 查看操作日誌:git log 文件名稱

這裏我修改了剛剛創建的Java文件hello.java使用git status查看修改後的狀態,如下圖所示:
這裏寫圖片描述

可以單刀現在git提示用戶,文件沒有保存到暫存區之中,提示要麼將文件保存到暫存區要麼恢復文件,同時說明已經修改了hello.java
查看文件前後區別

git diff hello.java

這裏寫圖片描述

確認修改後,將修改後的代碼內容加入到暫存區後進行提交

git commit -a -m"update hello.java file add one print"

這裏寫圖片描述

五、工作區和暫存區

在Git學習過程中,有幾個重要概念必須搞明白:工作區、暫存區和版本庫。這些概念,讓Git的版本控制更加便捷和高效。而Git相比其他版本控制系統的一個不同是暫存區,實際上如果理解了暫存區,對Git的其他命令理解會很快。

工作區:簡單理解就是需要進行版本的某個文件夾(此處我的文件夾爲myproject),這個文件夾有一些特殊之處——多了.git這個隱藏的文件夾

版本庫: myproject文件夾下的.git文件夾就是版本庫

暫存區:暫存區可以理解爲一個虛擬工作區,這個虛擬工作區會跟蹤工作區的文件變化(增刪改等操作)。這個工作區的位於.git文件夾下的index目錄下

需要理解一點:當需要對工作區的修改提交到版本庫前,暫存區會與工作區進行差異比較,如果工作區與暫存區的文件不一致,那麼需要同步工作區的修改到暫存區,然後纔可以提交到版本庫。從這個意義講,暫存區可以說是工作區和版本庫的橋樑。好處自然是可以在真正提交到版本庫之前做任意的操作,在需要真正提交的時候push到版本庫。

Git之父Linus當初設計暫存區的初衷是由於每次在SVN中commit的時候都需要選擇需要提交到版本庫的文件,發現這個功能太雞肋了。於是他想如果能夠在真正commit做任意的修改,這些修改可以先放在暫存區中,如果後悔了不僅可以非常方便撤銷,而且不會影響到現有的版本庫。

下面通過一張圖理解爲工作區、暫存區和版本庫的關係:
這裏寫圖片描述

從這張圖可以得出以下信息:

Git的操作圍繞工作區、暫存區(圖中的index)、版本庫(圖中的master,實際上這是版本庫的主分支)、對象庫(圖中的objects)幾個部分進行
工作區、暫存區和版本庫都維持着一棵目錄樹
objects 標識的區域爲 Git 的對象庫,實際位於.git/objects目錄下
暫存區跟蹤記錄了工作區的文件名和文件狀態(修改時間,文件大小等信息)
圖中的HEAD是一個指向最新commit的引用,可以通過版本回退的方式改變HEAD的指向
執行git add會更新暫存區的目錄樹,同時將工作區的文件內容生成一個對象放入objects對象庫中,在暫存區記錄了該對象的索引index
執行git commit會更新版本庫的目錄樹,commit成功後版本庫指向的目錄樹就是暫存區的目錄樹
在圖中還有其他的命令,這裏可以暫時不用理會,後面就會慢慢理解的。目前只需要理解git addgit commit這兩個命令就可以。
既然暫存區會跟蹤記錄工作區的文件變化,那麼Git是如何實現的呢?答案是時間戳。可以使用命令git status查看工作區與暫存區的差異情況,在執行git status時,首先會到.git/index下查看被跟蹤的工作區文件的時間戳,如果發現自上次執行git add(執行git add可以讓工作區的文件被跟蹤)以來,文件的時間戳發生了變化,那麼判斷文件發生了改動,於是會與暫存區的原始文件與工作區中的該文件進行差異比較,如果發現兩個文件內容不一致,那麼就給出差異信息。
下面針對具體實現過程,上幾張圖,就一目瞭然了:
第一步:工作區編寫程序
這裏寫圖片描述
第二步:加入文件到暫存區(git add)
這裏寫圖片描述
第三步:提交到master分支
這裏寫圖片描述

六、版本回退

當用戶每一次將自己的代碼提交到版本庫之後都會自動的生成一個commit記錄進行操作保存,每一條記錄都會自動生成一個commit ID進行唯一標識。
察看日誌:git log --pretty=oneline 文件
這裏寫圖片描述

注意:每當用戶進行代碼提交的時候都會生成一個commit ID,而這個commit ID就是進行代碼回退的主要操作方式,回退是根據ID找到歷史版本進行回退操作。

回退指針:HEAD~次數

默認狀態下的HEAD保存的是最後一次提交點
這裏寫圖片描述
在master分支上會有一個HEAD指針存在,而這個指針默認情況下永遠指向最後一次提交的位置。

當回退一次之後HEAD改變保存提交點
這裏寫圖片描述
當使用回退操作之後,會發現HEAD的位置已經發生變化,如果只是回退一步,那麼之前的操作不會被刪除,所有的代碼將回退到指定位置的狀態。

git reset --hard HEAD~1

這裏寫圖片描述
如果此時還想恢復到最新狀態,那麼就需要使用commit ID進行操作了.

--找到所有的已經刪除的信息的commit ID
git reflog
--恢復最後一次提交
git reset --hard ff44521

這裏寫圖片描述

七、管理修改

在有了暫存區和master主分支概念之後,就需要回避一個問題,只有保存在暫存區之中的內容纔可以被真正的修改,而不是針對於文件。
這裏寫圖片描述

八、撤銷修改

有了修改操作之後就會有撤銷修改,有時候會發生這種狀況,當你修改完之後,發現這樣修改也許不合理,此時想要撤回到之前狀態,這時候就需要撤銷操作了。

1. 情況一:在爲增加(git add)與提交前(git commit)用戶可以直接撤銷對文件所作出的修改操作。

撤銷所作出的修改操作:git checkout -- 文件名稱
如果在工作區之中的代碼並沒有增加到暫存區之中,那麼如果要恢復到原始狀態是很簡單的。
例如代碼如下(這段代碼顯然是有問題的,但是隻要代碼一修改,git就可以監測到):

public class hello{
    public static void main(String args[]){
        System.out.println("hello world");
        System.out.println("today is bad day");
        你好世界!!!!!
    }
}

這裏寫圖片描述
此時代碼並沒有增加到暫存區之中,此時只要使用下面的操作就可以恢復到之前狀態。

git checkout -- hello.java

現代代碼恢復正常狀態

public class hello{
    public static void main(String args[]){
        System.out.println("hello world");
        System.out.println("today is bad day");
    }
}

2. 情況二:在已增加(git add)與未提交前(git commit)用戶可以直接撤銷對文件所作出的修改操作。

撤銷暫存區的修改操作:git reset HEAD 文件名
丟掉已經修改的文件內容:git checkout -- 文件名稱

現在假設已經將代碼提交到暫存區之中。使用git add .,然後查詢狀態git status
這裏寫圖片描述

從暫存區之中退出

git reset HEAD hello.java

已經從暫存區中恢復到工作區之中,然後再執行

git checkout -- hello.java

這裏寫圖片描述

九、刪除文件

在之前創建的myproject之中再新建一個demo.java示例文件,然後進行刪除操作,但是在git之中嚴格來講,刪除操作也屬於修改操作。
使用以下命令

--del 要刪除的文件名
del demo.java
--刪除之後查看狀態
git status

文件被刪除之後只能利用版本控制的方式進行恢復。一般不建議使用刪除操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章