Git使用教程git
一:Git是什麼?github
Git是目前世界上最早進的分佈式版本控制系統。windows
二:SVN與Git的最主要的區別?服務器
SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此首先要從中央服務器哪裏獲得最新的版本,而後幹活,幹完後,須要把本身作完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工做,若是在局域網還能夠,帶寬夠大,速度夠快,若是在互聯網下,若是網速慢的話,就納悶了。app
Git是分佈式版本控制系統,那麼它就沒有中央服務器的,每一個人的電腦就是一個完整的版本庫,這樣,工做的時候就不須要聯網了,由於版本都是在本身的電腦上。既然每一個人的電腦都有一個完整的版本庫,那多我的如何協做呢?好比說本身在電腦上改了文件A,其餘人也在電腦上改了文件A,這時,大家兩之間只需把各自的修改推送給對方,就能夠互相看到對方的修改了。ssh
三:在windows上如何安裝Git?分佈式
msysgit是 windows版的Git,以下:加密
須要從網上下載一個,而後進行默認安裝便可。安裝完成後,在開始菜單裏面找到 "Git --> Git Bash",以下:spa
會彈出一個相似的命令窗口的東西,就說明Git安裝成功。以下:.net
安裝完成後,還須要最後一步設置,在命令行輸入以下:
由於Git是分佈式版本控制系統,因此須要填寫用戶名和郵箱做爲一個標識。
注意:git config --global 參數,有了這個參數,表示你這臺機器上全部的Git倉庫都會使用這個配置,固然你也能夠對某個倉庫指定的不一樣的用戶名和郵箱。
四:如何操做?
一:建立版本庫。
什麼是版本庫?版本庫又名倉庫,英文名repository,你能夠簡單的理解一個目錄,這個目錄裏面的全部文件均可以被Git管理起來,每一個文件的修改,刪除,Git都能跟蹤,以便任什麼時候刻均可以追蹤歷史,或者在未來某個時刻還能夠將文件」還原」。
因此建立一個版本庫也很是簡單,以下我是D盤 –> www下 目錄下新建一個testgit版本庫。
pwd 命令是用於顯示當前的目錄。
1. 經過命令 git init 把這個目錄變成git能夠管理的倉庫,以下:
這時候你當前testgit目錄下會多了一個.git的目錄,這個目錄是Git來跟蹤管理版本的,沒事千萬不要手動亂改這個目錄裏面的文件,不然,會把git倉庫給破壞了。以下:
2. 把文件添加到版本庫中。
首先要明確下,全部的版本控制系統,只能跟蹤文本文件的改動,好比txt文件,網頁,全部程序的代碼等,Git也不列外,版本控制系統能夠告訴你每次的改動,可是圖片,視頻這些二進制文件,雖能也能由版本控制系統管理,但無法跟蹤文件的變化,只能把二進制文件每次改動串起來,也就是知道圖片從1kb變成2kb,可是到底改了啥,版本控制也不知道。
下面先看下demo以下演示:
我在版本庫testgit目錄下新建一個記事本文件 readme.txt 內容以下:11111111
第一步:使用命令 git add readme.txt添加到暫存區裏面去。以下:
若是和上面同樣,沒有任何提示,說明已經添加成功了。
第二步:用命令 git commit告訴Git,把文件提交到倉庫。
如今咱們已經提交了一個readme.txt文件了,咱們下面能夠經過命令git status來查看是否還有文件未提交,以下:
說明沒有任何文件未提交,可是我如今繼續來改下readme.txt內容,好比我在下面添加一行2222222222內容,繼續使用git status來查看下結果,以下:
上面的命令告訴咱們 readme.txt文件已被修改,可是未被提交的修改。
接下來我想看下readme.txt文件到底改了什麼內容,如何查看呢?可使用以下命令:
git diff readme.txt 以下:
如上能夠看到,readme.txt文件內容從一行11111111改爲 二行 添加了一行22222222內容。
知道了對readme.txt文件作了什麼修改後,咱們能夠放心的提交到倉庫了,提交修改和提交文件是同樣的2步(第一步是git add 第二步是:git commit)。
以下:
二:版本回退:
如上,咱們已經學會了修改文件,如今我繼續對readme.txt文件進行修改,再增長一行
內容爲33333333333333.繼續執行命令以下:
如今我已經對readme.txt文件作了三次修改了,那麼我如今想查看下歷史記錄,如何查呢?咱們如今可使用命令 git log 演示以下所示:
git log命令顯示從最近到最遠的顯示日誌,咱們能夠看到最近三次提交,最近的一次是,增長內容爲333333.上一次是添加內容222222,第一次默認是 111111.若是嫌上面顯示的信息太多的話,咱們可使用命令 git log –pretty=oneline 演示以下:
如今我想使用版本回退操做,我想把當前的版本回退到上一個版本,要使用什麼命令呢?可使用以下2種命令,第一種是:git reset --hard HEAD^ 那麼若是要回退到上上個版本只需把HEAD^ 改爲 HEAD^^ 以此類推。那若是要回退到前100個版本的話,使用上面的方法確定不方便,咱們可使用下面的簡便命令操做:git reset --hard HEAD~100 便可。未回退以前的readme.txt內容以下:
若是想回退到上一個版本的命令以下操做:
再來查看下 readme.txt內容以下:經過命令cat readme.txt查看
能夠看到,內容已經回退到上一個版本了。咱們能夠繼續使用git log 來查看下歷史記錄信息,以下:
咱們看到 增長333333 內容咱們沒有看到了,可是如今我想回退到最新的版本,如:有333333的內容要如何恢復呢?咱們能夠經過版本號回退,使用命令方法以下:
git reset --hard 版本號 ,可是如今的問題假如我已經關掉過一次命令行或者333內容的版本號我並不知道呢?要如何知道增長3333內容的版本號呢?能夠經過以下命令便可獲取到版本號:git reflog 演示以下:
經過上面的顯示咱們能夠知道,增長內容3333的版本號是 6fcfc89.咱們如今能夠命令
git reset --hard 6fcfc89來恢復了。演示以下:
能夠看到 目前已是最新的版本了。
三:理解工做區與暫存區的區別?
工做區:就是你在電腦上看到的目錄,好比目錄下testgit裏的文件(.git隱藏目錄版本庫除外)。或者之後須要再新建的目錄文件等等都屬於工做區範疇。
版本庫(Repository):工做區有一個隱藏目錄.git,這個不屬於工做區,這是版本庫。其中版本庫裏面存了不少東西,其中最重要的就是stage(暫存區),還有Git爲咱們自動建立了第一個分支master,以及指向master的一個指針HEAD。
咱們前面說過使用Git提交文件到版本庫有兩步:
第一步:是使用 git add 把文件添加進去,實際上就是把文件添加到暫存區。
第二步:使用git commit提交更改,實際上就是把暫存區的全部內容提交到當前分支上。
咱們繼續使用demo來演示下:
咱們在readme.txt再添加一行內容爲4444444,接着在目錄下新建一個文件爲test.txt 內容爲test,咱們先用命令 git status來查看下狀態,以下:
如今咱們先使用git add 命令把2個文件都添加到暫存區中,再使用git status來查看下狀態,以下:
接着咱們可使用git commit一次性提交到分支上,以下:
四:Git撤銷修改和刪除文件操做。
一:撤銷修改:
好比我如今在readme.txt文件裏面增長一行 內容爲555555555555,咱們先經過命令查看以下:
在我未提交以前,我發現添加5555555555555內容有誤,因此我得立刻恢復之前的版本,如今我能夠有以下幾種方法能夠作修改:
第一:若是我知道要刪掉那些內容的話,直接手動更改去掉那些須要的文件,而後add添加到暫存區,最後commit掉。
第二:我能夠按之前的方法直接恢復到上一個版本。使用 git reset --hard HEAD^
可是如今我不想使用上面的2種方法,我想直接想使用撤銷命令該如何操做呢?首先在作撤銷以前,咱們能夠先用 git status 查看下當前的狀態。以下所示:
能夠發現,Git會告訴你,git checkout -- file 能夠丟棄工做區的修改,以下命令:
git checkout -- readme.txt,以下所示:
命令 git checkout --readme.txt 意思就是,把readme.txt文件在工做區作的修改所有撤銷,這裏有2種狀況,以下:
對於第二種狀況,我想咱們繼續作demo來看下,假如如今我對readme.txt添加一行 內容爲6666666666666,我git add 增長到暫存區後,接着添加內容7777777,我想經過撤銷命令讓其回到暫存區後的狀態。以下所示:
注意:命令git checkout -- readme.txt 中的 -- 很重要,若是沒有 -- 的話,那麼命令變成建立分支了。
二:刪除文件。
假如我如今版本庫testgit目錄添加一個文件b.txt,而後提交。以下:
如上:通常狀況下,能夠直接在文件目錄中把文件刪了,或者使用如上rm命令:rm b.txt ,若是我想完全從版本庫中刪掉了此文件的話,能夠再執行commit命令 提交掉,如今目錄是這樣的,
只要沒有commit以前,若是我想在版本庫中恢復此文件如何操做呢?
可使用以下命令 git checkout -- b.txt,以下所示:
再來看看咱們testgit目錄,添加了3個文件了。以下所示:
五:遠程倉庫。
在瞭解以前,先註冊github帳號,因爲你的本地Git倉庫和github倉庫之間的傳輸是經過SSH加密的,因此須要一點設置:
第一步:建立SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,若是有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,若是有的話,直接跳過此以下命令,若是沒有的話,打開命令行,輸入以下命令:
ssh-keygen -t rsa –C 「youremail@example.com」, 因爲我本地此前運行過一次,因此本地有,以下所示:
id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,能夠放心地告訴任何人。
第二步:登陸github,打開」 settings」中的SSH Keys頁面,而後點擊「Add SSH Key」,填上任意title,在Key文本框裏黏貼id_rsa.pub文件的內容。
點擊 Add Key,你就應該能夠看到已經添加的key。
如今的情景是:咱們已經在本地建立了一個Git倉庫後,又想在github建立一個Git倉庫,而且但願這兩個倉庫進行遠程同步,這樣github的倉庫能夠做爲備份,又能夠其餘人經過該倉庫來協做。
首先,登陸github上,而後在右上角找到「create a new repo」建立一個新的倉庫。以下:
在Repository name填入testgit
,其餘保持默認設置,點擊「Create repository」按鈕,就成功地建立了一個新的Git倉庫:
目前,在GitHub上的這個testgit
倉庫仍是空的,GitHub告訴咱們,能夠從這個倉庫克隆出新的倉庫,也能夠把一個已有的本地倉庫與之關聯,而後,把本地倉庫的內容推送到GitHub倉庫。
如今,咱們根據GitHub的提示,在本地的testgit
倉庫下運行命令:
git remote add origin https://github.com/tugenhua0707/testgit.git
全部的以下:
把本地庫的內容推送到遠程,使用 git push命令,其實是把當前分支master推送到遠程。
因爲遠程庫是空的,咱們第一次推送master分支時,加上了 –u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在之後的推送或者拉取時就能夠簡化命令。推送成功後,能夠馬上在github頁面中看到遠程庫的內容已經和本地如出一轍了,上面的要輸入github的用戶名和密碼以下所示:
從如今起,只要本地做了提交,就能夠經過以下命令:
git push origin master
把本地master分支的最新修改推送到github上了,如今你就擁有了真正的分佈式版本庫了。
2. 如何從遠程庫克隆?
上面咱們瞭解了先有本地庫,後有遠程庫時候,如何關聯遠程庫。
如今咱們想,假如遠程庫有新的內容了,我想克隆到本地來 如何克隆呢?
首先,登陸github,建立一個新的倉庫,名字叫testgit2.以下:
以下,咱們看到:
如今,遠程庫已經準備好了,下一步是使用命令git clone克隆一個本地庫了。以下所示:
接着在我本地目錄下 生成testgit2目錄了,以下所示:
六:建立與合併分支。
在 版本回填退裏,你已經知道,每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git裏,這個分支叫主分支,即master分支。HEAD嚴格來講不是指向提交,而是指向master,master纔是指向提交的,因此,HEAD指向的就是當前分支。
首先,咱們來建立dev分支,而後切換到dev分支上。以下操做:
git checkout 命令加上 –b參數表示建立並切換,至關於以下2條命令
git branch dev
git checkout dev
git branch查看分支,會列出全部的分支,當前分支前面會添加一個星號。而後咱們在dev分支上繼續作demo,好比咱們如今在readme.txt再增長一行 7777777777777
首先咱們先來查看下readme.txt內容,接着添加內容77777777,以下:
如今dev分支工做已完成,如今咱們切換到主分支master上,繼續查看readme.txt內容以下:
如今咱們能夠把dev分支上的內容合併到分支master上了,能夠在master分支上,使用以下命令 git merge dev 以下所示:
git merge命令用於合併指定分支到當前分支上,合併後,再查看readme.txt內容,能夠看到,和dev分支最新提交的是徹底同樣的。
注意到上面的Fast-forward信息,Git告訴咱們,此次合併是「快進模式」,也就是直接把master指向dev的當前提交,因此合併速度很是快。
合併完成後,咱們能夠接着刪除dev分支了,操做以下:
總結建立與合併分支命令以下:
查看分支:git branch
建立分支:git branch name
切換分支:git checkout name
建立+切換分支:git checkout –b name
合併某分支到當前分支:git merge name
刪除分支:git branch –d name
下面咱們仍是一步一步來,先新建一個新分支,好比名字叫fenzhi1,在readme.txt添加一行內容8888888,而後提交,以下所示:
一樣,咱們如今切換到master分支上來,也在最後一行添加內容,內容爲99999999,以下所示:
如今咱們須要在master分支上來合併fenzhi1,以下操做:
Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容,其中<<<HEAD是指主分支修改的內容,>>>>>fenzhi1 是指fenzhi1上修改的內容,咱們能夠修改下以下後保存:
若是我想查看分支合併的狀況的話,須要使用命令 git log.命令行演示以下:
3.分支管理策略。
一般合併分支時,git通常使用」Fast forward」模式,在這種模式下,刪除分支後,會丟掉分支信息,如今咱們來使用帶參數 –no-ff來禁用」Fast forward」模式。首先咱們來作demo演示下:
截圖以下:
分支策略:首先master主分支應該是很是穩定的,也就是用來發布新版本,通常狀況下不容許在上面幹活,幹活通常狀況下在新建的dev分支上幹活,幹完後,好比上要發佈,或者說dev分支代碼穩定後能夠合併到主分支master上來。
七:bug分支:
在開發中,會常常碰到bug問題,那麼有了bug就須要修復,在Git中,分支是很強大的,每一個bug均可以經過一個臨時分支來修復,修復完成後,合併分支,而後將臨時的分支刪除掉。
好比我在開發中接到一個404 bug時候,咱們能夠建立一個404分支來修復它,可是,當前的dev分支上的工做尚未提交。好比以下:
並非我不想提交,而是工做進行到一半時候,咱們還沒法提交,好比我這個分支bug要2天完成,可是我issue-404 bug須要5個小時內完成。怎麼辦呢?還好,Git還提供了一個stash功能,能夠把當前工做現場 」隱藏起來」,等之後恢復現場後繼續工做。以下:
因此如今我能夠經過建立issue-404分支來修復bug了。
首先咱們要肯定在那個分支上修復bug,好比我如今是在主分支master上來修復的,如今我要在master分支上建立一個臨時分支,演示以下:
修復完成後,切換到master分支上,並完成合並,最後刪除issue-404分支。演示以下:
如今,咱們回到dev分支上幹活了。
工做區是乾淨的,那麼咱們工做現場去哪裏呢?咱們可使用命令 git stash list來查看下。以下:
工做現場還在,Git把stash內容存在某個地方了,可是須要恢復一下,可使用以下2個方法:
演示以下
八:多人協做。
當你從遠程庫克隆時候,實際上Git自動把本地的master分支和遠程的master分支對應起來了,而且遠程庫的默認名稱是origin。
以下演示:
一:推送分支:
推送分支就是把該分支上全部本地提交到遠程庫中,推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上:
使用命令 git push origin master
好比我如今的github上的readme.txt代碼以下:
本地的readme.txt代碼以下:
如今我想把本地更新的readme.txt代碼推送到遠程庫中,使用命令以下:
咱們能夠看到如上,推送成功,咱們能夠繼續來截圖github上的readme.txt內容 以下:
能夠看到 推送成功了,若是咱們如今要推送到其餘分支,好比dev分支上,咱們仍是那個命令 git push origin dev
那麼通常狀況下,那些分支要推送呢?
二:抓取分支:
多人協做時,你們都會往master分支上推送各自的修改。如今咱們能夠模擬另一個同事,能夠在另外一臺電腦上(注意要把SSH key添加到github上)或者同一臺電腦上另一個目錄克隆,新建一個目錄名字叫testgit2
可是我首先要把dev分支也要推送到遠程去,以下
接着進入testgit2目錄,進行克隆遠程的庫到本地來,以下:
如今目錄下生成有以下所示:
如今咱們的小夥伴要在dev分支上作開發,就必須把遠程的origin的dev分支到本地來,因而可使用命令建立本地dev分支:git checkout –b dev origin/dev
如今小夥伴們就能夠在dev分支上作開發了,開發完成後把dev分支推送到遠程庫時。
以下:
小夥伴們已經向origin/dev分支上推送了提交,而我在個人目錄文件下也對一樣的文件同個地方做了修改,也試圖推送到遠程庫時,以下:
由上面可知:推送失敗,由於個人小夥伴最新提交的和我試圖推送的有衝突,解決的辦法也很簡單,上面已經提示咱們,先用git pull把最新的提交從origin/dev抓下來,而後在本地合併,解決衝突,再推送。
git pull也失敗了,緣由是沒有指定本地dev分支與遠程origin/dev分支的連接,根據提示,設置dev和origin/dev的連接:以下:
這回git pull成功,可是合併有衝突,須要手動解決,解決的方法和分支管理中的 解決衝突徹底同樣。解決後,提交,再push:
咱們能夠先來看看readme.txt內容了。
如今手動已經解決完了,我接在須要再提交,再push到遠程庫裏面去。以下所示:
所以:多人協做工做模式通常是這樣的:
Git基本經常使用命令以下:
mkdir: XX (建立一個空目錄 XX指目錄名)
pwd: 顯示當前目錄的路徑。
git init 把當前的目錄變成能夠管理的git倉庫,生成隱藏.git文件。
git add XX 把xx文件添加到暫存區去。
git commit –m 「XX」 提交文件 –m 後面的是註釋。
git status 查看倉庫狀態
git diff XX 查看XX文件修改了那些內容
git log 查看歷史記錄
git reset --hard HEAD^ 或者 git reset --hard HEAD~ 回退到上一個版本
(若是想回退到100個版本,使用git reset –hard HEAD~100 )
cat XX 查看XX文件內容
git reflog 查看歷史記錄的版本號id
git checkout -- XX 把XX文件在工做區的修改所有撤銷。
git rm XX 刪除XX文件
git remote add origin https://github.com/tugenhua0707/testgit 關聯一個遠程庫
git push –u(第一次要用-u 之後不須要) origin master 把當前master分支推送到遠程庫
git clone https://github.com/tugenhua0707/testgit 從遠程庫中克隆
git checkout –b dev 建立dev分支 並切換到dev分支上
git branch 查看當前全部的分支
git checkout master 切換回master分支
git merge dev 在當前的分支上合併dev分支
git branch –d dev 刪除dev分支
git branch name 建立分支
git stash 把當前的工做隱藏起來 等之後恢復現場後繼續工做
git stash list 查看全部被隱藏的文件列表
git stash apply 恢復被隱藏的文件,可是內容不刪除
git stash drop 刪除文件
git stash pop 恢復文件的同時 也刪除文件
git remote 查看遠程庫的信息
git remote –v 查看遠程庫的詳細信息
git push origin master Git會把master分支推送到遠程庫對應的遠程分支上