Git實用教程

Git實用教程

這篇文章主要演示怎樣使用git提交代碼到遠程倉庫,以及在工作中經常遇到的問題,比如衝突、版本回退等。

 

前提準備:

git的下載以及安裝

官網: http://git-scm.com/

下載好後就可以安裝git了,具體的安裝和配置過程就不展示了。

 

 

 

先演示一下使用git提交代碼到遠程倉庫的流程:

第一步:首先,在github上面創建一個遠程倉庫

可以看到,我的倉庫名稱是“demo”

創建好以後,github會跳轉到另一個頁面,這個頁面的地址下面將會用到

 

 

 

 

 

 

第二步:把github上剛創建的倉庫下載到本地

首先,在本地新建一個文件夾,這裏我取名爲“myDemo”,進入到該文件夾,

單擊鼠標右鍵,選擇“Git Bash Here”選項,然後可以看到git的命令窗口,接着,使用git clone +倉庫地址,倉庫地址就是上面截圖的網站地址

在這裏則是 git clonehttps://github.com/suhuixiao/demo

然後可以看到,這個倉庫就被下載到本地了。

 

 

 

 

 

 

第三步:配置用戶信息

第一個要配置的是你個人的用戶名稱和電子郵件地址。這兩條配置很重要,每次 Git 提交時都會引用這兩條信息,說明是誰提交了更新,所以會隨更新內容一起被永久納入歷史記錄

我們提交代碼後使用git log查看時便可以看到上面附加了我們的這些信息

配置代碼指令:

gitconfig --global user.name "Your Name"

gitconfig --global user.email "your_email"

 

 

 

 

第四步:提交我們的代碼

我在demo裏面新建了1.html,假設這是我們寫好的代碼文件,怎麼提交代碼到遠程倉庫(也就是github)呢?

主要分三個步驟:
cd命令進入到demo目錄,

①  用git add把文件添加進去,實際上就是把文件修改添加到暫存區;

②  用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

因爲我們創建Git版本庫時,Git自動爲我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。

你可以簡單理解爲,需要提交的文件修改通通放到暫存區,然後,一次性提交暫存區的所有修改。

在commit後,我們可以使用git log查看提交歷史。

③  用git push把本地的修改推送到遠程倉庫

 

現在,本地的修改就推送到遠程倉庫去了,遠程倉庫裏多了一個1.html的文件,看下圖:

 

 

 

這個流程就是一般的流程,當然,實際上的操作並非這麼簡單,下面操作實際中常見的問題

 

 

問題一:衝突

衝突是怎麼產生的?先做一個實例

我在本地上創建兩個文件夾,一個是myDemo1、一個是myDemo2,分別下載倉庫到這兩個文件夾內

 

先看一下遠程倉庫原本的代碼文件以及文件所寫的代碼:

 

 

 

 

 

myDemo1文件夾修改1.html文件的代碼:

 

 

 

 

提交修改,推送到遠程倉庫:

 

 

 

 

OK,那麼遠程倉庫1.html文件的代碼更新了,然後,我們再修改myDemo2文件夾中1.html文件的代碼:

 

 

 

 

按照正常的流程提交,發現在git push的時候報錯了:

 

這個報錯是因爲遠程倉庫的代碼已經被更新了,而本地的代碼不是最新的,所以報錯。根據報錯的指示,我們使用git pull拉取最新代碼。

 

 

 

 

使用git pull拉取最新的代碼:

 

拉取完後,可以看到紅色標記那行代碼說1.html文件有衝突

 

 

 

 

現在來解釋一下衝突產生的原因:

       衝突其實分爲三種,但是我們最常遇到的是內容衝突,也就是上面展示的這種。

內容衝突產生的原因:

       兩個用戶修改了同一個文件的同一塊區域,git會報告內容衝突。

       上面的案例中,比如用戶A(myDemo1)修改了1.html文件,用戶B(myDemo2)頁修改了1.html文件,但是A先將代碼推送上去了,B再推送的時候便會產生衝突。

 

 

 

myDemo2中的1.html文件變成了這樣:

 

解釋:

<<<<<<< 和 ======= 之間的內容是本地修改的內容

======= 和 >>>>>>> 之間的內容是pull下來產生衝突的內容

 

 

 

現在人爲修改衝突,修改後的代碼如下:

 

 

 

 

重新提交修改和推送:

 

可以看到,現在推送成功了。

 

 

 

 

問題二:文件恢復

文件恢復的情形分爲三種:

① 未add

恢復指令:git checkout +需要恢復的文件名(如:git checkout1.html

② 已add未commit

恢復指令:git reset

若想恢復到未add之前,再使用①中的指令

③ 已commit

恢復指令:git reset --hard +版本號

git reset --hard HEAD^表示回退到當前版本

若想再往前恢復,先使用②中的指令,再使用①中的指令

 

 

 

問題三:使用分支

爲什麼要使用分支?

假如開發一個項目有好幾個版本的時候 比如穩定的版本放在master 供大家用, 在開發的版本放在其他分支上,等其他分支開發完成後,再合併到master,然後又繼續下一步的版本開發。

 

常用指令:

查看分支:git branch

創建分支:git branch <name>

切換分支:git checkout <name>  

創建+切換分支:git checkout –b <name>

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

刪除分支:git branch -d <name>

 

 

下面演示一下怎麼使用:

遠程倉庫的1.html的最新代碼:

 

 

 

創建並跳轉到分支“fenzhi”:

 

 

 

修改1.html文件的代碼:

 

 

 

提交修改,並切回到主分支:

 

 

 

這時候,我們再看一下1.html裏面的代碼:

 

可以看到,跟沒改過的代碼完全一樣,那是因爲我們切換回了master分支,而代碼的修改在fenzhi裏

 

 

 

要想看到修改的代碼,使用git merge fenzhi,把fenzhi合併到master:

 

 

 

 

現在便可以在master看到修改的代碼了:

 

 

 

最後再補充一些知識

       GIT服務器上存儲的是公鑰,你本地存儲的是私鑰,當你push本地代碼庫到遠程代碼庫,服務器會要求你出示私鑰,並且用你出示的私鑰和它的公鑰配對來完成認證。由於使用的是不對稱加密,所以公鑰可以公開,只要保管好私鑰就可以。

       路人甲只要沒有私鑰,所以無法push。這樣才能保證開源項目的完整性,否則阿貓阿狗都去push代碼,那項目不就亂套了?如果路人甲想對你的項目做出貢獻,那麼以GITHUB爲例,他會發送一個pull request給你,然後由你來審覈他作出的改變,如果審覈通過,那麼你就可以將他的pull request合併到你工程的某一分支中。這裏只以GITHUB爲例,私有的GIT服務器可能沒有類似功能,比如GITLAB就沒有pull request。


 

End!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章