Git基本應用

本章內容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

十、$ git checkout -- readme.txt

   命令git checkout -- readme.txt意思就是,把readme.txt文件在工做區的修改所有撤銷,這裏有兩種狀況:

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

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

  總之,就是讓這個文件回到最近一次git commitgit 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!

  

一、建立與合併分支

  廖雪峯Git.原理

  *建立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).
相關文章
相關標籤/搜索