Git 入門——分佈式版本控制系統

一、Git簡介

1、什麼是git

  • git是一個開源的分佈式版本控制系統,用於高效敏捷的管理大小項目代碼。

2、集中式與分佈式

在這裏插入圖片描述

二、安裝 Git

1、Linux 上安裝Git

sudo apt-get install git  

或者

sudo apt-get install git-core

2、Windows 上安裝Git

官網 下載 (不過比較慢)
CSDN 下載(Windows 64位系統,Git 版本爲:2.18)
然後按默認選項安裝即可.

查看是否安裝成功:Win + R -> cmd -> git
在這裏插入圖片描述
安裝完成後,還需要最後一步設置(你的名字和Email地址),在命令行輸入下面兩條命令:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

三、創建版本庫,並把文件添加到倉庫

版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

1、創建 Git 版本庫(目錄路徑中最好不要包含中文)
在這裏插入圖片描述
2、把目錄變成Git可以管理的倉庫
在這裏插入圖片描述
然後同級目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裏面的文件,不然改亂了,就把Git倉庫給破壞了。

3、把文件添加到版本庫 git add 文件名
在這裏插入圖片描述
4、用命令git commit告訴Git,把文件提交到倉庫
在這裏插入圖片描述
簡單解釋一下git commit命令,-m後面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄裏方便地找到改動記錄。

git commit命令執行成功後會告訴你,1 file changed:1個文件被改動(我們新添加的readme.txt文件);2 insertions:插入了兩行內容(readme.txt有兩行內容)。

5、總結

初始化一個Git倉庫,使用git init命令。
添加文件到Git倉庫,分兩步:

  1. 使用命令git add <file>,注意,可反覆多次使用,添加多個文件;
  2. 使用命令git commit -m <message>,完成。
  3. commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

四、查看狀態、查看不同

修改文件內容,在文件中添加add:2019_1009_11:05,運行git status命令看看結果:
在這裏插入圖片描述
git status命令可以讓我們時刻掌握倉庫當前的狀態,上面的命令輸出告訴我們,readme.txt被修改過了,但還沒有準備提交的修改。
在這裏插入圖片描述
git diff這個可以讓我們看到具體修改了什麼內容
在這裏插入圖片描述
總結

  • 要隨時掌握工作區的狀態,使用git status命令。
  • 如果git status告訴你有文件被修改過,用git diff可以查看修改內容。

五、版本回退

如果誤刪了文件,還可以從最近的一個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失

1、git log命令顯示從最近到最遠的提交日誌,如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline參數:
在這裏插入圖片描述
2、在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。退回到上一個版本可以使用git reset命令:
在這裏插入圖片描述
3、返回上次的版本
在這裏插入圖片描述
當要返回到上一次的版本並且沒有版本號(版本 ID)時,Git提供了一個命令git reflog用來記錄你的每一次命令:
在這裏插入圖片描述
總結:

  • HEAD指向的版本就是當前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個版本。
  • 要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。

六、工作區、暫存區、版本庫

在這裏插入圖片描述
我們把文件往Git版本庫裏添加的時候,是分兩步執行的:

  • 第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
  • 第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。

七、撤銷修改

1、git checkout -- <filename> 撤銷在這裏插入圖片描述

命令git checkout -- lemon.txt意思就是,把lemon.txt文件在工作區的修改全部撤銷,這裏有兩種情況:

  • 一種是lemon.txt自修改後還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
  • 一種是lemon.txt已經添加到暫存區後,又作了修改,現在,撤銷修改就回到添加到暫存區後的狀態。

總之,就是讓這個文件回到最近一次git commitgit add時的狀態。

2、git reset HEAD <filename> 撤銷

用命令git reset HEAD <file>可以把暫存區的修改撤銷掉(unstage),重新放回工作區,當我們用HEAD時,表示最新的版本。
在這裏插入圖片描述

總結:
  1. 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
  2. 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD <file>,就回到了場景1,第二步按場景1操作。
  3. 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考五、版本回退一節,不過前提是沒有推送到遠程庫

八、刪除文件

1、rm <filename> 刪除

在這裏插入圖片描述
查看文件狀態發現:版本庫中的文件並沒有刪除

2、git rm <filename> 刪除

在這裏插入圖片描述
查看文件狀態發現:版本庫中的文件已經刪除

總結

命令git rm用於刪除一個文件。如果一個文件已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復文件到最新版本,你會丟失最近一次提交後你修改的內容

九、遠程倉庫(以 CODING 爲例)

遠程倉庫就是可以把自己本地版本庫裏的文件上傳到的服務器倉庫,然後其他人可以通過這臺服務器倉庫提取和提交。
遠程倉庫比較主流的有三個:GitHub碼雲CODING

第一步:創建SSH Key

在用戶主目錄下(C:/Users/Administrator),看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsaid_rsa.pub這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:$ ssh-keygen -t rsa -C "[email protected]"
在這裏插入圖片描述
如果一切順利的話,可以在用戶主目錄裏找到.ssh目錄,裏面有id_rsaid_rsa.pub兩個文件,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。

第二步:拷貝公鑰

登陸CODING,打開“個人設置”,“SSH 公鑰”頁面, 點擊”新增公鑰“。然後,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容
在這裏插入圖片描述

第三步:添加遠程庫

新建項目,代碼瀏覽
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

第四步:從遠程庫克隆

在這裏插入圖片描述
把複製的地址 粘貼到命令行即可
在這裏插入圖片描述

SSH原理:

在這裏插入圖片描述

十、Git 分支

一、創建與合併分支

在這裏插入圖片描述

總結:

Git鼓勵大量使用分支:

  • 查看分支:git branch
  • 創建分支:git branch <name>
  • 切換分支:git checkout <name>或者git switch <name>
  • 創建+切換分支:git checkout -b <name>或者git switch -c <name>
  • 合併某分支到當前分支:git merge <name>
  • 刪除分支:git branch -d <name>
二、解決衝突

在這裏插入圖片描述

總結:
  • 當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
  • 解決衝突就是把Git合併失敗的文件手動編輯爲我們希望的內容,再提交。
  • git log --graph命令可以看到分支合併圖。
三、分支管理策略

通常,合併分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。如果要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就可以看出分支信息。

$ git merge --no-ff -m "merge with no-ff" dev   //準備合併dev分支,請注意--no-ff參數,表示禁用Fast forward
注意:

在實際開發中,我們應該按照幾個基本原則進行分支管理:

  • 首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活,那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發佈時,再把dev分支合併到master上,在master分支發佈1.0版本;你和你的小夥伴們每個人都在dev分支上幹活,每個人都有自己的分支,時不時地往dev分支上合併就可以了。所以,團隊合作的分支看起來就像這樣:在這裏插入圖片描述
注意:
  • Git分支十分強大,在團隊開發中應該充分應用。
  • 合併分支時,加上--no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。
四、 Bug 分支

在Git中,由於分支是如此的強大,所以,每個bug都可以通過一個新的臨時分支來修復,修復後,合併分支,然後將臨時分支刪除。
當你接到一個修復一個代號101的bug的任務時,很自然地,你想創建一個分支issue-101來修復它,但是,等等,當前正在dev上進行的工作還沒有提交,這時該怎麼辦呢??
Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作

總結:

  • 修復bug時,我們會通過創建新的bug分支進行修復,然後合併,最後刪除;
  • 當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場;
  • 在master分支上修復的bug,想要合併到當前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“複製”到當前分支,避免重複勞動。
五、 Feature 分支

如果做好了的工作需要銷燬的話:$ git branch -d <filename>
如果銷燬失敗。Git友情提醒,filename分支還沒有被合併,如果刪除,將丟失掉修改,如果要強行刪除,需要使用大寫的-D參數。。

總結:

  • 開發一個新feature,最好新建一個分支;
  • 如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除。
六、 多人協作

當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,並且,遠程倉庫的默認名稱是origin
要查看遠程庫的信息,用git remote;或者,用git remote -v顯示更詳細的信息

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

$ git push origin master

如果要推送其他分支,比如dev,就改成:

$ git push origin dev

但是,並不是一定要把本地分支往遠程推送,那麼,哪些分支需要推送,哪些不需要呢?

  • master分支是主分支,因此要時刻與遠程同步;
  • dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠程同步;
  • bug分支只用於在本地修復bug,就沒必要推到遠程了,除非老闆要看看你每週到底修復了幾個bug;
  • feature分支是否推到遠程,取決於你是否和你的小夥伴合作在上面開發。

總之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,視你的心情而定!

抓取分支
多人協作時,大家都會往masterdev分支上推送各自的修改。git clone
當你的小夥伴從遠程庫clone時,默認情況下,你的小夥伴只能看到本地的master分支。
推送分支:git pull;如果推送失敗,先用git pull把最新的提交從origin/dev抓下來,然後,在本地合併,解決衝突,再推送:
因此,多人協作的工作模式通常是這樣:

  1. 首先,可以試圖用git push origin <branch-name>推送自己的修改;
  2. 如果推送失敗,則因爲遠程分支比你的本地更新,需要先用git pull試圖合併;
  3. 如果合併有衝突,則解決衝突,並在本地提交;
  4. 沒有衝突或者解決掉衝突後,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

這就是多人協作的工作模式,一旦熟悉了,就非常簡單。

總結

  • 查看遠程庫信息,使用git remote -v
  • 本地新建的分支如果不推送到遠程,對其他人就是不可見的;
  • 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;
  • 在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
  • 建立本地分支和遠程分支的關聯,使用git branch --set-upstream branch-name origin/branch-name
  • 從遠程抓取分支,使用git pull,如果有衝突,要先處理衝突。

十一、標籤管理

發佈一個版本時,我們通常先在版本庫中打一個標籤(tag),這樣,就唯一確定了打標籤時刻的版本。

一、創建標籤

在Git中打標籤非常簡單,首先,切換到需要打標籤的分支上;然後,敲命令git tag <name>就可以打一個新標籤:$ git tag v1.0;可以用命令git tag查看所有標籤。
比方說要對add merge這次提交打標籤,它對應的commit id是f52c633,敲入命令:$ git tag v0.9 f52c633
注意,標籤不是按時間順序列出,而是按字母排序的。可以用git show <tagname>查看標籤信息
還可以創建帶有說明的標籤,用-a指定標籤名,-m指定說明文字:$ git tag -a v0.1 -m "version 0.1 released" 1094adb
總結:

  • 命令git tag <tagname>用於新建一個標籤,默認爲HEAD,也可以指定一個commit id;
  • 命令git tag -a <tagname> -m "blablabla..."可以指定標籤信息;
  • 命令git tag可以查看所有標籤。
二、操作標籤

如果標籤打錯了,也可以刪除:$ git tag -d v0.1
因爲創建的標籤都只存儲在本地,不會自動推送到遠程。所以,打錯的標籤可以在本地安全刪除。
如果要推送某個標籤到遠程,使用命令git push origin <tagname>;或者,一次性推送全部尚未推送到遠程的本地標籤:$ git push origin --tags
如果標籤已經推送到遠程,要刪除遠程標籤就麻煩一點,先從本地刪除:$ git tag -d v0.9,然後,從遠程刪除。刪除命令也是push,但是格式如下:$ git push origin :refs/tags/v0.9

總結

  • 命令git push origin <tagname>可以推送一個本地標籤;
  • 命令git push origin --tags可以推送全部未推送過的本地標籤;
  • 命令git tag -d <tagname>可以刪除一個本地標籤;
  • 命令git push origin :refs/tags/<tagname>可以刪除一個遠程標籤。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章