天天看點

版本控制--git

# cat /etc/redhat-release

CentOS release 6.8 (Final)

# uname -r

2.6.32-642.4.2.el6.x86_64

# uname -m

x86_64

可以直接通過源碼安裝。先從Git官網下載下傳源碼,然後解壓,依次輸入:<code>./config</code>,<code>make</code>,<code>sudo make install</code>這幾個指令安裝就好了。

這裡用的是yum安裝

[root@laowang ~]# rpm -qa git

git-1.7.1-4.el6_7.1.x86_64

[root@laowang ~]# yum  install git –y

[root@laowang ~]# git --version

git version 1.7.1

什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單了解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、删除,Git都能跟蹤,以便任何時刻都可以追蹤曆史,或者在将來某個時刻可以“還原”。

是以,建立一個版本庫非常簡單,首先,選擇一個合适的地方,建立一個空目錄:

建立版本庫目錄:

[root@laowang /]# mkdir gitdir

[root@laowang /]# cd gitdir/

[root@laowang gitdir]# git init

Initialized empty Git repository in/gitdir/.git/

建立完版本庫之後會多出一個隐藏檔案

[root@laowang gitdir]# ls -a

. ..  .git

[root@laowang gitdir]# touch file.txt           建立檔案

 [root@laowang gitdir]# git add file.txt         添加到管理庫

 [root@laowang gitdir]# git commit -m "addone file dor test"      送出

[master (root-commit) d042b99] add one filedor test

 0files changed, 0 insertions(+), 0 deletions(-)

 createmode 100644 file.txt                                這裡顯示建立一個檔案

[root@laowang gitdir]# echo"test" &gt;&gt;./file.txt

[root@laowang gitdir]# git commit -m"add one word for test"

# On branch master

# Changed but not updated:

#  (use "git add &lt;file&gt;..." to update what will becommitted)

#  (use "git checkout -- &lt;file&gt;..." to discard changes inworking directory)

#

#       modified:   file.txt                                 這裡顯示修改的檔案名

no changes added to commit (use "gitadd" and/or "git commit -a")        沒有檔案送出

[root@laowang gitdir]# git status

#       modified:   file.txt

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

[root@laowang gitdir]# git diff file.txt

diff --git a/file.txt b/file.txt

index 1153985..cf19221 100644

--- a/file.txt

+++ b/file.txt

@@ -1,3 +1,3 @@

 test

 1234

-5678                                删除的内容

+789                                增加的内容

[root@laowang gitdir]# echo"0000"&gt;&gt;file.txt

index 1153985..2744a10 100644

@@ -1,3 +1,4 @@

-5678

+789

+0000

[root@laowang gitdir]# git add file.txt

# Changes to be committed:

#  (use "git reset HEAD &lt;file&gt;..." to unstage)

[root@laowang gitdir]# git commit file.txt -m"add 0000"

[master ec76b27] add 0000

 1files changed, 2 insertions(+), 1 deletions(-)

nothing to commit (working directory clean)

放我們對一個檔案進行多次修改之後,若是想檢視之前的修改記錄,光是靠回憶肯定是不靠譜的。

版本檢視

[root@laowang gitdir]# git log

commit ec76b27efc328da568f9462563848d89aaa25a54

Author: oldwang &lt;[email protected]&gt;

Date:   WedSep 21 05:07:29 2016 +0800

    add 0000

commit 0ecd6c9c3a76c7028141ddc4242dcefa5f556c44

Date:   WedSep 21 05:01:23 2016 +0800

    add somenumbel

commit d042b99b866063f7ed2594eea60d032e90402361

Date:   WedSep 21 04:42:19 2016 +0800

add one file dor test

若是嫌棄他們輸出資訊太多可以試試以下參數

[root@laowang gitdir]# git log --pretty=oneline

ec76b27efc328da568f9462563848d89aaa25a54add 0000

0ecd6c9c3a76c7028141ddc4242dcefa5f556c44add some numbel

d042b99b866063f7ed2594eea60d032e90402361add one file dor test

首先,Git必須知道目前版本是哪個版本,在Git中,用<code>HEAD</code>表示目前版本,也就是最新的送出<code>3628164...882e1e0</code>(注意我的送出ID和你的肯定不一樣),上一個版本就是<code>HEAD^</code>,上上一個版本就是<code>HEAD^^</code>,當然往上100個版本寫100個<code>^</code>比較容易數不過來,是以寫成<code>HEAD~100</code>。

現在,我們要把目前版本“appendGPL”回退到上一個版本“adddistributed”,就可以使用<code>git reset</code>指令:

[root@laowang gitdir]# git reset --hard HEAD^    回退到上一個版本

HEAD is now at 0ecd6c9 add some numbel

[root@laowang gitdir]# cat file.txt

test

1234

5678

0ecd6c9c3a76c7028141ddc4242dcefa5f556c44 add somenumbel

d042b99b866063f7ed2594eea60d032e90402361 add onefile dor test

[root@laowang gitdir]# git reset --hard 0ecd6c9c

    add some numbel

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

在Git中,總是有後悔藥可以吃的。當你用<code>$ git reset --hard HEAD^</code>回退到<code>add distributed</code>版本時,再想恢複到<code>append GPL</code>,就必須找到<code>append GPL</code>的commit id。Git提供了一個指令<code>git reflog</code>用來記錄你的每一次指令:

[root@laowang gitdir]# git reflog

0ecd6c9 HEAD@{0}: 0ecd6c9c: updating HEAD

d042b99 HEAD@{1}: HEAD^: updating HEAD

0ecd6c9 HEAD@{2}: HEAD^: updating HEAD

ec76b27 HEAD@{3}: commit: add 0000

0ecd6c9 HEAD@{4}: commit: add some numbel

  現在總結一下:

1,HEAD指向的版本就是目前版本,是以,Git允許我們在版本的曆史之間穿梭,使用指令git reset --hard commit_id。

2,穿梭前,用git log可以檢視送出曆史,以便确定要回退到哪個版本。

3,要重返未來,用git reflog檢視指令曆史,以便确定要回到未來的哪個版本。

Git的工作分為三塊:工作區、緩存區(stage)、庫(./git)

[root@laowang gitdir]# vim file.txt

zxas

i will add it to stage

i had add somethoing

[root@laowang gitdir]# git checkout -- file.txt

分兩步,第一步用指令<code>git reset HEAD file</code>,就回到了場景1,第二步git checkout -- file

[root@laowang gitdir]# echo "addsomething" &gt;&gt;./file.txt

add something

#   (use"git reset HEAD &lt;file&gt;..." to unstage)

#    modified:   file.txt

[root@laowang gitdir]# git reset HEAD file.txt

Unstaged changes after reset:

M    file.txt

#   (use"git add &lt;file&gt;..." to update what will be committed)

#   (use"git checkout -- &lt;file&gt;..." to discard changes in workingdirectory)

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

本處參考版本回退

[root@laowang gitdir]# touch test.filr

[root@laowang gitdir]# vim test.filr

[root@laowang gitdir]# git add test.filr

[root@laowang gitdir]# dit commit -m "add afile for test"

-bash: dit: command not found

[root@laowang gitdir]# git commit -m "add afile for test"

[master 121fc12] add a file for test

 1 fileschanged, 1 insertions(+), 0 deletions(-)

 create mode100644 test.filr

#   (use"git add/rm &lt;file&gt;..." to update what will be committed)

#    deleted:    test.filr

狀态告訴我們檔案删除之後我們有兩種選擇:

1、  吧删除的資料送出到版本庫

2、  吧工作區回退到緩存區(就是檔案沒被删除之前)

現在你有兩個選擇,

[root@laowang gitdir]# git checkout --test.filr

[root@laowang gitdir]# ls

file.txt test.filr

[root@laowang gitdir]# cat test.filr

test somethinhg

建立分支dev

root@laowang gitdir]# git checkout -b dev

Switched to a new branch 'dev'

git checkout指令加上-b參數表示建立并切換,相當于以下兩條指令:

git branch dev

 gitcheckout dev

Switched to branch 'dev'

[root@laowang gitdir]# git branch

* dev

  Master

[root@laowang gitdir]# git checkout master

Switched to branch 'master'

git merge dev

git merge 是合并的指令 後面接合并的分支名,表示合并dev到目前分支

在合并之後,之前的分支就可以删除了

  dev

* master

[root@laowang gitdir]# git branch -d dev

Deleted branch dev (was df323f3).

Git鼓勵大量使用分支:

檢視分支:<code>git branch</code>

建立分支:<code>git branch &lt;name&gt;</code>

切換分支:<code>git checkout &lt;name&gt;</code>

建立+切換分支:<code>git checkout -b &lt;name&gt;</code>

合并某分支到目前分支:<code>git merge &lt;name&gt;</code>

删除分支:<code>git branch -d &lt;name&gt;</code>