Git實用教程
這篇文章主要演示怎樣使用git提交代碼到遠程倉庫,以及在工作中經常遇到的問題,比如衝突、版本回退等。
前提準備:
git的下載以及安裝
下載好後就可以安裝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!