首頁>技術>

程式碼版本控制對於我們嵌入式軟體開發崗是一項基礎、必備的技能,需要熟練掌握。實際工作中常用的版本控制系統有:Git(分散式版本控制系統)與SVN(集中式版本控制系統)。

本次分享Git在實際工作中的基本使用方法。

一、Git的下載、安裝及配置1、Git與Github:Git:分散式版本控制系統。GitHub:面向開源及私有軟體專案的託管平臺。與GitHub類似的是Gitee, Gitee是開源中國推出的基於 Git 的程式碼託管服務。下面的例子用Gitee來進行演示。Git與GitHub的關係:只支援Git 作為唯一的版本庫格式進行託管,故名GitHub。2、Git下載及安裝(1)下載:方法一(官網下載):

地址:https://git-scm.com/。

官網下載速度稍慢。

方法二(映象網站下載):

地址:https://npm.taobao.org/mirrors/git-for-windows/

映象網站下載速度較快。

(2)安裝:

下載完成後按預設選項安裝即可。 安裝完成在任意資料夾下右擊就可以看到:

Git GUI是一個Git圖形化客戶端軟體,Git Bash是一個命令列終端。兩個都可以用,根據自己喜好,用其中一即可。但還是建議用Git Bash,熟練了Git Bash在選用一些圖形化客戶端也可以(不僅限於Git GUI)。不過話又說回來,熟練了Git Bash之後,好像也沒必要再用圖形化客戶端了。

3、本地git配置

任意資料夾下右鍵進入Git Bash,然後輸入如下命令進行本地配置:

$ git config --global user.name "user"$ git config --global user.email "email"

其中, user為你的使用者名稱(隨意取),email為你的郵箱,設定這兩個資訊的原因是在於遠端庫進行關聯時需要一個key,配置這兩個資訊以確保你的唯一性。使用--global引數表明你這臺機器上所有的倉庫都進行相同的配置。 比如我的配置:

4、關聯遠端倉庫

前面也提到了,常用的遠端倉庫有GitHub與Gitee。關聯遠端倉庫的方法都一樣,這裡我們以Gitee為例。

(1)註冊Gitee/GitHub(2) 建立ssh金鑰

輸入命令:

ssh-keygen -t rsa -C "email" 

建立ssh key。此時,使用者根目錄下的.ssh/目錄下會生成兩個檔案:id_rsa和id_rsa.pub,把id_rsa.pub檔案中的內容複製到gitee賬戶中進行設定。

輸入命令cat ~/.ssh/id_rsa.pub可檢視id_rsa.pub的內容。如:

然後把輸出的內容複製一份,待會要用。

(3)在遠端倉庫中設定ssh key

在Gitee的設定中找到SSH公鑰一欄:

並把剛才我們複製的ssh key貼上到公鑰輸入框中:

其中,標題是隨意起的。這是Gitee設定ssh key的方法,Github設定ssh key也是類似的。

二、本地、遠端倉庫建立關聯

例如,我們本地有一個git_test工程:

下面我們來演示把這個工程上傳至遠端倉庫並建立關聯。在進行演示之前我們需要看一個圖:

這個圖是使用git來進行版本控制最核心的圖。

上行:

首先,使用add命令把工作目錄中的檔案新增到暫存區中;然後,再使用commit命令提交到本地倉庫中。最後,再使用push命令推送到遠端倉庫。

下行:

第一次需要使用clone命令從遠端倉庫中克隆一份至本地;之後若是遠端倉庫有內容更新,可以使用pull拉取新更新的內容至本地。

(1)原生代碼管理

即使我們不關聯遠端倉庫,我們也可以在本地對自己的程式碼進行一個管理。以上面的git_test工程為例,首先使用git init命令初始化git_test倉庫:

輸入git init後會在當前工程目錄下生成一個 .git/的隱藏目錄, 裡面有一些相關檔案:

正因為有了.git/這個目錄,我們才能進行版本控制。.git/裡面的內容不再展開說明,有興趣的朋友可自行研究。

把git_test工程下的檔案新增到暫存區:

其中:

git status命令:檢視狀態。git add <file>:新增檔案至暫存區。git add .:將工作區所有變化提交到暫存區。

將暫存區檔案提交到本地倉庫:

(2)關聯遠端倉庫

首先,在Gitee上建立一個名為git_test的倉庫:

第一次上傳需要輸入gitee的賬號密碼。輸入賬號密碼之後即可完成上傳:

其中, 第一條命令是把本地庫與遠端庫進行關聯,其中遠端倉庫的名字origin是可以更改的;第二條命令是把本地倉庫的內容推送到遠端倉庫中。

我們的本地倉庫既可以同步到Gitee,也可以同時同步到GitHub。同步到GitHub上的方法與同步到Gitee上是一樣的,需要注意的是這裡遠端倉庫的名字不能是origin,因為上面我們的GitHub遠端軟體倉庫的名字已經命名為origin。

此時,重新整理遠端倉庫可看到我們上傳的檔案:

至此,我們的本地倉庫與遠端倉庫已經建立起了連線,就可以很好地進行版本管理了。下面依舊透過例項來演示一下使用git的一些操作。

三、Git常用操作

進入公司第一天,老大給你分配一個git賬號及一個遠端倉庫地址。假如這個遠端倉庫的地址是:

https://gitee.com/zhengnianli/git_test.git

你首先要做的就是配置git,然後你可以建立一個資料夾,專門放需要管理的程式碼工程。假如這個這個資料夾是git_project,我們把上面遠端倉庫的專案克隆一份到git_project下:

這也是我們上面上傳的工程。我們新增一個README.md檔案並上傳至遠端倉庫:

因為第一天上班,所以你下班下得很早。你的同事更改了程式碼並上傳,上傳的程式碼如:

第二天你上班,先拉取最新程式碼至本地,執行命令:

git pull origin master

然後就可以愉快地編寫我們的程式碼了。執行拉取操作時有可能會碰到類似這樣的情況:我們本地修改了module1.c檔案,假如修改為:

而遠端倉庫上的module1.c也被更新了,假如更新為:

此時如果執行拉取操作,會覆蓋掉本地的module1.c檔案嗎,會覆蓋掉你的程式碼的?不會的,因為如果有衝突的話拉取就不成功,需要解決衝突才可重新拉取。

比如此時我們進行拉取操作,則產生衝突:

此時我們可以執行git stash命令把我們的本地修改臨時儲存,然後再執行拉取操作,最後執行git stash pop命令恢復我們的暫存:

問題又來了,剛才臨時儲存的會覆蓋掉剛剛拉取的程式碼嗎?不會的。保留或者丟棄都是由我們進行選擇的,比如:

我們可以保留雙方修改,也可以採用當前修改(剛從遠端倉庫拉去的程式碼),也可以採用傳入的更改(臨時儲存恢復的程式碼),還可以比較變更:

這裡我們選擇保留雙方修改,程式碼變成:

以上就是最基本最常用的git操作了,即怎麼管理程式碼、怎麼拉取程式碼、怎麼上傳程式碼。除此之外,還有些常用命令及操作大家可以遇到的時候再查著怎麼用,比如,如何建立分支、合併分支、版本回退等等內容。由於篇幅過長,不再展開進行演示。

四、主要注意事項

1、剛開始使用git時,若是不熟練,在push程式碼或者pull程式碼之前可以做一下備份,防止出了不可逆轉的程式碼丟失。

2、提交程式碼前務必工程編譯透過,並且沒有修改別人的程式碼。可以使用對比軟體(如beyond compare)對比對比自己做了哪些修改,是不是都是必要的修改,有哪些是要丟棄的。

五、一些Git圖形化客戶端及工具

用命令列還是用圖形化客戶端看個人習慣,這裡也分享一些工具(來自 碼雲 Gitee 推薦):

Sourcetree 客戶端(Windows、Mac)giggle 客戶端(Linux)Git 客戶端(Windows)TortoiseGit 客戶端(Windows)Git Extensions 客戶端(Windows、Mac、Linux)SmartGit 客戶端(Windows、Mac、Linux)GitEye 客戶端 (Windows、Mac、Linux)gitg 客戶端(Windows、Linux)ungit 客戶端(Windows、Mac、Linux)git-cola 客戶端(Windows、Mac、Linux)Tower 客戶端(Mac)Gitbox 客戶端(Mac)GitUp 客戶端(Mac)六、Git學習資料1、廖雪峰Git教程

https://www.liaoxuefeng.com/wiki/896043488029600

講得很詳細,還配有短影片演示。

2、Learn Git Branching

這是一個可以線上學習Git命令的網站:

七、一些常用命令

以下命令來自:

http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html

1、新建程式碼庫
# 在當前目錄新建一個Git程式碼庫$ git init# 新建一個目錄,將其初始化為Git程式碼庫$ git init [project-name]# 下載一個專案和它的整個程式碼歷史$ git clone [url]
2、配置

Git的設定檔案為.gitconfig,它可以在使用者主目錄下(全域性配置),也可以在專案目錄下(專案配置)。

# 顯示當前的Git配置$ git config --list# 編輯Git配置檔案$ git config -e [--global]# 設定提交程式碼時的使用者資訊$ git config [--global] user.name "[name]"$ git config [--global] user.email "[email address]"
3、增加/刪除檔案
# 新增指定檔案到暫存區$ git add [file1] [file2] ...# 新增指定目錄到暫存區,包括子目錄$ git add [dir]# 添加當前目錄的所有檔案到暫存區$ git add .# 新增每個變化前,都會要求確認# 對於同一個檔案的多處變化,可以實現分次提交$ git add -p# 刪除工作區檔案,並且將這次刪除放入暫存區$ git rm [file1] [file2] ...# 停止追蹤指定檔案,但該檔案會保留在工作區$ git rm --cached [file]# 改名檔案,並且將這個改名放入暫存區$ git mv [file-original] [file-renamed]
4、程式碼提交
# 提交暫存區到倉庫區$ git commit -m [message]# 提交暫存區的指定檔案到倉庫區$ git commit [file1] [file2] ... -m [message]# 提交工作區自上次commit之後的變化,直接到倉庫區$ git commit -a# 提交時顯示所有diff資訊$ git commit -v# 使用一次新的commit,替代上一次提交# 如果程式碼沒有任何新變化,則用來改寫上一次commit的提交資訊$ git commit --amend -m [message]# 重做上一次commit,幷包括指定檔案的新變化$ git commit --amend [file1] [file2] ...
5、分支
# 列出所有本地分支$ git branch# 列出所有遠端分支$ git branch -r# 列出所有本地分支和遠端分支$ git branch -a# 新建一個分支,但依然停留在當前分支$ git branch [branch-name]# 新建一個分支,並切換到該分支$ git checkout -b [branch]# 新建一個分支,指向指定commit$ git branch [branch] [commit]# 新建一個分支,與指定的遠端分支建立追蹤關係$ git branch --track [branch] [remote-branch]# 切換到指定分支,並更新工作區$ git checkout [branch-name]# 切換到上一個分支$ git checkout -# 建立追蹤關係,在現有分支與指定的遠端分支之間$ git branch --set-upstream [branch] [remote-branch]# 合併指定分支到當前分支$ git merge [branch]# 選擇一個commit,合併進當前分支$ git cherry-pick [commit]# 刪除分支$ git branch -d [branch-name]# 刪除遠端分支$ git push origin --delete [branch-name]$ git branch -dr [remote/branch]
6、標籤
# 列出所有tag$ git tag# 新建一個tag在當前commit$ git tag [tag]# 新建一個tag在指定commit$ git tag [tag] [commit]# 刪除本地tag$ git tag -d [tag]# 刪除遠端tag$ git push origin :refs/tags/[tagName]# 檢視tag資訊$ git show [tag]# 提交指定tag$ git push [remote] [tag]# 提交所有tag$ git push [remote] --tags# 新建一個分支,指向某個tag$ git checkout -b [branch] [tag]
7、檢視資訊
# 顯示有變更的檔案$ git status# 顯示當前分支的版本歷史$ git log# 顯示commit歷史,以及每次commit發生變更的檔案$ git log --stat# 搜尋提交歷史,根據關鍵詞$ git log -S [keyword]# 顯示某個commit之後的所有變動,每個commit佔據一行$ git log [tag] HEAD --pretty=format:%s# 顯示某個commit之後的所有變動,其"提交說明"必須符合搜尋條件$ git log [tag] HEAD --grep feature# 顯示某個檔案的版本歷史,包括檔案改名$ git log --follow [file]$ git whatchanged [file]# 顯示指定檔案相關的每一次diff$ git log -p [file]# 顯示過去5次提交$ git log -5 --pretty --oneline# 顯示所有提交過的使用者,按提交次數排序$ git shortlog -sn# 顯示指定檔案是什麼人在什麼時間修改過$ git blame [file]# 顯示暫存區和工作區的差異$ git diff# 顯示暫存區和上一個commit的差異$ git diff --cached [file]# 顯示工作區與當前分支最新commit之間的差異$ git diff HEAD# 顯示兩次提交之間的差異$ git diff [first-branch]...[second-branch]# 顯示今天你寫了多少行程式碼$ git diff --shortstat "@{0 day ago}"# 顯示某次提交的元資料和內容變化$ git show [commit]# 顯示某次提交發生變化的檔案$ git show --name-only [commit]# 顯示某次提交時,某個檔案的內容$ git show [commit]:[filename]# 顯示當前分支的最近幾次提交$ git reflog
8、遠端同步
# 下載遠端倉庫的所有變動$ git fetch [remote]# 顯示所有遠端倉庫$ git remote -v# 顯示某個遠端倉庫的資訊$ git remote show [remote]# 增加一個新的遠端倉庫,並命名$ git remote add [shortname] [url]# 取回遠端倉庫的變化,並與本地分支合併$ git pull [remote] [branch]# 上傳本地指定分支到遠端倉庫$ git push [remote] [branch]# 強行推送當前分支到遠端倉庫,即使有衝突$ git push [remote] --force# 推送所有分支到遠端倉庫$ git push [remote] --all
9、撤銷
# 恢復暫存區的指定檔案到工作區$ git checkout [file]# 恢復某個commit的指定檔案到暫存區和工作區$ git checkout [commit] [file]# 恢復暫存區的所有檔案到工作區$ git checkout .# 重置暫存區的指定檔案,與上一次commit保持一致,但工作區不變$ git reset [file]# 重置暫存區與工作區,與上一次commit保持一致$ git reset --hard# 重置當前分支的指標為指定commit,同時重置暫存區,但工作區不變$ git reset [commit]# 重置當前分支的HEAD為指定commit,同時重置暫存區和工作區,與指定commit一致$ git reset --hard [commit]# 重置當前HEAD為指定commit,但保持暫存區和工作區不變$ git reset --keep [commit]# 新建一個commit,用來撤銷指定commit# 後者的所有變化都將被前者抵消,並且應用到當前分支$ git revert [commit]# 暫時將未提交的變化移除,稍後再移入$ git stash$ git stash pop
10、其他
# 生成一個可供釋出的壓縮包$ git archive

51
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python-自制背題指令碼!你們背過毛概嗎?