程式碼版本控制對於我們嵌入式軟體開發崗是一項基礎、必備的技能,需要熟練掌握。實際工作中常用的版本控制系統有: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