環境:CenoOS7
深刻理解git ,使用命令行操做html
$ sudo yum install git -y $ git --version
####深刻解析Git版本控制python
在進行開發以前咱們須要對git進行簡單配置,這樣便於管理代碼,知道是那我的提交的。git
$ git config --global user.name wutengbiao $ git config --global user.email wutengbiao@sina.com $ git config --global color.ui true #設置GIT的打印顏色
實際上咱們 上面的操做,使用git config --global命令 就是對.gitconfig 進行的操做,因此能夠直接打開.gitconfig修改和直接使用命令修改是同樣的效果github
$ cat ~/.gitconfig [user] name = wutengbiao email = wutengbiao@sina.com [color] ui = true
一.建立本地庫repository
1.進入你須要進行本地化倉庫的目錄ide
$ cd /home/wtb/github/project $ git init Initialized empty Git repository in /home/wtb/github/project/.git/
以上這樣咱們就建立了一個空的Repository測試
二.克隆遠程庫ui
$ git clone https://github.com/kennethreitz/requests.git
####Day02idea
三.添加文件 和提交文件 添加文件命令行
$ git status #查看狀態 [root@bogon porject]# git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track) $ $ $ vi code.py # -*- coding:UTF-8 -*- print "hello world " print "hello world " print "hi git " $ $ git add code.py #添加文件 $ git status $ # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: code.py # [root@bogon porject]#
四.提交文件版本控制
$ git commit -m 'init commit' 不加-m 會打開vi 信息 [root@bogon porject]# git commit -m 'init commit' [master (root-commit) 5f2078a] init commit 1 file changed, 6 insertions(+) create mode 100644 code.py [root@bogon porject]# $ git status #查看狀態 $ git status # On branch master nothing to commit, working directory clean [root@bogon porject]# [root@bogon porject]# git status -s [root@bogon porject]# 沒有任何東西了
五.Git 工做流程圖
1.我先對code.py文件進行了修改,添加了一行信息,進行查看git status -s ;後面出現一個M. 2.如今把code.py git add 到了staging erea區域,進行查看git status -s ;最前面出現一個M出現. 3.如今我再次對code.py進行了修改保存,而後執行git status -s 就能夠看到兩個MM
vi code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print "hello world " print "hello world " print "hi git " print "hi git " //添加一行 $ $ git status -s //查看 M code.py $ $ git add code.py //add到 staging erea區域 $ 如今再次修改code.py文件,而後保存 //在staging erea區域進行了修改 $ $ git status -s MM code.py $ $
注意:
第一個M 表示在staging area區域作了變化
第二個M表示working Directory區域作了變化
如今我執行 git add code.py .從working directory ->添加到 staging area區域. 這個時候 在執行git status -s 命令
$ git status -s M code.py $
如今只剩下前面的一個M了
$ git commit -m 'updata' [master 4df82c2] updata 1 file changed, 2 insertions(+) $ git status -s $
到這來就表示三個文件多徹底相同了.
####Day03
1.查看working directory區域與 staging area區域 發生什麼變化 我再次修改了code.py文件,並保存以後查看
$ git status -s #查看 M list.py $ 上面看到的就是後面有一個M了,咱們working directory發生了變化,可使用git diff查看文件發生了什麼變化 $ git diff #查看究竟發生了什麼變化 $ git add list.py #add文件到staging area區域 $ git status -s #查看 M list.py $ 上面看到的就是排在第一的M了,可使用git diff查看文件發生了什麼變化 $ git diff $ 這時看不到任何變化了,表示 staging area區域 working Directory區域 徹底相同
2,查看staging area區域與history區域 發生什麼變化
$ git diff --staged $
3.查看 workingDirectory 區域與 history區域 發生什麼變化
$ git diff HEAD $ $ git diff --stat HEAD #查看 list.py | 2 +- #修改了2個地方, 1 file changed, 1 insertion(+), 1 deletion(-) 刪除一行,增長一行 $ 我如今對code.py進行了修改,而後查看 $ git diff --stat #比較 $ git status -s MM list.py $ $若是我如今進行 git commit -m 'new update' $ git commit -m 'new update' [master 08356f2] new update 1 file changed, 1 insertion(+), 1 deletion(-) $ $ git status -s M list.py 第一個M清空了,第二個M還在 $ $ git diff HEAD $ git diff --staged $
描述:
由於我在code.py添加了1行,執行:git status -s 就會看到兩個MM, 可是我沒有把他add 到staging area區域 ,而直接執行了git commit -m 'new upate' 提交到了History區域, 這個時候working directory新添加的 1行並不會直接把他放到history以前的code.py 裏面去,而是在history裏面產生新的code.py,
圖形分析:
####Day04
如何撤銷一個文件
若是一個文件git add 到了stoging area區域,如何撤銷文件.
$ git status -s M list.py $ $ git diff $ git add code.py #把code.py放到了staging erea裏面 $ $ git status -s M code.py $ ====如今我想撤銷這個操做使用git reset命令====== $ git reset code.py Unstaged changes after reset: M code.py #意思是說從history區域取出code.py 覆蓋到,stoging area區域裏面的code.py $ $ git status -s #查看 M list.py #如今又回到了原來的狀態 $
若是我想把stoging area區域裏面的code.py取出來覆蓋到working directory區域的code.py 如何操做:
$ git status # On branch master nothing to commit, working directory clean $ cat list.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hi git ' print 'hi hub' $ $ 如今我又修改了code.py這個文件 $ vi list.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hi git ' print 'hi hub' print 'one' print 'two' print 'three' $ $ git checkout code.py $ cat code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hi git ' print 'hi hub' $ 如今又回到了 原來狀態.
若是我想把history區域裏面的code.py取出來覆蓋到working directory區域的code.py 如何操做:
比方說我如今又修改了一下文件
$ vi code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world' print 'hello world' print 'hi git' print 'hi git' //添加四行 print 'hi git' print 'hi git' print 'hi git'
如今咱們來操做 ,history區域裏面的code.py取出來覆蓋到working directory區域的code.py
$ git checkout HEAD code.py $ cat code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world' print 'hello world' print 'hi git' 如今又回到了 原來狀態.
==============================================================
如何從working directory區域 直接提交到history區域:
好比我如今對代碼最了一點修改
$ vi list.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world' print 'hello world' print 'hi git' print 'welcome to git ' //添加一行 $ $ git status -s M list.py //表示working directory 區域作了修改 $ $ git commit -am 'add new code' // [master beedb07] add new code 1 file changed, 3 insertions(+) $ git status -s $ 表示咱們已經提交成功
####Day05
如何在git 中刪除文件
$ ls code.py old.py README.txt // 好比我在history區域添加了old.py $ $ git rm old.py // 如今刪除old.py rm 'old.py' $ $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: old.py # $ git status -s D old.py $ $ git commit -m 'delete old.py' [master 5642c5d] delete old.py 1 file changed, 17 deletions(-) delete mode 100644 old.py $ $ ls code.py README.txt $
好比我想刪除 stoging area區域 裏面的code.py,想保留working directory區域的code.py如何操做:
$ $ git rm --cached code.py rm 'code.py' $ $ ls code.py README.txt $ $ git status -s D code.py ?? code.py 若是咱們如今想撤銷上面這個操做,如何操做呢: $ git reset code.py //從history裏面吧code.py 覆蓋到staging erea裏面 $ git status -s $ git 裏面如何對對文件重命名,如何操做: $ $ git mv README.txt README.md $ $ ls code.py README.md $ git status -s R README.txt -> README.md $ $ git commit -m 'rename README' //提交 $ $
####day06
在開發的過程當中可能遇到不少的突發事件,好比我如今修改了code.py文件
$ vi list.py $ vi list.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world' print 'hello world' print 'hi git' print 'git study' //添加了兩行 print 'git version' $ $ git status -s M list.py //working directory 有修改 $ 如今我又修改了 README.txt 文件 $ vi README.txt abcdefghijkmn $ $ git status -s M code.py M README.txt $ 我如今對文件進行code.py add 到staging erea區域 $ git add code.py $ git status -s MM code.py M README.txt $ $ 若是在開發過程當中出現 作了不少複雜的修改,如今代碼改到一半,無法提交,沒有測試,可是以前代碼又出現了一個問題,須要緊急修改,如上問題處理 $ vi code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world' print 'hello world' print 'hi git' print 'git study' //添加了兩行 print 'git version' $ $ 咱們在這樣的狀況下就可使用git stash 來操做 $ git stash Saved working directory and index state WIP on master: 21b9a6c rename code.py HEAD is now at 21b9a6c rename code.py $ $ git status # On branch master nothing to commit, working directory clean $ 剛纔修改了不少東西,如今又恢復到了原始狀態 $ vi code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world' print 'hello world' print 'hi git' $ 這裏咱們就能夠吧須要緊急處理的代碼加進去,好比我這裏 少了兩個感嘆號 $ vi code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world !' //加上!號 print 'hello world !' print 'hi git' $ $ $ git commit -am 'quick fix' [master 7bfbb97] quick fix 1 file changed, 3 insertions(+), 1 deletion(-) $ $ 如今 修改完了以後,我須要把以前的代碼都拿處理,至關於把以前收拾代碼的抽屜打開, $ git stash list //先查看 $ $ git stash pop $ $ git status -s //查看 $ $vi code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world !' print 'hello world !' print 'hi git' print 'great ,git ' print 'git is fun' $ $ $git commit -am 'update 2 files' //提交
================================================================
####day07
history區分析
$ ls code.py REDAME.txt docs //增長了docs $ $ tree. ├── code.py ├── docs │ ├── code.html │ └── index.html └── README.txt 1 directory, 4 files $ $ git log 查看日誌,能夠看到commit的編號 $
$ $ git cat-file -t HEAD //打印HEAD的指向 commit //表示指向了commit $ $ git cat-file -p HEAD //打印HEAD的內容 tree 34ae6325e61788f961bc966d769d898a194a9bab parent 7bfbb97b720d85043c8475a3cdd559f46ee01e03 author wutengbiao <wutengbiao@sina.com> 1476977118 -0700 committer wutengbiao <wutengbiao@sina.com> 1476977118 -0700 add docs $ git cat-file -t 34ae632 tree //指向tree $ $ $ git cat-file -p 34ae63 100644 blob d5e1e2a31e03b64702fc7017bad1495c370c73ab code.py 100644 blob 23543ec40e22d3b460ce3133f91340b0d585322a README.txt 100644 blob dfsdfdfec40e22d3b460ce3133f91340b0d5853gfd docs $ $ git cat-file -p dfsdfdf 100644 blob12we34ed31e03b64702fc7017bad1495c370c73ab code.html 100644 blob 4r56r22d3b460ce3133f91340b0d585322a index.html $ $
==================================================================
tree-ish 定位對象
$ ls -A //查看隱藏文件 $ cd .git/ $ $ ll total 32 drwxr-xr-x. 2 root root 6 Oct 18 07:01 branches -rw-r--r--. 1 root root 3 Oct 21 08:45 COMMIT_EDITMSG -rw-r--r--. 1 root root 92 Oct 18 07:01 config -rw-r--r--. 1 root root 73 Oct 18 07:01 description -rw-r--r--. 1 root root 23 Oct 18 07:01 HEAD drwxr-xr-x. 2 root root 4096 Oct 18 07:01 hooks -rw-r--r--. 1 root root 367 Oct 21 08:45 index drwxr-xr-x. 2 root root 20 Oct 18 07:01 info drwxr-xr-x. 3 root root 28 Oct 18 07:43 logs drwxr-xr-x. 40 root root 4096 Oct 21 07:51 objects -rw-r--r--. 1 root root 41 Oct 20 08:14 ORIG_HEAD drwxr-xr-x. 4 root root 41 Oct 20 08:14 refs $ 查看 HEAD文件 $ cat HEAD ref: refs/heads/master $ $ tree refs/ refs/ ├── heads │ └── master ├── stash └── tags 2 directories, 2 files $ $ cat refs/heads/master b9ea1014735aae7cd0821df77e65627b7fb23af9 //哈希碼 $ $ $ git cat-file -t b9ea1014735aae7cd0821df77e65627b7fb23af9 commit $ $ git log --oneline //打印git commit 的 日誌信息 beedb07 add docs 7bfbb97 quick fix 5642c5d delete old.py 11660c4 new upate 因此咱們這個master的哈希碼就是指向beedb07 這個哈希值 $ $
$ git rev-parse HEAD //表示指向HEAD的哈希碼 b9ea1014735aae7cd0821df77e65627b7fb23af9 $ $ git rev-parse HEAD~ //表示指向第一個HEAD $ $ git rev-parse HEAD~4 //表示指向第四個HEAD $ $ $git rev-parse HEAD~4^{tree} //打印tree的哈希碼 dfdfwe43735aae7cd0821df77e65627bdfdfs $ $ git cat-file -p dfdfwe43735aae7cd0821df77e65627bdfdfs //打印到內容 $ $ $ git cat-file -p HEAD~4:code.py 或者 $ git show HEAD~4:code.py
####Day09 branch 分支
$ git branch //列出因此的brach $ * master $git branch tryideal //建立一個名爲tryideal的brach $ $git branch * master tryideal 表示當前咱們在 master branch 上. //切換branch分支 $ git checkout tryideal Switched to branch tryideal $ $ git branch master * tryideal //切換到了tryideal branch //咱們來驗證 一下是否切換到了分支tryideal分支上 $ cd .git/ $cd refs/heads $ ls master tryideal $ $cat * b9ea1014735aae7cd0821df77e65627b7fb23af9 b9ea1014735aae7cd0821df77e65627b7fb23af9 打印出來的信息徹底相同 $ cd ../ $ cat HEAD ref: refs/heads/tryideal 如今已經切換到了tryideal分支上
如圖:
若是如今咱們又想切回到master分支上
$ git checkout master //如今又切換到了master分支上 $ $cat .git/HEAD //查看 ref: refs/heads/master
咱們如何刪除分支:
$ git branch -d tryideal //刪除分支 Delete branch tryideal $ $ git branch * master $ $ ls
如何使用更簡便的方法進行建立分支和切換分支:
$ git branch * master $ git checkout -b tryideal //快速建立分支切換分支 Switched to a new branch 'tryideal' $ $ git branch master * tryideal
如今我修改一下code.py代碼
$ vi code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world !' print 'hello world !' print 'hi git' print " new ideal" $ $ git commit -am 'new idea' $ 如今我想切換回到mastrer分支 $ git checkout master //切到master分支 Switched to branch 'master' $ $git branch * master tryideal $ $ $ git checkout -b tryideal //這樣刪除 會報錯 ,不容許刪除 $ $ git merge tryideal //把tryidel新功能合併到master上面 $ 如今就能夠直接刪除 tryideal 分支 $ git branch -d tryidea delete branch tryideal $ $ git branch * master $ $
分支的合併 描述如圖:
如今如何把bugfix分支合併到master裏面去
$git branch * master $ $ git chechout -b bugfix //建立bugfix $ vi code.py //第一次修改 #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world ' //修改!號 print 'hello world ' //修改!號 print 'hi git' print 'great git ' print 'git is fun' print " new ideal" $ git commit -am 'fix 2 bugs' $ $ vi code.py //第二次修改 #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world ' print 'hello world ' print 'hi git ! ! !' //修改 print 'great git ' print 'git is fun' print " new ideal" $ $ git commit -am 'fix 1 bugs' //提交 $ // 切換到master分支上 $ $ $ git chechout master $ $vi code.py #!/usr/bin/env python # -*- coding:UTF-8 -*- print 'hello world ! ' print 'hello world ! ' print 'hi git' print 'great git ' print 'git is fun' print " new ideal" print 'yet another new feature' // master分支上新加的內容 $ $ git commit -am " updata" $ 如今就須要把 bugfix 分支的代碼合併到master分支裏面 $ $ git merge bugfix // $ $ git log //能夠看到新建立的一個新的commit,咱們的 bugfix修改的代碼就合併到了裏面 $ git branch bugfix * master $ $ 如今就能夠把bugfix 這個分支刪除. $ git branch -d bugfix //刪除 $
圖形解析以下:
1.爲了進行合併,先找到他們共同的部分c ,而後是e ,f
2.在建立g以前他先用c和f進行比較,比較完了以後建立一個pach
3.產生的pach 會應用到e上面,而後在產生g (three way merge)
經常使用的查看命令: git branch: 查看分支信息。檢查本身正工做在哪個分支 git branch –a: 查看本地和遠程的全部分支 git remote –v: 查看當前關聯的遠程庫及對應的名稱 git log: 查看提交的log信息 git status: 查看當前狀態 git remote show: 查看遠程庫的名稱