git基本入門

weixin_33918357發表於2016-11-21

2016.11.21


      今天是北京的初雪,說實話,作為一個鄭州人從來沒有體會過這麼冷的天,說實話,這個天願意出去陪你吃烤串的不是腦袋有泡就是腦袋有泡...

      而我,就願意這樣靜靜的敲程式碼   <( ̄ˇ ̄)/

      先給大家分享一個很早之前寫過的git,一字一句純手打!

Git是世界上最先進的分散式版本控制系統!

SVN和Git的區別:

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

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

安裝GIt

git --version 檢查版本號  出現版本號證明安裝成功

因為Git是分散式版本控制系統,所以需要填寫使用者名稱和郵箱作為一個標示

注意: git config --global 引數,有了這個引數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然你也可以對某個倉庫指定不同的使用者名稱和郵箱

git config --global user.name "Hello-ZY"  輸入自己github名字

git config --global user.email "dazhangyu147258@gmail.com"自己在github上的郵箱

操作:

一、建立版本庫。

版本庫說白了就是倉庫,可以簡單的理解為一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改,刪除,git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻還可以將檔案還原。

首先在e盤->git下目錄新建一個testgit版本庫

cd E:

cd git

mkdir testgit  建立一個資料夾

cd testgit

pwd  顯示當前的目錄

1.通過命令 git init 把這個目錄變成git可以管理的倉庫

注意:這個時候你當前的testgit目錄下回多了一個.git的目錄,這個目錄是來跟蹤管理板塊的,沒事的時候千萬不要手動亂改這個目錄下面的檔案,否則,會把git倉庫給破壞了

2.把檔案新增到版本庫中

注意:首先要明確,所有的版本控制系統,只能跟蹤文字檔案的改動,像圖片視訊之類的雖然也能由版本控制系統管理,但是沒法跟蹤檔案的變化,中能把二進位制檔案每次改動串起來,也就是說只是知道圖片從1kb變成了2kb,但到底改了什麼,版本控制也不知道,

demo演示:

首先在版本庫testgit目錄下新建一個記事本檔案readme.txt,寫上內容:11111111

第一步:使用 git add readme.txt新增到暫存區裡面去,

第二步:使用 git commit 告訴git,把檔案提交到倉庫  commit(把..交託給..)

2866313-39547fbc4d89d0d6.png

現在我們已經提交了一個readme.txt檔案了,我們可以通過命令git status來檢視是否有檔案未提交(這個時候如果出現什麼錯誤提示,最好是從頭再來)


2866313-7fc433efa0ac0949.png

這個時候我可以在文字文件中進行修改,然後在git status 檢視結果

2866313-c8fac6ae28d63c26.png

上面的命令告訴我們 zhnagyu.txt檔案已經被修改,但是未被提交的修改

如果想看哪些內容是被修改的要使用 git diff (這個時候比較的都是根據最初的檔案來比較)

知道了對zhangyu.txt檔案做了什麼修改後,我們就可以放心的提交到倉庫了,提交修改和提交檔案是一樣的兩步(第一步是git add,第二步是:git commit)

git commit-m"提交的描述資訊"

如果我們這裡不用-m引數的話,git將調到一個文字編譯器(通常是vim)來讓你輸入提交的描述資訊

2866313-01221eb19291790d.png

二、版本回退:

現在我們已經學會了修改檔案,現在繼續對zhangyu.txt檔案進行修改

2866313-1830af3b52613449.png

如果我想檢視我的歷史修改記錄,用git log

2866313-90fbd1e167f95bfe.png

git log命令顯示從最近到最遠的顯示日誌,我們可以看到最近三次提交,如果嫌上面顯示的資訊太多的話,我們可以使用git log --pretty=oneline

2866313-3a55430ed1b90bf7.png

說了這麼多,那版本回退到底怎麼做呢,有兩種方法:

a: git reset --hard HEAD^ (這是回退到上個版本,回到上上個是git reset --hard HEAD^^,依次類推)

b:如果想回到前100個版本的話,可以使用簡單命令:git reset --hard HEAD~100

2866313-6dddaab3ed60fbaa.png

再想檢視zhangyu.txt裡面的內容,通過命令cat 檢視

2866313-8c29d9e21b21e72c.png

此時我們仍舊可以檢視歷史資訊

2866313-effaea508c653c95.png

現在我想回退到最新的版本,我們可以通過版本號回退,命令: git reset --hard 版本號

但是現在的問題:假如我已經關掉過一次命令列或者是內容版本號我並不知道,可以通過如下命令獲取到版本號:git reflog

2866313-df6bba80cec0671c.png

可以看出來最後一個的版本號,那麼現在就可以恢復了  使用命令:git reset --hard ee1fc7f

2866313-e80a59a4b1f186c7.png

這個時候我們再檢視當前版本里面的內容 cat zhangyu.txt

2866313-26553a4e7a204423.png

三、理解工作區與暫存區的區別。

工作區:就是你在電腦上看到的目錄,比如目錄下testgit裡面的檔案(.git隱藏目錄版本庫除外),或者以後需要再新建的目錄檔案等等都屬於工作區範疇

版本庫:工作區有一個隱藏目錄.git,這個不屬於工作區,這是版本庫。其中版本庫中存了很多東西,其中最重要的就是stage(暫存區),還有Git為我們自動建立了第一個分之master,以及指向master的一個指標HEAD

前面我們說過使用Git提交檔案到版本庫有兩步:

第一步:是使用git add 把檔案新增進去,實際上就是把檔案新增到暫存區

第二步:使用git commit 提交修改,實際上就是把暫存區的所有內容提交到當前分支上

我們在zhangyu.txt再進行修改,接著在目錄下新建一個檔案為test.txt內容為test,線檢視狀態

2866313-b0e250b38df6fdd8.png

我們先把兩個檔案都新增到暫存區git add 再檢視狀態

2866313-5ed6b4638066a0a2.png

接著我們可以使用git commit一次性提交到分支上

2866313-8a739e1826d66677.png

每次提交到分支之後都要檢視一下當前的狀態

2866313-af1b9e5e0d0a7ae2.png

四、Git撤銷修改和刪除檔案操作

1、撤銷修改:

比如我現在又進行了檔案修改,先檢視所有內容cat zhangyu.txt,在我未提交之前,我發現有錯誤,所以我得馬上恢復以前的版本,現在我有以下幾種方法可以做修改:

a: 如果我知道我要刪掉的內容,可以手動更改去掉那些檔案,然後add到暫存區,最後commit掉

b:我還可以按照以前的方法直接恢復到上一個版本,git reset --hard HEAD^

但是現在我想換一種方法,我想直接執行撤銷命令,首先,在撤銷之前,我們可以先檢視狀態

2866313-9289787dc3749a80.png

可以發現,Git會告訴你,git checkout -- file可以丟棄工作區的修改

2866313-393f636d1af8f246.png

撤銷命令就是把檔案在工作區做的修改全部撤銷,這裡有兩種情況

a: 檔案自動修改後,還沒有放到暫存區,使用撤銷修改就會回到和版本庫一模一樣的狀態

b:另外一種就是檔案已經放到暫存區了,接著又做了修改,撤銷修改就回到新增暫存區後的狀態

對於第二種情況,我們繼續來看,假如我現在在zhangyu.txt檔案中新增一行555555555,我add之後

,接著新增內容為6666666,我想通過撤銷命令讓其回到暫存區後的狀態

2866313-09b8d65a5e69f8e6.png

注意:命令 git checkout -- zhangyu.txt 中的--很重要,如果沒有-- 的話,那麼命令就變成建立分支了

2、刪除檔案

假如我現在版本庫testgit目錄下新增一個檔案a.txt,然後提交

2866313-c8454af087348d22.png

如果我想徹底從版本庫中刪除此檔案的話,可以再執行commit命令提交掉

五、遠端倉庫

在瞭解之前,先要註冊github賬號,由於你的本地Git倉庫和github倉庫之間的傳輸是通過SSH加密的,所以需要一點設定:

第一步:建立SSH Key. 在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案,如果有的話,直接跳過此如下命令,如果沒有,開啟命令列,輸入命令:

ssh-keygen -t rsa -C "dazhangyu147258@gmail.com"

輸入密碼。再次輸入密碼,然後會生成一個圖

id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

第二步:

通過配置祕鑰輸入ssh-keygen -t rsa -C "dazhangyu147258@gmail.com"

兩次回車 分別出現兩次輸密碼的情況,輸入的時候是不顯示密碼的,兩次輸密碼的情況分別是 是passphrase處和passphrase agin處。

此時在C盤的user中出現一個.ssh資料夾,此檔案中有個.pub檔案  開啟,其中除了最後郵箱部分外,為整個祕鑰地址。

登入github 開啟settings 中的SSH Keys介面,然後點選SSH and GPG keys”再點選New SSH key ,填上任意title,在Key文字框裡黏貼id_rsa.pub檔案的內容。

幾分鐘後繫結的郵箱會收到一個關於key的確認,點選即可

第三步: 連結github網站,輸入 ssh -Tgit@github.com

2866313-56a0078ad9726734.png

出現yes/no  輸入yes

2866313-e3f134c43b0b6c87.png

然後在rsa之後直接輸入密碼即可,顯示如上,就證明成功 重新整理SSHkeys頁面,key變為綠色,金鑰配置成功!!!

1.如何新增遠端庫

現在我們已經在本地建立了一個Git倉庫,又想在github建立一個Git倉庫,並且希望這兩個倉庫遠端同步,這樣github的倉庫可以作為備份,又可以其他人通過該倉庫來協作

首先,登入github上,然後在右上角找到“create a new repo”建立一個新的倉庫。如下:

2866313-e04e9bdaeda0ea1f.png
2866313-89c2f572e31ac364.png

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

現在,我們根據GitHub的提示,在本地的testgit倉庫下執行命令:

git remote add origin https://github.com/Hello-ZY/testgit.git

2866313-258cbfacc76e804a.png

把本地庫的內容推送到遠端,使用 git push命令,實際上是把當前分支master推送到遠端。

由於遠端庫是空的,我們第一次推送master分支時,加上了-u引數,Git不但會把本地的master分支內容推送到遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。推送成功後,可以立即在github頁面中看到遠端庫的內容已經和本地一模一樣了,上面的要輸入github的使用者名稱和密碼:

2866313-5894b2df1ad79849.png

從現在起,只要本地做了提交,就可以通過如下命令:git push origin master

把本地master分支的最新修改推送到github上了,現在你就擁有了真正的分散式版本庫了。

2.如何從遠端庫克隆?

上面我們瞭解到先有本地庫,再有遠端庫,以及如何關聯遠端庫

現在我們想,假如遠端庫有新的內容了,我想克隆島本地來,該如何克隆呢

首先,登入github,建立一個新的倉庫,名字叫testgit2.如下:

2866313-d5a6760a3a048f65.png
2866313-6303d11af3e4db10.png

現在,遠端庫已經準備好了,下一步是使用命令git clone克隆一個本地庫了。如下所示:

2866313-6c916cb5c9508e36.png

接著那你的資料夾下就會生成一個testgit2資料夾

2866313-1c49479a92bd8e43.png

六:建立與合併分支。

在  版本回填退裡,你已經知道,每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git裡,這個分支叫主分支,即master分支。HEAD嚴格來說

不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。

首先,我們來建立dev分支,然後切換到dev分支上

2866313-4ca2bc301c2ee670.png

git checkout 命令加上 –b參數列示建立並切換,相當於如下2條命令

git branch dev

git checkout dev

git branch 檢視分支,會列出所有的分支,當前分支前面會新增一個星號。然後我們在dev分支上繼續做demo,比如現在在zhangyu.txt上再增加一行6666666

2866313-bdfb2b0f7212e4ce.png

然後add 和commit

2866313-5b46a370963f26ab.png

現在dev分支工作已完成,現在我們切換到主分支master上,繼續檢視zhangyu.txt內容

2866313-f3655a2a151f8bec.png

現在我們可以把dev分支上的內容合併到分支master上了,可以在master分支上,使用如下命令 git merge dev

2866313-69dfc6cc60f7e296.png

git merge命令用於合併指定分支到當前分支上,合併後,再檢視zhangyu.txt內容,可以看到,和dev分支最新提交的是完全一樣的。

注意到上面的Fast-forward資訊,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。

合併完成後,我們可以接著刪除dev分支了,操作如下:

2866313-af38b9bca5119623.png

總結建立與合併分支命令如下:

檢視分支:git branch

建立分支:git branch name

切換分支:git checkout name

建立+切換分支:git checkout –b name

合併某分支到當前分支:git merge name

刪除分支:git branch –d name

1、如何解決衝突?

下面我們還是一步一步來,先新建一個新分支,比如名字叫fenzhi1,在zhangyu.txt新增777777,然後提交

2866313-4e2a1a1253f7d595.png
2866313-4996be26a755fd5d.png

現在我們需要在master分支上來合併fenzhi1

Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,其中<<>>>>fenzhi1 是指fenzhi1上修改的內容,我們可以修改如下後儲存:

2866313-00baa60dfa1a7e6b.png

如果我想檢視分支合併的情況的話,需要使用命令 git log.命令列演示如下:

2866313-ac53aa4db40f4e8c.png

3.分支管理策略。

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

建立一個dev分支。

修改readme.txt內容。

新增到暫存區。

切換回主分支(master)。

合併dev分支,使用命令 git merge –no-ff  -m “註釋” dev

檢視歷史記錄