本章內容git
一、倉庫的基本命令github
二、分支管理ruby
一、建立本地管理倉庫app
git initssh
二、把文件添加到倉庫學習
git add readme.txtspa
三、告訴Git,把文件提交到倉庫版本控制
git commit -m ''wrote a readme file'code
四、git status
命令可讓咱們時刻掌握倉庫當前的狀態,上面的命令告訴咱們,readme.txt被修改過了,但尚未準備提交的修改。 blog
$ git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: readme.txt # no changes added to commit (use "git add" and/or "git commit -a")
五、雖然Git告訴咱們readme.txt被修改了,但若是能看看具體修改了什麼內容,天然是很好的。好比你休假兩週從國外回來,第一天上班時,已經記不清上次怎麼修改的readme.txt,因此,須要用git diff
這個命令看看:
$ git diff readme.txt diff --git a/readme.txt b/readme.txt index 46d49bf..9247db6 100644 --- a/readme.txt +++ b/readme.txt @@ -1,2 +1,2 @@ -Git is a version control system. +Git is a distributed version control system. Git is free software.
git diff
顧名思義就是查看difference,顯示的格式正是Unix通用的diff格式,能夠從上面的命令輸出看到,咱們在第一行添加了一個「distributed」單詞。
六、在實際工做中,咱們腦子裏怎麼可能記得一個幾千行的文件每次都改了什麼內容,否則要版本控制系統幹什麼。版本控制系統確定有某個命令能夠告訴咱們歷史記錄,在Git中,咱們用git log
命令查看:
$ git log commit 3628164fb26d48395383f8f31179f24e0882e1e0 Author: Michael Liao <askxuefeng@gmail.com> Date: Tue Aug 20 15:11:49 2013 +0800 append GPL commit ea34578d5496d7dd233c827ed32a8cd576c5ee85 Author: Michael Liao <askxuefeng@gmail.com> Date: Tue Aug 20 14:53:12 2013 +0800 add distributed commit cb926e7ea50ad11b8f9e909c05226233bf755030 Author: Michael Liao <askxuefeng@gmail.com> Date: Mon Aug 19 17:51:55 2013 +0800 wrote a readme file
$ git log --pretty=oneline #輸出格式比較簡潔
$ git log --pretty=oneline
3628164fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file
七、恢復到起先的版本
$ git reset --hard 3628164 HEAD is now at 3628164 append GPL
八、你恢復到起先的版本,如今又後悔了,想恢復回來,那怎麼辦?那就必須找到append GPL的commit ID
$ git reflog ea34578 HEAD@{0}: reset: moving to HEAD^ 3628164 HEAD@{1}: commit: append GPL ea34578 HEAD@{2}: commit: add distributed cb926e7 HEAD@{3}: commit (initial): wrote a readme file
獲得這個ID 如今就能夠去恢復了。
九、工做區和暫存區的概念
十、$ git checkout -- readme.txt
命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工做區的修改所有撤銷,這裏有兩種狀況:
一種是readme.txt
自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態;
一種是readme.txt
已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。
總之,就是讓這個文件回到最近一次git commit
或git add
時的狀態。
git checkout -- file
命令中的--
很重要,沒有--
,就變成了「切換到另外一個分支」的命令
十一、用命令git reset HEAD file
能夠把暫存區的修改撤銷掉(unstage),從新放回工做區:
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
git reset
命令既能夠回退版本,也能夠把暫存區的修改回退到工做區。當咱們用HEAD
時,表示最新的版本。
再用git status
查看一下,如今暫存區是乾淨的,工做區有修改:
$ git status # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: readme.txt # no changes added to commit (use "git add" and/or "git commit -a")
還記得如何丟棄工做區的修改嗎?
$ git checkout -- readme.txt $ git status # On branch master nothing to commit (working directory clean)
十二、 git rm test.txt #從版本庫中刪除該文件
$ git rm test.txt rm 'test.txt' $ git commit -m "remove test.txt" [master d17efd8] remove test.txt 1 file changed, 1 deletion(-) delete mode 100644 test.txt
如今,文件就從版本庫中被刪除了。
另外一種狀況是刪錯了,由於版本庫裏還有呢,因此能夠很輕鬆地把誤刪的文件恢復到最新版本:
$ git checkout -- test.txt
git checkout
實際上是用版本庫裏的版本替換工做區的版本,不管工做區是修改仍是刪除,均可以「一鍵還原」。
1三、在github上建立了一個新庫,是空的,如今想把本地的庫與之關聯
git remote add origin git@github.com:帳號/learngit.git
添加後,遠程庫的名字就是origin
,這是Git默認的叫法,也能夠改爲別的,可是origin
這個名字一看就知道是遠程庫。
下一步,就能夠把本地庫的全部內容推送到遠程庫上:
$ git push -u origin master Counting objects: 19, done. Delta compression using up to 4 threads. Compressing objects: 100% (19/19), done. Writing objects: 100% (19/19), 13.73 KiB, done. Total 23 (delta 6), reused 0 (delta 0) To git@github.com:michaelliao/learngit.git * [new branch] master -> master Branch master set up to track remote branch master from origin.
把本地庫的內容推送到遠程,用git push
命令,其實是把當前分支master
推送到遠程。
因爲遠程庫是空的,咱們第一次推送master
分支時,加上了-u
參數,Git不但會把本地的master
分支內容推送的遠程新的master
分支,還會把本地的master
分支和遠程的master
分支關聯起來,在之後的推送或者拉取時就能夠簡化命令。
從如今起,只要本地做了提交,就能夠經過命令:
$ git push origin master
1四、克隆遠程庫
$ git clone git@github.com:michaelliao/gitskills.git Cloning into 'gitskills'... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Receiving objects: 100% (3/3), done.
你也許還注意到,GitHub給出的地址不止一個,還能夠用https://github.com/michaelliao/gitskills.git
這樣的地址。實際上,Git支持多種協議,默認的git://
使用ssh,但也可使用https
等其餘協議。
使用https
除了速度慢之外,還有個最大的麻煩是每次推送都必須輸入口令,可是在某些只開放http端口的公司內部就沒法使用ssh
協議而只能用https
。
分支就是科幻電影裏面的平行宇宙,當你正在電腦前努力學習Git的時候,另外一個你正在另外一個平行宇宙裏努力學習SVN。
若是兩個平行宇宙互不干擾,那對如今的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,結果,你既學會了Git又學會了SVN!
一、建立與合併分支
*建立dev分支,而後切換到dev分支:
$ git checkout -b dev Switched to a new branch 'dev' 等同於 $ git branch dev $ git checkout dev Switched to branch 'dev'
用git branch命令查看當前的分支:
$ git branch * dev master
git branch
命令會列出全部分支,當前分支前面會標一個*
號。
而後,咱們就能夠在dev
分支上正常提交,好比對readme.txt作個修改,加上一行:
$ git add readme.txt $ git commit -m "branch test" [dev fec145a] branch test 1 file changed, 1 insertion(+)
如今,dev
分支的工做完成,咱們就能夠切換回master
分支:
$ git checkout master Switched to branch 'master'
切換回master
分支後,再查看一個readme.txt文件,剛纔添加的內容不見了!由於那個提交是在dev
分支上,而master
分支此刻的提交點並無變:
如今,咱們把dev
分支的工做成果合併到master
分支上:
$ git merge dev Updating d17efd8..fec145a Fast-forward readme.txt | 1 + 1 file changed, 1 insertion(+)
git merge
命令用於合併指定分支到當前分支。
合併完成後,就能夠放心地刪除dev
分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).