Git教程1-生存篇

前言

作爲一個嵌入式工程師,一直都想掌握git這個版本管理神器,網上的許多git教程,有的特別冗長有幾十個頁面,有的又過於簡單就是介紹介紹功能,感覺就是介紹一遍git的功能,是在玩git而不是讓git實用起來。本教程立足於如何讓一個嵌入式工程師掌握git,能夠方便快捷地實用git,我也在正在逐步學習,會不定期更新教程。

首先git有許多圖形化工具,但是前期請實用命令行,一個是命令行的功能更豐富,適應性強,一個是如果不清楚哪個按鈕會執行什麼樣的命令的話,亂點是極有可能導致整個版本錯亂的。

Git 工具鏈

Git工具鏈主要是提供了git命令的可執行文件,windows下還提供了一個shell,可以方便滴使用一些簡單的linux命令。無論是使用命令行工具還是圖像化操作界面,都需要先安裝Git工具鏈,linux發行版一般自帶,windows需要安裝。
下載地址

Git服務器

Git是分本地(Local)和服務器(Git Server)的,如果你能翻牆,強烈推薦Github(允許5個私有項目,edu郵箱註冊更多);如果你能翻牆,並且需要建立較多的私有項目,推薦Bitbukcet(教育網空間更大);如果你不能翻牆,咳咳,乖乖用Gitee(碼雲)吧;如果你是實驗室學生或者公司團隊,你可以搭建一個內部的git服務器,強烈推薦Gitlab,烏克蘭不僅盛產美女也盛產程序員,恩恩,Gitlab的搭建過程非常簡單,詳情見 Git教程之局域網服務器搭建教程(Gitlab) ;還有一個騷操作,可以自動同步的雲盤(google/dropbox等)是極好的個人git服務器,把git目錄推上去即可。

前面都是介紹(廢話),現在開始正式教程。這個教程我們採用案例的流程來學習git,並在中間穿插基礎知識,不適合老鳥。。。。首先假設你是一個嵌入式工程師。。。

場景假設

道具準備

  • 一個已有的工程(比如stm32),注意備份,別誤操作玩壞了
  • 一個git服務器賬號,anyway,假設是github
  • 一臺裝好git工具鏈能上網的電腦,假設這是一隻win10

劇情

這是我常遇到的遊戲路線,選擇你喜歡的玩耍,有補充的可以留言。

  1. 建倉:新建遠程倉庫和本地倉庫,把已有的代碼添加到倉庫,提交併上傳到遠程倉庫
  2. 拷倉:另一個小夥伴(另一個電腦,或者另一個目錄)需要下載這個倉庫,修改了部分內容,提交併上傳
  3. 改倉:原來的小夥伴先修改了內容,如何更新倉庫,啊,pull不下來
  4. 移倉:老闆說github被微軟收購了,信仰崩塌,讓我把倉庫移到gitee上
  5. 查倉:咦,我的程序跑不了了,我上上個版本能用的來着(對比,查看修改內容)

具體步驟

建倉

  1. 在本地新建一個空文件夾,這裏取名gitDemo,進入空文件夾後右擊空白處選擇“git bash here”

在這裏插入圖片描述

  1. 會彈出一個命令行窗口,這個命令行窗口可以執行git指令及許多linux指令。首先設置用戶信息,用戶暱稱和郵箱,這個信息會記錄在提交的版本中,請認真填寫:
git config --global user.name "xiaoming"
git config --global user.email "[email protected]"
  1. 然後我們需要初始化git文件夾(只有空文件夾纔可以初始化git):
git init
  1. 這個會在目錄下生成一個.git文件夾,用來保存版本控制的信息,不要隨便亂改哦。然後我們原來嵌入式工程裏的文件拷貝到這個文件夾裏(沒有的小夥伴可以隨便新建幾個文件)。然後查看一下版本狀態:
git status

在這裏插入圖片描述
紅色的字代表這個文件還沒有被“暫存”,git對本地文件的管理分三個空間:workspace(工作空間,就是你當前直接看到的、編輯目錄),stage/index(暫存空間,文件提交前要先放在暫存空間),respository(版本庫,這裏存放着你曾經提交的所有版本信息),當前目錄的文件根據被更新的層級相應的會處於unstaged/untracked(未暫存),staged(未提交),commited(已提交)三種狀態。現在就處於unstaged/untrucked狀態。
在這裏插入圖片描述

  1. 接着我們需要暫存這個文件:
git add .

git add 是暫存/跟蹤(第一次叫跟蹤,以後叫暫存,第一次就是不一樣),常見的用法有

% 暫存指定的目錄
git add /User
% 暫存指定拓展名的文件
git add *.c
% 暫存當前目錄的所有文件
git add .
% 暫存已跟蹤的文件,即有過第一次add的文件
git add -u
  1. 然後我們再次使用“git status”查看文件的狀態:

在這裏插入圖片描述
會發現原來那些紅色的文件名變綠了,咦,我怎麼把.obj文件也加進來了,這種編譯生成的文件又大有沒有記錄價值,怎麼辦?

  1. 我們可以使用git rm --cached命令來移除暫存區不需要的文件:
% 這個命令支持和add一樣的文件篩選表達式如/Prj,*.jpg,.等
git rm --cached "*.obj"

注意路徑表達式要加雙引號,否正有可能識別成指令。接着我們使用git status來重新查看文件狀態,會發現obj文件已經變回unstaged狀態。

在這裏插入圖片描述

但是,每次都這樣add再移除是不是太麻煩了,作爲程序員的我們當然不能這樣解決問題。

  1. 使用.gitignore文件來篩選要跟蹤的文件。windoes下面不能直接新建‘.’開頭的文件,所以需要用shell指令來新建。
% 新建gitignore文件
touch .gitignore

然後去工程目錄下面直接拿文本編輯器修改這個文件,建議用notepad++之類有語法高亮的編輯器,當然像我這種會vim的童鞋可以直接在shell下面編輯,嘻嘻。在裏面加入你需要屏蔽的目錄或者文件:

*.pdb
*.manifest
/Prj
!/Prj/Objects/*.axf

注意一行一條,gitignore的規則有很多,不過我常用的就幾條:

# 屏蔽一個目錄或文件,這個路徑是從gitignore文件所在目錄爲根目錄算起
/Prj
# 屏蔽一類文件
*.o
# 屏蔽所有目錄下的某個子目錄,如/obj, /Sensor/obj...
**/obj
# 保留某個目錄或某個文件,比如只想留下可執行文件
!/Prj/Objects/*.axf
  1. 然後我們先使用git rm --cached移除所有暫存文件,然後添加gitignore文件,再添加其他文件。
% 移除所有暫存文件, -r表示以遞歸地形式刪除
git rm -r --cached '.'
% 加入gitignore
git add .gitignore
% 再次添加所有文件
git add .
% 查看現在的狀態
git status

這樣我們以後每次修改完文檔只需要使用git add .就可以暫存所需要的文件了

  1. 然後我們需要把暫存區的內容提交本地的版本庫
% ‘-m’ 後面帶就是版本介紹信息,要好好寫方便以後查看
git commit -m "firstVarsion"

如果你在提交之後發現,我們剛纔寫的版本信息有一個單詞拼錯了,後來我又想加入一個新文件如readme(加到工程目錄下,下一個任務需要),但是又不想產生一個新的版本,這時可以使用下面的命令:

% 使用這個指令後,會彈出文本編輯器,修改完保存退出即可
git commit --amend

如果你安裝git時選擇的默認文本編輯器是vim,那麼恭喜你,這個時候會進去vim編輯器,這個編輯器嘛,咳咳,不瞭解的可能怎麼退出都不知道。這裏介紹幾個vim的生存指令,首先建議在英文模式下編輯,i進入編輯模式(下面會出現‘插入’字眼),按ecs退出編輯模式並進入命令模式,在命令模式下輸入”:wq“即可保存並退出。

這樣我們就完成了本地版本庫的建立和管理,以後的在本地的工作流程就是編輯,add,commit。

  1. 平時查看本地的版本庫使用git log指令:

在這裏插入圖片描述

  1. 一般我們需要把本地的版本庫提交到git服務器,方便大家的交流(拷貝),以及在多個終端(電腦)上進行修改。這裏以github舉例,首先去註冊一個賬號並驗證郵箱。

在這裏插入圖片描述

  1. 然後登入github,新建一個倉庫,這裏取名gitDemo

在這裏插入圖片描述

  1. 建好後進入倉庫,把倉庫地址複製出來,記得選擇http模式

在這裏插入圖片描述

  1. 接着在我們剛纔的本地的gitDemo的git bash(終端)里加入這個遠程庫
% origin是遠程倉庫別名別名,你愛取啥取啥
git remote add origin 地址
  1. 然後把本地倉庫提交到遠程倉庫
% 第一次提交
git push -u origin master
% 以後的提交
git push

其中-u是指定默認倉庫,第一次提交需要使用,origin是倉庫別名,master是分支。分支的概念在以後討論,大致是一套代碼可以有多個版本,主版本叫master,其他分支,你愛取啥取啥。

  1. 正常輸入後會彈出github的登入界面,輸入賬號密碼即可。

在這裏插入圖片描述

什麼?不想每次push輸入賬號密碼?嗯,可以使用以下指令記住密碼,使用後再進行一次成功的登入(push pull都可以)即可成功記住密碼。

git config credential.helper store

push成功後會終端會出現以下提示

在這裏插入圖片描述

如果出現“error setting certificate verify locations”,這是證書錯誤,使用以下命令解決:

git config --system http.sslverify false

第一條劇情到了這裏就完結了,這是最長的一條,畢竟主線,碼字好累。

拷倉

  1. 克隆,在另一臺電腦(在另一個文件夾裏也可以),新建一個空的文件夾gitDemo2,進入這個文件夾,右擊git bash here打開命令行終端。鍵入以下指令:
git clone 地址

這個git clone指令是用來拷貝已有的遠程倉庫。這個地址是建倉中在github上新建的倉庫的http地址(13步複製得到的地址)然後在彈出的對話框裏輸入賬戶密碼(同一臺電腦有可能已經記住密碼了),確定後就可以看到剛纔push上去的項目被拷貝下來了。

  1. 然後我們來修改reame.txt文件,

在這裏插入圖片描述

  1. 接下來的步驟與上一個場景中的一樣,先add添加到暫存區,再commit到本地版本庫,成一個新的版本,最後push到遠程庫
# 查看修改了哪些部分
git diff
# 添加修改的部分
git add .
# 提交到本地版本庫,注意前後單引號都是英文符號纔可以
git commit -m '第二個地方的修改'
git push

git diff這個指令是用來查看版本之間的差異的,具體功能在後面的章節介紹。
在這裏插入圖片描述

這樣就完成了在另一個地方的修改、提交、推送,日常常用這兩套技能就差不多了。

改倉

接下來我們來處理一個常見的問題。正常個人使用的時候,我們是不會在兩個地方同時對工程進行修改,所以在每個地方修改工程都是先pull再push,這樣是不會出問題的。但是,如果有多個人協作工程的時候就會遇到版本衝突的問題。如,

  1. 我們回到第一臺電腦(第一個地方),先修改readme文件,然後再執行
git pull

git pull 指令是把遠程庫的內容更新到本地庫,同時在不衝突的情況下更新工作空間,需要注意的是,這個指令不會修改本地倉庫的head指針,即本地倉庫目前默認的版本原來是哪個版本現在還是哪個版本。git pull還有以下常用功能:

# 更新當前默認的遠程倉庫的當前分支
git pull
# 更新指定遠程倉庫的默認分支,遠程倉庫名(orgin)
git pull orgin
# 更新指定遠程倉庫的指定遠程分支到本地指定分支,遠程倉庫名(orgin),遠程分支名(next),本地分支名(master)
git pull orgin next:master

然後我們會發現出現錯誤,因爲遠程的readme和本地的readme衝突了。

在這裏插入圖片描述

  1. 有以下幾種方法解決這個問題
  • 放棄第一個版本,讓它回到修改前的狀態,這是很常見的修改方法
# 先切回修改前的狀態
git checkout .
# 重新pull
git pull
  • 把工作空間暫存到一個快照,pull下來後,再處理衝突
# 暫存第一個版本的內容到快照空間
git stash
# 更新版本
git pull
# 彈出快照內容
git stash pop

在這裏插入圖片描述
git stash 是git快照工具,可以把工作空間通過壓棧和彈棧的方法臨時管理工作空間的內容,常用的指令如下

# 把當前的工作空間保存快照
git stash
# 現實已保存的快照列表
git stash list
# 把指定的快照恢復到工作空間(會保留衝突),加上--index代表同時恢復暫存空間;stash表示要恢復到的快照版本,省略代表最近的快照
git stash pop [--index] [<stash>]
# 刪除已有的快照
git stash clear
  1. 然後我們需要處理衝突,使用編輯器打開readme文件,然後把它修改到需要的版本,然後再次提交,推送即可完成衝突的處理。這裏我們手動處理衝突,更復雜的衝突可以使用diffmerge等可視化工具來輔助完成,這些內容以後再介紹。帶有衝突的文件,會有以下的字符:

在這裏插入圖片描述

移倉

原來使用github當git服務器,用着發現好慢,而且還有這樣那樣的限制,如果實驗室有能力的話可以自己搭一個git服務器,這個時候就需要把倉庫移過去。這裏以實驗室自己搭的gitlab舉例。

  1. 註冊gitlab賬號,然後新建倉庫“gitDemo”,複製倉庫的http地址

在這裏插入圖片描述

  1. 在本地的gitDemo文件夾裏右擊打開git bash終端,添加這個地址
# gitlab是別名,可以自己取;後面的是gitlab倉庫的地址
git remote add gitlab 'http://git.xxxx.cn/xxx/gitdemo.git'

git remote是遠程庫管理指令,我常用的有:

% 查看遠程倉庫列表
git remote -v
% 添加遠程倉庫
git remote add 別名 地址
% 從列表刪除遠程倉庫
git remote rm 別名
% 重命名列表中的遠程倉庫別名
git remote rename 原別名 新別名
  1. 然後我們先查看遠程倉庫,會發現多一個條記錄。接着,我們使用push指令修改默認的遠程服務器。
% 查看遠程倉庫列表
git remote -v
% 設置默認遠程倉庫並推送, gitlab是遠程倉庫別名,master是要推送的分支
git push -u gitlab master

在這裏插入圖片描述

如果是gitlab的話現在可以從網上的客戶端看到遠程的倉庫已經更新了。

  1. 有需要的話可以刪除原來github的遠程倉庫,
    這樣倉庫的轉移就完成了。

查倉

這個任務,我們主要學習如何比較各個版本的差異。
首先讓我們“製造”一些差異,我們先修改readme文件,在最後面添加一行“暫存的內容”,保存後使用git add readme功能把內容提交到暫存區,然後再次修改readme文件,把最後一行改成“工作空間的內容”,最後保存。

  1. 使用git diff指令查看各個空間的差異,省略文件路徑會顯示所有修改的文件,可以使用git log查看版本id。
# 工作空間和暫存區的差異
git diff 文件路徑
# 工作空間和本地默認版本庫(head)的差異
git diff HEAD 文件路徑
# 暫存區和本地默認版本庫(head)的差異
git diff --cached 文件路徑
# 兩個版本庫之間的差異
git diff [<commit-id>] [<commit-id>] 文件路徑
# 工作空間與指定版本之間的差異
git diff [<commit-id>] 文件路徑
# 工作空間與快照空間之間的差異
git diff stash@{0} -- 文件路徑

在這裏插入圖片描述

  1. 在知道了如何比較兩個版本之後,我們需要讀懂版本比較時的標識符,詳細信息如下圖所示:

gitDiff

  1. 運行git diff命令後,會進入一個命令操作狀態,掌握一些簡單的操作命令是需要的。
    在上一步所示的界面裏需要使用一些指令來操作:
命令 功能 描述
q 退出 回到git命令行
h 幫助 顯示此模式支持的命令
j或↑ 下一行 光標移動命令
k或↓ 上一行 光標移動命令
f 下滾一屏 光標移動命令
b 上滾一屏 光標移動命令
= 顯示進度 顯示當前光標在文檔中的位置
/表達式 搜索字符串 支持正則表達式
:e 打開文件 若文件不存在會報錯

一些其他的經驗

  • 刪除和重命名文件請實用git指令,而不是簡單地實用文檔瀏覽器操作,不然極易導致版本庫崩潰,尤其是刪a.c,過了一一會兒又新建a.c。。。
  • 先學習git命令行操作,命令行操作,命令行操作,重要的事情說三遍!!!
  • 如何保存賬號密碼
    在gui bash裏面鍵入以下命令後,再有一次成功的登入系統就會記住密碼,如果希望全局設置這個屬性可以加上–global選項
git config credential.helper store
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章