Git 本地倉庫(Repository詳解)

1、git相關概述php

這個教程呢,有幾個部分先和你們說一下:java

  • Git 本地倉庫詳解git

  • Git 遠程倉庫詳解github

  • Git 分支管理詳解bash

  • Git 標籤管理詳解分佈式

  • GitHub 使用詳解ide

  • Git 全局配置詳解svn

  • Git與GitHub總結測試

2、在Windows上安裝Gitspa

注,你們請到這裏下載:http://msysgit.github.io/。直接雙擊安裝便可。安裝完成後桌面上會生成一個Git bash圖標,雙擊打開會彈出一個相似命令行窗口的東西,

git bash

好了,到這裏咱們的Git就安裝完成了,下面咱們來進行基本配置:

wKiom1P9d8GwgeS_AAC989FSFi4278.jpg

$ git config --global user.name "Your Name"
$ git config --global user.email 「email@example.com」

注,我這裏根據個人狀況設置以下(如上圖):

$ git config --global user.name "fuquanjun"
$ git config --global user.email "1509773564@qq.com"

Git是分佈式控制系統,因此,每一個客戶端都必須設置:你的名字和郵箱。這樣才容易區分是哪一個用戶提交的Git版本,你們能夠看到git config 後面接的是--global參數,這表示你的機器上全部的Git倉庫都會使用這個配置,但你也能夠對不一樣的倉庫指定不一樣的用戶名和郵箱。這個咱們會在後面的文章中講解,這裏就不說明了。

3、建立本地倉庫

1.版本庫又稱倉庫

版本庫或者是倉庫,英文名Repository,其實啊說白了就是一個目錄並且,這個目錄中的因此文件都被git管理並且,無論你作什麼操做都會被記錄,包括:增長、刪除、修改文件等,都會被記錄下來,以便後來跟蹤與修改相關記錄,甚至被還原。好了,下面咱們就在咱們客戶端(我這裏演示的是Windows客戶端,其它客戶端操做同樣)中建立一個版本庫:

mkdir

能夠看到咱們在/c/Users/root/下建立一個空目錄pro便可project簡寫。還有一點須要說明的在Windows系統中目錄名稱不要使用中文,否則會出現問題。

 

2.目錄變成倉庫

git init

執行git init命令,便可Initialized empty Git repository in c:/Users/root/pro/.git/,初始化一個空目錄,路徑爲c:/Users/root/pro/.git/。你們能夠看到pro目錄中生成了一個隱藏目錄 .git目錄,進入目錄中你們能夠看到裏面有不少文件,沒事不要修改或者改動裏機的文件,這裏面的文件就是控制和管理版本庫的,

 

3.向本地倉庫中增長文件

在版本庫中只能跟蹤和管理文本文件,比txt文件、js文件、php文件、java文件等,全部的程序代碼均可以的。可是像視頻、圖片等這些二進制文件,雖然能由git管理,可是隻能記錄大小,沒法跟蹤具體修改了什麼,下面咱們來增長一個readme.txt文件,其內容以下:

This is git test.
Git is a version of the best controller.
……

readme

注意,新建readme.txt文件,必定要在pro目錄,否則git沒法管理這裏文件哦,下面咱們把個文件放到版本庫中。

git add

1).git status 命令

咱們先用git status命令查看一下,如上圖。你們能夠看到git記錄咱們新增長一個文件readme.txt,而且提示這個文件尚未被提交。下面咱們用git add命令提交一下。

2).git add 命令

git add 命令是告訴git,咱們要把什麼文件提交到倉庫中去,你們能夠看咱們執行git add readme.txt命令後,沒有任何提示。那就說明咱們提交完成了。下面咱們經過git commit命令,將readme.txt文件提交到版本庫中。

3).git commit 命令

$ git commit -m "add readme.txt"
[master (root-commit) e5d662b] add readme. 
1 file changed, 3 insertions(+) 
create mode 100644 readme.txt

咱們用git commit命令提交readme.txt文件,給出的提示是1 file changed, 3 insertions(+),一個文件改變,插入了三行內容。與咱們上面增長三行內容一致!下面咱們簡單的說明一下git commit命令,其中的參數-m後面輸入的是本次提交的版本說明,能夠輸入任意內容,但須要說明的是,最好寫有意義的說明,便於之後查看。

4).git status 命令

最後咱們用git status命令查看一下版本庫狀態,提示沒有任何內容須要提交說明咱們向版本庫增長文件成功了。

 

4.總結

1).初始化一個Git倉庫,使用git init命令

2).添加文件到本地Git倉中,分爲兩步:

  • 使用git add命令,注意,能夠屢次使用,添加多個文件

  • 使用git commit命令,完成添加。

爲何Git添加文件須要兩步呢?一步add,一步commit,由於commit命令能夠一次提交多個文件,因此你能夠屢次使用add命令呢。下面是個案例:(咱們也常常這麼用)

$ git add file1.php
$ git add file2.php
$ git add file3.php
$ git commit –m 「add file1.php file2.php file3.php」


四:本地倉庫管理詳解

1.查看工做區的狀態(git status)

在上面的文章中咱們成功的增長了一個readme.txt文件,並用git status命令查看了狀態,在這節中咱們就詳細的說一下git status命令。咱們修改一下readme.txt中的內容以下:

This is git test. 
Git is a version of the best conntroller.

咱們刪除了最後一行,如今咱們再用git status命令查看一下狀態:

git status

從上圖中咱們能夠看到,咱們用git status命令查看一下,咱們得知readme.txt文件被修改過了,可是尚未提交這個修改。可是有博友會問了,git提示咱們這個readme.txt這個文件被修改了,但咱們想看看具體修改了什麼內容怎麼辦呢?這個時候咱們須要git diff命令出場了,以下圖:

git diff

你們能夠從上面圖片中能夠看到,咱們刪除了最後一行的……省略號。用紅顏色標出來的。好了知道修改了什麼,下面咱們就提交修改吧,提交修改和提交新文件一致,也是兩步,先add,再commit。以下圖:

git add readme

你們能夠看到咱們執行git add命令,一樣沒有輸出。可是,咱們能夠用git status命令查看一下。下面咱們用git commit命令提交到本地版本庫,以下圖:

git commit read

一樣的咱們使用git status命令查看一下狀得知咱們修改的readme.txt文件已提交。好了,到這裏咱們的git status命令就講解完成了,同時咱們也講解一個git diff命令,能夠查看咱們修改了哪些內容。



2.版本回滾

在上面一個章節中咱們演示修改文件並提交文件,再用git status命令查看狀態,下咱們再修幾個版本並提交:

git a free

git a dis

好了,就這樣咱們不斷的修改並提交到本地的版本庫中。一會你測試的時候發現前修改的版本有問題想回滾到前面的版本,或者你誤刪除了一些文件,想回到上一個commit中去,而後繼續工做。咱們應該怎麼辦呢?在Git版本控制中,咱們全部的操做都是有歷史記錄的,咱們用git log命令查看一下(以下圖):

git log

你們能夠看到,用git log命令能夠查看最近幾回提交的版本。若是你發現內容太多,能夠用這個命令查看

git log oneline

上面你看到的一大串數字,實際上是commit id(即,版本號),和svn不同,Git的commit id不是1,2,3……這樣的遞數字,而是一相SHA1計算出來的哈希數,用16進製表示。有博友會問了,爲何Git的commit id不是1,2,3……這樣的遞增數字,而是用SHA1算出來的哈希數來表示呢?你們應該知道Git是分佈式管理系統,咱們會有多我的同時開發,若是你們都用1,2,3……這樣的遞增數字,做爲版本號,那不就衝突了嘛,好了,下面咱們來講版本回滾,準備把readme.txt回滾到「add readme.txt「的那個版本,咱們應該怎麼作?


咱們先來講一下,Git的當前是在哪一個版本,在Git中咱們用HEAD表示當前版本,也就是咱們最新提交的」749f84ccb87……ff2q6ad「,上一個版本就應該這麼表示」HEAD^「,再上一個版本就這樣表示」HEAD^^「,固然若是有幾十個版本或者1000個版本,咱們還要寫1000個^,這是不可能的,因此咱們寫成這樣HEAD~1000。好了,如今咱們就用git reset命令,將咱們的版本回退到」add readme.txt「吧,以下圖:

git reset add

你們能夠看到,咱們回到了」add readme.txt「版本中了,下面咱們再來查看一下git log,以下圖:

git log2

有個問題哦,有沒有發現咱們最後提交的那個版本不見了,如上圖。如今只有三個版本了,這說明什麼問題呢?舉個簡單的例子說明一下,就比如你從如今回到了18世界,想再回到21世界已經回不去了,那應該怎麼辦呢?只要咱們找到最新版本的commit id,我這裏新版本的commit id是」749f84ccb87……ff2q6ad「,因而就能夠回到將來的某個版本,就比如咱們知道如今的時間,就能回到如今。下面咱們來演示一下(以下圖):

git reset 2

好了,你們能夠看到咱們又回到最新版本。

假設如今你回退到某個版本中,已經關掉了Git bash。可是呢,你又後悔了,想恢復到新版本中,可是呢?你又找不到commit id了,那又該怎麼辦呢?

在Git中,咱們當時用$ git reset --hard HEAD^^^,回退到「add readme.txt」版本時,再想恢復到最新版的 「add a line distributed」 中,必須有commit id才行,這時咱們已經關閉了Git bash。在Git中提供了一個git reflog命令,是用來記錄你每一次執行的命令,下面咱們來演示一下(以下圖):

git reflog

如今咱們又能夠回去最新版了。好了,到這裏咱們的回滾版本就講解完成了。



3.工做區、提交區/暫存區(stage/index)、版本庫

work

其實呢,工做區、提交區/暫存區(stage/index)、版本庫的概念問題,從上圖中就能看的很清楚,Git與其餘版本版本控制器其中之一的不一樣之處就在於有提交區/暫存區(stage/index)的概念。下面咱們先來看一下工做區:

workdir

gitworkdir

其實呢,工做區就是咱們開發目錄了,在電腦中是可能看到的,好比咱們這裏的pro目錄,就是一個工做區。你們再來看一下,下面的兩張圖:

git .git

git .git2

你們能夠看到,工做區中有個隱藏的目錄「.git」,這個不是工做區哦,這個是Git的版本庫。

git index1

git index2

你們能夠看到,在「.git」目錄中有不少文件,其中一個重要的文件index,就是咱們說的提交區/暫存區(stage/index)。

暫存區(stage, index)是Git最重要的概念之一,理解了這個概念不少 Git命令就再也不那麼神祕了


 Git暫存區(stage或稱爲 index)是最難理解的一個設計。 在版本庫(.git)目錄下,有一個 index 文件,相信你們在上圖中已經看到了。下面咱們好好說一說他們之間關係,一樣的咱們先看一張圖:

git-stage

在上圖中,咱們能夠看到部分 Git命令是如何影響工做區和暫存區(stage/index)的。

  • 圖中左側爲工做區,右側爲版本庫。在版本庫中標記爲 "index" 的區域是暫存區(stage/index),標記爲 "master" 的是 master 分支所表明的目錄樹(關於分支問題在下面的文章中會詳解)。

  • 圖中咱們能夠看出此時 "HEAD" 實際是指向 master 分支的一個「指針」。因此,圖示的命令中出現 HEAD 的地方能夠用 master 來替換(HEAD的概念咱們在後面的文章中也會詳解)。

  • 圖中的 objects 標識的區域爲 Git 的對象庫,實際位於 ".git/objects" 目錄下,咱們會在後面的文章中將重點介紹,嘿嘿!。

  • 當對工做區新增或修改的文件執行 "git add" 命令時,暫存區的目錄樹被更新,同時工做區新增或修改的文件內容被寫入到對象庫中的一個新的對象中,而該對象的ID被記錄在暫存區的文件索引中。(如上圖)

  • 當執行提交操做 "git commit" 時,暫存區的目錄樹寫到版本庫的對象庫(objects)中,master 分支會作相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。(如上圖)

  • 當執行 "git reset HEAD" 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,可是工做區不受影響。 當執行 "git rm --cached <file>" 命令時,會直接從暫存區刪除文件,工做區則不作出改變。

  • 當執行 "git checkout ." 或者 "git checkout -- <file>" 命令時,會用暫存區所有或指定的文件替換工做區的文件。這個操做很危險,會清除工做區中未添加到暫存區的改動。

  • 當執行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令時,會用 HEAD 指向的 master 分支中的所有或者部分文件替換暫存區和以及工做區中的文件。這個命令也是極具危險性的,由於不但會清除工做區中未提交的改動,也會清除暫存區中未提交的改動。


4.修改管理

1).關於修改

Git跟蹤管理的是咱們每一次的修改(或操做),而不是文件。好比你新增了一行,這就是一個修改,刪除了一行,也是一個修改,更改了某些字符,也是一個修改,刪了一些又加了一些,也是一個修改,甚至建立一個新文件,也算一個修改。下面咱們來簡單演示一下:咱們先查看一下readme.txt文件,

modify1

下面咱們修改一下readme.txt內容,增長一行:Git rest 1.以下圖:

modify2

下面咱們用 git add 命令提交一下,以下圖:

modify3

下面咱們再修改一下readme.txt文件,以下圖:

modify4

咱們又增長一行 Git test 2. 以下圖:modify6

下面咱們提交一下,以下圖:

modify7

下面咱們再查看一下狀態,以下圖:

modify8

你們能夠看到咱們第二次沒有被提交,怎麼會這樣呢?細心的博友能夠看到咱們第二次修改後,直接執行 git commit了。沒有執行 git add 命令,前面咱們說了,當你用「git add」命令後,在工做區的第一次修改被放入暫存區,準備提交。可是,在工做區的第二次修改並無放入暫存區,因此,「git commit」只負責把暫存區的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。下面咱們用 git diff命令查看一下工做區與版本庫裏面的區別:

modify9

你們能夠從圖上看到,咱們增長 Git test 2. 尚未提交,那麼第二次修改怎麼提交呢?其實咱們再add再commit,就能夠了。以下圖:

modify10

好了,如今,你理解了Git是如何跟蹤修改的,每次修改,若是不add到暫存區,那就不會加入到commit中。那麼咱們想取消修改的版本,又該怎麼取消呢?


2).取消(撤消)修改

下面咱們來說解怎麼撤消修改,當項目比較緊,忽然出錯了,咱們想取消修改那又怎麼辦呢?以下圖:

modify11

在你要提交以前,你發現有錯誤了,應該是101。既然錯誤發現得很及時,就能夠很容易地糾正它。你能夠刪掉最後一行,手動把文件恢復到上一個版本的狀態。我先用git status查看一下,以下圖:

modify12

如上圖,Git會告訴你有個文件被修改,你有兩個選擇,一個用git add 提交到暫存區,另外一個是用git checkout能夠丟棄工做區的修改。

命令git checkout -- readme.txt意思就是,把readme.txt文件在工做區的修改所有撤銷,

這裏有兩種狀況:

  • 一種是readme.txt自修改後尚未被放到暫存區,如今撤銷修改就回到和版本庫如出一轍的狀態;

  • 另外一種是readme.txt已經添加到暫存區後,又做了修改,如今撤銷修改就回到添加到暫存區後的狀態。

總之,就是讓這個文件回到最近一次git commit或git add時的狀態。下面咱們來演示一下,以下圖:

modify13

你們能夠看一下 readme.txt文件還原到上一個版本了,

你們注意哦,git checkout -- file 命令中的「--」很重要,沒有「--」,就變成了「建立一個新分支」命令,咱們在後面的文章中將詳細講解分支管理。真是禍不單行啊,有時咱們不但程序寫錯了,還git add 到暫存區了,以下圖:

modify14

無論怎麼樣,咱們先查看一下狀態吧,以下圖:

modify15

能夠看到Git告訴咱們,用 git reset HEAD file 能夠把暫存區中的修改撤消掉,從新放回工做區,以下圖:

modify16

git reset既能夠回退版本,也能夠把工做區的某些文件替換爲版本庫中的文件。當咱們用HEAD時,表示最新的版本。咱們再用 git status 查看一下發現,如今的暫存區是乾淨的,工做區有修改。

那說明咱們撤消成功,下面咱們再執行 git checkout命令撤消工做區修改,以下圖:

modify17

好了,到這裏咱們終於撤消回來了。

假設你不但改錯了東西,還從暫存區提交到了版本庫,怎麼辦呢?

咱們能夠回退到上一個版本。不過,這是有條件的,就是你尚未把本身的本地版本庫推送到遠程。一旦你把錯誤提交推送到遠程版本庫,你就真的慘了。

下面咱們來總結一下:

  • 當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file。

  • 當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,

    第一步用命令git reset HEAD file,就回到了第1步,

    第二步按第1步進行操做,就是執行一下git checkout -- file。

  • 已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考咱們前面講解的版本回退,不過前提是沒有推送到遠程庫。

 

 

5.文件刪除

下面咱們新增長一個文件並提交到Git版本庫中,以下圖:

add index

通常咱們直接在目錄中把沒用的文件刪了,或者用rm命令刪了,

git rm

咱們在用git status 查看一下狀態,

如今咱們有兩個選擇:

一是從版本庫中刪除該文件,就 git rm 命令刪除掉並用 git commit提交,

二是刪錯了,由於版本庫裏還有因此能夠很容易的恢復。

下面咱們來演示一下狀況1:

git delete

好了,下面咱們來看一下狀況2:

git check

git rm 命令用於刪除一個文件。若是一個文件已經被提交到版本庫,那麼你永遠不用擔憂誤刪,可是要當心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容。

參考:http://freeloda.blog.51cto.com/2033581/1413506 

相關文章
相關標籤/搜索