天天看點

手把手git

一:Git是什麼?

       Git是目前世界上最先進的分布式版本控制系統。

二:SVN與Git的最主要的差別?

      SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而幹活的時候,用的都是自己的電腦,是以首先要從中央伺服器哪裡得到最新的版本,然後幹活,幹完後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,如果在區域網路還可以,帶寬夠大,速度夠快,如果在網際網路下,如果網速慢的話,就納悶了。

      Git是分布式版本控制系統,那麼它就沒有中央伺服器的,每個人的電腦就是一個完整的版本庫,這樣,工作的時候就不需要聯網了,因為版本都是在自己的電腦上。既然每個人的電腦都有一個完整的版本庫,那多個人如何協作呢?比如說自己在電腦上改了檔案A,其他人也在電腦上改了檔案A,這時,你們兩之間隻需把各自的修改推送給對方,就可以互相看到對方的修改了。

三:在windows上如何安裝Git?

      msysgit是 windows版的Git,如下:

 需要從網上下載下傳一個,然後進行預設安裝即可。安裝完成後,在開始菜單裡面找到 “Git –> Git Bash”,如下:

會彈出一個類似的指令視窗的東西,就說明Git安裝成功。如下:

安裝完成後,還需要最後一步設定,在指令行輸入如下:

  因為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種情況,如下:

readme.txt自動修改後,還沒有放到暫存區,使用 撤銷修改就回到和版本庫一模一樣的狀态。

另外一種是readme.txt已經放入暫存區了,接着又作了修改,撤銷修改就回到添加暫存區後的狀态。

對于第二種情況,我想我們繼續做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 “[email protected]”, 由于我本地此前運作過一次,是以本地有,如下所示:

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填入<code>testgit</code>,其他保持預設設定,點選“Create repository”按鈕,就成功地建立了一個新的Git倉庫:

    目前,在GitHub上的這個<code>testgit</code>倉庫還是空的,GitHub告訴我們,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯,然後,把本地倉庫的内容推送到GitHub倉庫。

現在,我們根據GitHub的提示,在本地的<code>testgit</code>倉庫下運作指令:

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用&lt;&lt;&lt;&lt;&lt;&lt;&lt;,=======,&gt;&gt;&gt;&gt;&gt;&gt;&gt;标記出不同分支的内容,其中&lt;&lt;&lt;HEAD是指主分支修改的内容,&gt;&gt;&gt;&gt;&gt;fenzhi1 是指fenzhi1上修改的内容,我們可以修改下如下後儲存:

如果我想檢視分支合并的情況的話,需要使用指令 git log.指令行示範如下:

    3.分支管理政策。

      通常合并分支時,git一般使用”Fast forward”模式,在這種模式下,删除分支後,會丢掉分支資訊,現在我們來使用帶參數 –no-ff來禁用”Fast forward”模式。首先我們來做demo示範下:

建立一個dev分支。

修改readme.txt内容。

添加到暫存區。

切換回主分支(master)。

合并dev分支,使用指令 git merge –no-ff  -m “注釋” dev

檢視曆史記錄

截圖如下:

分支政策:首先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 stash apply恢複,恢複後,stash内容并不删除,你需要使用指令git stash drop來删除。

另一種方式是使用git stash pop,恢複的同時把stash内容也删除了。

         示範如下

八:多人協作。

當你從遠端庫克隆時候,實際上Git自動把本地的master分支和遠端的master分支對應起來了,并且遠端庫的預設名稱是origin。

要檢視遠端庫的資訊 使用 git remote

要檢視遠端庫的詳細資訊 使用 git remote –v

如下示範:

一:推送分支:

      推送分支就是把該分支上所有本地送出到遠端庫中,推送時,要指定本地分支,這樣,Git就會把該分支推送到遠端庫對應的遠端分支上:

      使用指令 git push origin master

比如我現在的github上的readme.txt代碼如下:

本地的readme.txt代碼如下:

現在我想把本地更新的readme.txt代碼推送到遠端庫中,使用指令如下:

我們可以看到如上,推送成功,我們可以繼續來截圖github上的readme.txt内容 如下:

可以看到 推送成功了,如果我們現在要推送到其他分支,比如dev分支上,我們還是那個指令 git push origin dev

那麼一般情況下,那些分支要推送呢?

master分支是主分支,是以要時刻與遠端同步。

一些修複bug分支不需要推送到遠端去,可以先合并到主分支上,然後把主分支master推送到遠端去。

二:抓取分支:

多人協作時,大家都會往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 push origin branch-name推送自己的修改.

如果推送失敗,則因為遠端分支比你的本地更新早,需要先用git pull試圖合并。

如果合并有沖突,則需要解決沖突,并在本地送出。再用git push origin branch-name推送。

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 push –u(第一次要用-u 以後不需要) origin master 把目前master分支推送到遠端庫

   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分支推送到遠端庫對應的遠端分支上

      本文轉自Ansue  51CTO部落格,原文連結:http://blog.51cto.com/ansue/1734220,如需轉載請自行聯系原作者