git 年底大總結

在這裏插入圖片描述

本文末尾 微信公衆號 回覆 「git」 獲取git命令總結思惟導圖。原文連接:github.com/crazyandcod…git

Git

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

1. 版本控制

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

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等等命令,這些命令後面會詳細瞭解。ui

2.2 工做目錄(Working Directory)

在上個小節,咱們建立了一個遠程倉庫awesome-git,咱們須要將它先放到本地進行相關操做,如存放在本地電腦awesome-git目錄下,這個本地文件夾awesome-git就是咱們的工做目錄,這個就是咱們平時存放項目代碼的地方。 spa

在這裏插入圖片描述

2.3 暫存區(Stage/Index)

咱們在上個小節中工做目錄下面會看見一個.git的文件夾,其實這是一個隱藏的文件夾,這個文件夾是Git的版本庫,他是存放Git管理信息的目錄,初始化倉庫的時候自動建立。暫存區英文叫stage, 或index。通常存放在 ".git目錄下" 下的index文件(.git/index)中,因此咱們把暫存區有時也叫做索引(index)。其次,Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。 3d

在這裏插入圖片描述

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 同步更新於本人的公衆號,歡迎你們關注,一塊兒交流學習~

在這裏插入圖片描述
相關文章
相關標籤/搜索