Git的基本原理 及 常用命令情景模擬

Git是一個分佈式的版本控制系統,github可以用於管理項目版本控制。

msysgit是Windows版的Git,從http://msysgit.github.io/下載,然後按默認選項安裝即可。


工作原理

在開始正式嘗試使用之前,先簡單看一下GIT的工作原理:


在本地GIT倉庫當中,實際分爲工作區和版本庫。簡單來說:

  • 工作區就是你存放工作文件的目錄。
  • 而當執行git init創建本地git倉庫之後,隱藏的“.git”目錄下就是版本庫。
  • 版本庫當中有一個被稱爲“stage”或者“index”的暫存區。
  • 當我們申請創建倉庫之後,git會爲我們創建版本庫中的第一個默認的分支“master”,既主分支。
  • 以及指向當前所使用分支的一個指針“HEAD”。
所以,當我們提交改動的時候,可以理解爲:
  • git add將改動的文件提交到了暫存區。
  • git commit將提交到暫存區存放的改動文件,一次性提交到我們的倉庫分支上。
注:圖來自於http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

常用命令介紹


瞭解了基本原理,我們來看一下實際工作中最常用到的一些命令:

1、向git表明身份:

git config --global user.name "Your Name"

git config --global user.email "Your Email"

注:“global”參數代表當前機器上所有的GIT倉庫都會使用這個配置。


2、將普通目錄設置成GIT倉庫:

git init


3、提交文件到GIT倉庫:

git add 文件路徑

git commit -m “提交說明”


4、查看GIT倉庫中的內容的改動狀態:

git status


5、如果有倉庫狀態有所改變化,查看變化的具體情況:

git diff 文件名


6、查看倉庫中的歷史“commit”記錄:

git log 或 git log --pretty==oneline


7、版本回退

git reset --hard HEAD^

git reset --hard 版本號

注:

  • HEAD用於表示當前版本,^表示上一版本,^^則表示上上個版本,而例如100個版本之前,可以寫作HEAD~100.
  • GIT每次通過“commit”執行提交時,會生成一個對應的通過SHA1計算出的“commit id”,也可以通過此來更改倉庫的當前版本。


8、查看“未來”的“commit id”:

git reflog

注:昨天你GIT倉庫回退到了某個版本,但今天打開電腦你重新考慮後還是應該換回昨天回退之前的版本。這個時候,通過“git log”命令已經無法得到該版本的“commit id”了,因爲該版本的提交位於你回退的版本之後,你無法通過歷史記錄查詢到該版本的id。這是reflog能夠幫你解決。


9、用版本庫中的版本替換工作區中的版本:

git checkout -- 文件名

注:該命令使用可以分爲兩種情況:

一種是文件自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;

一種是文件已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。

總之,就是讓這個文件回到最近一此commmit或add時的狀態。


10、撤銷暫存區的修改內容(既撤銷掉通過“git add”提交過的內容):

git reset HEAD 文件名

注:由此可以發現,“git reset”不僅可以回退版本,還可以撤銷暫存區的改動。


11、刪除文件:

git rm 文件名


12、添加遠程倉庫:

git remote add 遠程倉庫鏈接


13、推送改動到遠程倉庫:

git push origin master


14、從遠程倉庫獲取改動內容

git pull origin master

注:

第一次提交時,可以使用git push -u origin master。之所以這樣做是因爲:

我們使用git push命令,實際上是把本地版本庫中的master分支的內容提交到遠程庫。

加上“-u”參數,則代表不但會把本地master的最新內容推送到遠程庫新的master分支,還會將兩個分支聯繫起來。


14、克隆遠程倉庫的內容到本地倉庫:

git clone 遠程庫鏈接


模擬場景運用


瞭解了這麼多GIT的常用命令之後,我們來模擬一些場景來聯繫一下真實的運用。使用GIT的最通常都的目的都是:多個人協同完成一項工作內容!

那麼假設我們現在有如下情況:你和小明約好一起寫一篇文章,你負責文章的上半部分,小明負責文章的下半部分。

於是,首先你和小明一起在github上創建了一個共同的遠程倉庫。假設,遠程倉庫的地址爲:[email protected]:meAndxiaoming/article.git.


現在,遠程庫建立好了,你和小明都得到了遠程倉庫的地址,負責文章上半部分編寫的你決定率先開始工作:

1、首先你會做好的你git配置,向git表明自己的身份,打開git命令行工具,輸入:

2、完成git的初始你在自己的電腦上建立了一個文件夾“MyArticleRepertory”,用於存放文章。


3、此時建立的文件夾“MyArticleRepertory”只是一個在你的電腦上用於存放文檔的目錄,它還和git沒有產生聯繫。爲此,我們決定先在該目錄下建立我們自己的本地GIT倉庫,於是繼續輸入命令:

  • git init
4、此時,本地倉庫的建立工作已經完成,你開始放心編寫你的文章“MyArticle.txt”。天色不早了,你決定先睡上一覺。但爲了寫好的文章避免丟失,你決定先把它放進本地倉庫裏保管好:
  • git addMyArticle.txt
  • git commit -m "第一次編寫工作存檔"
5、第二天起牀,你開始繼續你自己的編寫工作。一天勞累的工作完成,你又進行了一次提交,如步驟4相同。第三天了,當你起牀時,你發現自己對於昨天編寫的內容十分不滿意,想要重新進行編寫。所以此時,你需要將文章版本回退到第一天時提交的版本:
  • git reset --hard HEAD^
6、文章又回到了第一天完成的部分,你開始接着編寫,這兩天你的靈感似乎不太好。寫寫停停,新寫出的東西,似乎老是不讓你滿意。沒辦法,你又只好摒棄新寫的不滿意的部分,恢復到之前的狀態。這個時候,可能存在以下幾種情況:

6.1:你只是在“MyArticle.txt”進行了編寫工作:
  • git checkout --MyArticle.txt
6.2:你不止在“MyArticle.txt”中完成了編寫工作,還執行“git add”將改動提交了暫存區。
  • git reset HEADMyArticle.txt (首先,將暫存區的改動撤銷)
  • git checkout -- MyArticle.txt(接着,將版本庫裏的內容覆蓋掉我們工作區的內容,既撤銷我們這次在工作區做的最新改動)
6.3:你不止提交改動到了暫存區,並且還“git commit”到了master分支上。
  • git reset --hard HEAD^(當你執行完了這麼多操作,實際也就是完成了一次版本提交了,所以想要撤銷改動,實際就是做版本回退的工作了)

7、這幾天寫作工作的不順,讓你着實有點心煩意亂,你新建了一個txt文件寫下一些牢騷用於發泄,並且手賤的將他提交到了版本庫。當然這種東西並不需要提交到遠程庫上,。所以你最終還是要選擇刪除它:
  • git rm 牢騷.txt.
  • git commit -m "發牢騷是我不對"

8、在你情緒最低落的時候,你爆發了,我尼瑪不幹了,隨後你刪除了MyArticle.txt。當你冷靜下來,工作還是要繼續,但是用於保存文章的MyArticle.txt已經被你刪掉了。別怕,這是使用版本庫的好處就體現了,你可以找回它,還記得checkout命令嗎?

  • git checkout --MyArticle.txt
注:這時,我們再次加深記憶,checkout這個命令很多功能,它是將版本庫的最新內容替換掉工作區的內容。
所以如果你工作區裏該文件仍然存在,就顯得是在做“撤銷工作區改動”的工作。而如果該文件已經被刪除,實際就顯得是在做“文件恢復”的工作了。

9、低谷總會過去,你的靈感又回來了,你一氣呵成完成了滿意的文章上半部分。這時候,你決定將文章提交到遠程庫了。
  • git add MyArticle.txt
  • git commit -m “上半部分成功完成,小明快接着寫下半部分吧!”
  • git remote add origin [email protected]:meAndxiaoming/article.git (首先,你當然需要將遠程庫添加你的本地庫來)
  • git push -u origin master (將我們本地倉庫的master分支與遠程庫的master分支綁定,並將本地分支上的內容全部推送到遠程分支上。此時,我們的文章,實際就已經存放到遠程倉庫了)。
注:“[email protected]:meAndxiaoming/article.git”這種格式的鏈接,使用的是ssh協議。這種協議的好處是,速度更快和穩定。
我們可以通過git命令“ssh-keygen”來生成一個祕鑰,並將此祕鑰添加到github上。
完成此配置帶來的另一好處留是:你就不用再在每次對GitHub上託管的遠程庫進行操作時,都輸入身份密碼等口令了。
因爲你之前通過“git config ***”命令已經對git表明了你的身份,所以git爲你生成的密鑰就相當於申請了一張你的“身份認證”,GitHub通過SSH協議解析祕鑰,就可以知道這是你使用“你的Git賬號”在“你的某臺電腦”上的本地倉庫對遠程倉庫進行操作。

10、小明在最初收到遠程倉庫地址後,由於負責的是下半部分,所以他也會先建立本地倉庫並與遠程庫建立聯繫。隨後呢,小明決定沒事就看看上半部分的完成情況,於是:
  • git log

11、終於有一天,小明通過“git log”命令查看到了一次提交,並且發現註釋爲“上半部分成功完成,小明快接着寫下半部分吧!”。小明很開心,馬上着手將存放到遠程庫的上半部分克隆到本地倉庫:


12、隨後小明完成了下半部分的編寫工作,將文章提交到了遠程庫,至此,你們的協同工作也就完成了。而假設你們的文章發表後,反響不錯。於是你們決定寫第二部。這個時候,你們中間如果有人想要從遠程庫獲取最新改動,由於此時你們在自己電腦上已經有相關聯的本地庫了,就不必再使用克隆,只需要將遠程庫的最新改動“拉”下來就行了:

  • git pull origin master



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