# 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" >>./file.txt
[root@laowang gitdir]# git commit -m"add one word for test"
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will becommitted)
# (use "git checkout -- <file>..." 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">>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 <file>..." 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 <[email protected]>
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" >>./file.txt
add something
# (use"git reset HEAD <file>..." to unstage)
# modified: file.txt
[root@laowang gitdir]# git reset HEAD file.txt
Unstaged changes after reset:
M file.txt
# (use"git add <file>..." to update what will be committed)
# (use"git checkout -- <file>..." 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 <file>..." 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 <name></code>
切換分支:<code>git checkout <name></code>
建立+切換分支:<code>git checkout -b <name></code>
合并某分支到目前分支:<code>git merge <name></code>
删除分支:<code>git branch -d <name></code>