git年末大總結

在這裏插入圖片描述

本文末尾 微信公衆號 回覆 “git” 獲取git命令總結思維導圖。

Git

Git是目前世界上最先進的分佈式版本控制系統。

1. 版本控制

所謂版本控制就是在文件的修改歷程中保留修改歷史,讓你可以方便地查詢歷史提交記錄以及撤銷之前對文件的修改操作。版本控制系統主要有集中式版本控制系統和分佈式版本控制系統兩種。

1.1 集中式版本控制系統

集中式版本控制系統,版本庫是集中存放在中央服務器的,工作時需要先從中央服務器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央服務器。

在這裏插入圖片描述

1.2 分佈式版本控制系統

分佈式版本控制系統根本沒有“中央服務器”,每個人的電腦上都是一個完整的版本庫,這樣,你工作的時候,就不需要聯網了,因爲版本庫就在你自己的電腦上。既然每個人電腦上都有一個完整的版本庫,那多個人如何協作呢?比方說你在自己電腦上改了文件A,你的同事也在他的電腦上改了文件A,這時,你們倆之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

在這裏插入圖片描述

2. Git理論基礎

學習git首先需要了解其中涉及到的四個重要概念:

  1. 遠程倉庫(Remote Directory)
  2. 工作目錄(Working Directory)
  3. 暫存區(Stage/Index)
  4. 版本庫(Repository或Git Directory)

對於以上四個概念,我們依次理解。

2.1 遠程倉庫(Remote Directory)

遠程倉庫(Remote Directory)就是我們在遠程服務器上面創建的一個倉庫,通常這個倉庫存儲我們的代碼,我們拿GitHub來做個demo,我們在GitHub上面創建一個遠程倉庫awesome-git,這個倉庫空空如也,剛創建的,等會我們便拿這個倉庫進行學習git的相關操作。後面我們需要對這個倉庫進行操作,如pull,push,branch,tag,reset等等命令,這些命令後面會詳細瞭解。

2.2 工作目錄(Working Directory)

在上個小節,我們創建了一個遠程倉庫awesome-git,我們需要將它先放到本地進行相關操作,如存放在本地電腦awesome-git目錄下,這個本地文件夾awesome-git就是我們的工作目錄,這個就是我們平時存放項目代碼的地方。
在這裏插入圖片描述

2.3 暫存區(Stage/Index)

我們在上個小節中工作目錄下面會看見一個.git的文件夾,其實這是一個隱藏的文件夾,這個文件夾是Git的版本庫,他是存放Git管理信息的目錄,初始化倉庫的時候自動創建。暫存區英文叫stage, 或index。一般存放在 “.git目錄下” 下的index文件(.git/index)中,所以我們把暫存區有時也叫作索引(index)。其次,Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
在這裏插入圖片描述

2.4 版本庫(Repository或Git Directory)

工作目錄中有一個隱藏目錄.git,這個就是Git的版本庫。

3. Git工作流程

我們用一張圖來表示這四個區域之間的聯繫:

在這裏插入圖片描述

上面的這張圖就是整個git的工作流程,整體如下:

  1. 我們將文件存放到工作目錄中,譬如我們新建的代碼文件
  2. 用git add把工作目錄中的文件添加到暫存區,此時暫存區的目錄樹被更新
  3. 用git commit提交就是把暫存區的所有內容提交到當前分支,如當前分支是master上面,此時master 分支會做相應的更新。

經過以上三個步驟的操作,此時工作目錄中的文件狀態會經歷三種過程:已修改(modified)=> 已暫存(staged)=> 已提交(committed)

3.1 實戰練習

上面一系列操作文件的狀態會發生變化,我們來實際學習一下,上面我們創建的awesome-git這個倉庫之後會生成一個README.md這個文件,打開看一下里面內容:裏面只有一行“# awesome-git”

我們在這個文件裏面添加一行註釋 “深入理解git” 變成下面:

在這裏插入圖片描述

此時我們更改了文件,我們通過一個命令 git status 來查看此時的文件狀態:


上面很清楚的顯示出 “modified: README.md”,這個文件被修改了。此時該文件還存在工作目錄中,我們需要將它存入到暫存區stage中,通過命令 git add 來執行:

上面顯示已經存入了暫存區Stage中去了,接下來需要commit,把它放到master分支上區,通過 git commit 命令來執行:
在這裏插入圖片描述

此刻我們經過一系列的操作,已經提交到master分支上了,同時工作區裏面沒有改動了:
在這裏插入圖片描述
看,“nothing to commit , working tree clean”,工作區是“乾淨”的。

經過一系列上述的操作,此刻文件已經放到了master分支上,接下來我們需要將這個文件push到遠程倉庫中去,

在這裏插入圖片描述
通過 git push 命令即可推送到遠程倉庫的master分支上去,我們到遠程倉庫看一下:

在這裏插入圖片描述

此刻已經推送到了遠程倉庫中去了。這是最簡單git操作了,下面我們將在第7小節中討論其他一系列複雜的操作。

4. Git分支管理

我們開發項目一般都是進行在分支上面開發的,而不是直接在master分支,當開發完成之後我們再將在其他分支上面的代碼合併到master分支。接下來我們將詳細學習分支的常用操作。我們每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git裏,這個分支叫主分支,即master分支。HEAD嚴格來說不是指向提交,而是指向master,master纔是指向提交的,所以,HEAD指向的就是當前分支。

在這裏插入圖片描述

一開始的時候,master分支是一條線,Git用master指向最新的提交,每次提交,master分支都會向前移動一步,這樣,隨着你不斷提交,master分支的線也越來越長。

4.1 新建分支

我們通過以下命令來創建一個分支:

4.1.1 創建分支
//新建dev分支
git branch dev
4.1.2 查看所有分支

通過以上命令即可創建一個新分支dev,我們查看以下目前這個repo包含哪些branch

//查看分支
git branch 

在這裏插入圖片描述

4.2 切換分支

可以看到目前存在兩個分支,dev和master分支,master分支前面有個*號表示當前分支是在master上面。我們可以通過下面命令來切換分支:

//切換到dev分支
git checkout dev

在這裏插入圖片描述
從上面可以看到,我們已經切換到dev分支上面了,dev前面存在*號。

4.3 合併分支

上面我們已經創建了新分支dev,假設我們在新分支上面開發了一些內容譬如新建一個文件dev.md,我們把這個文件提交到dev分支,通過以下命令即可完成:

//將dev.md這個文件添加到stage
git add dev.md

//將dev.md這個文件提交到dev分支
git commit -m "add new file to branch dev"

在這裏插入圖片描述
這個時候我們將創建的文件提交到了dev分支,而master分支上面是不存在這個文件的。這個時候需要我們將dev分支上面的東西合併到master分支上面,就需要用到以下的命令:

1.首先要切回到master分支
在這裏插入圖片描述

2.合併dev分支

//合併語法
git merge 分支名

在這裏插入圖片描述
可以很清楚的看到master分支上面多了一個文件dev.md,這是理想的情況,正常情況下,我們在分支上面開發的話,一般都會出現衝突的問題,我們需要解決衝突:

3.解決衝突

首先,我們切回到dev分支,然後在dev.md這個文件中將裏面的內容替換一下:

在這裏插入圖片描述

替換成:

在這裏插入圖片描述
這個時候我們需要將dev分支上面的內容提交到dev分支上面,然後再切回master分支修改dev.md文件並且提交到master分支:

在這裏插入圖片描述

現在嘗試合併dev分支就會出現衝突:

在這裏插入圖片描述
因爲衝突的地方不能自動解決合併,所以需要我們手動解決,我們進入dev.md這個文件中看看衝突:

在這裏插入圖片描述

Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,我們只需要確認哪些部分是需要的,刪除不需要的部分即可。最後再衝洗提交到master分支。

我們可以通過下面的命令查看分支合併情況:

git log --graph --pretty=oneline --abbrev-commit

在這裏插入圖片描述
這樣就完成了分支衝突合併的操作。

4.4 刪除分支

在dev分支上面開發好了之後把代碼合併到master分支上面,這個dev分支就不需要了,我們將它刪除並查看一下分支情況,可以發現只有一個master分支了:

在這裏插入圖片描述

5. Git標籤管理

發佈一個版本時,我們通常先在版本庫中打一個標籤(tag),這樣,就唯一確定了打標籤時刻的版本。 tag 和 branch 有點相似,兩者有何區別呢?tag 對應某次 commit, 是一個點,是不可移動的,branch 對應一系列 commit,是很多點連成的一根線,有一個HEAD 指針,是可以依靠 HEAD 指針移動的。所以,兩者的區別決定了使用方式,改動代碼用 branch ,不改動只查看用 tag。

tag 和 branch 的相互配合使用,有時候起到非常方便的效果,例如 已經發布了 v1.0 v2.0 v3.0 三個版本,這個時候,我突然想不改現有代碼的前提下,在 v2.0 的基礎上加個新功能,作爲 v4.0 發佈。就可以 檢出 v2.0 的代碼作爲一個 branch ,然後作爲開發分支。

5.1 新建tag

// 新建tag語法
git tag <tag名>

在這裏插入圖片描述

5.2 查看tag

注意: 標籤不是按時間順序列出,而是按字母排序的。可以用以下語法進行查看標籤信息

// 查看tag語法
git tag 

在這裏插入圖片描述

5.3 刪除tag

要刪除掉你本地倉庫上的標籤,可以使用如下命令:

//刪除tag語法
 git tag -d   <tag名>

在這裏插入圖片描述

通過以上命令我們刪除v1.0的tag 然後再查看以下tag,發現只剩下v2.0的tag了。

6. Git遠程操作

GitHub 是最大的 Git 版本庫託管商,是成千上萬的開發者和項目能夠合作進行的中心。 大部分 Git 版本庫都託管在 GitHub,很多開源項目使用 GitHub 實現 Git 託管、問題追蹤、代碼審查以及其它事情。 所以,儘管這不是 Git 開源項目的直接部分,但如果想要專業地使用 Git,你將不可避免地與 GitHub 打交道,所以這依然是一個絕好的學習機會。

在GitHub上面新建一個test的repo,可以進行以下的命令操作,即可以將本地的東西提交到GitHub上面的test倉庫中:

//新建一個readme.md文件
echo "# test" >> README.md

//初始化本地倉庫
git init

//將readme.md這個文件加入到stage中去
git add README.md

//將readme.md這個文件放到master分支上去
git commit -m "first commit"
git remote add origin https://github.com/crazyandcoder/test.git

//將這個推送到遠程的master分支上去
git push -u origin master

關於作者

專注於 Android 開發多年,喜歡寫 blog 記錄總結學習經驗,blog 同步更新於本人的公衆號,歡迎大家關注,一起交流學習~

在這裏插入圖片描述

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