Git版本控制器的基本使用
Git,是一個分布式版本控制軟件。最初本是為了更好的管理Linux內核開發而被林納斯·托瓦茲開發,后來因為項目開發中版本控制的強烈需求,而git也日趨成熟,最終成為了一個獨立的版本控制軟件。
關于git
Git,是一個分布式版本控制軟件。最初本是為了更好的管理Linux內核開發而被林納斯·托瓦茲開發,后來因為項目開發中版本控制的強烈需求,而git也日趨成熟,最終成為了一個獨立的版本控制軟件。
git使用方法
創建遠程倉庫
建立遠程倉庫,說得白話一點就是在代碼托管服務器上給我分配一片可遠程訪問的空間。其實跟git的使用沒有直接的關系,但是為了更好的說明問題,咱就稍微啰嗦下。
目前支持git的代碼托管服務很多,名氣最大的莫過于Github,其他還有GitLab、Bitbucket、CSDN-CODE、Git@OSC等等。我們先來說說為什么需要代碼托管服務器,無論我們開發的是個人項目還是團隊項目,從長遠來看,將代碼托管到遠程服務器上都是比較好的選擇。理由很容易想到:
- 1、方便多人(有權限)共享,團隊開發尤為重要;
- 2、不怕更換電腦,公司和家里或出差,只要有電腦就可以訪問;
- 3、不怕硬盤損壞代碼丟失;
- 4、其他還有很多。
基于以上代碼托管服務器,建立一個遠程倉庫非常簡單,以Github為例,打開https://github.com首頁登錄進去后,頁面右上角有一個“+”圖標,鼠標點上去就看到如圖所示的樣子:
點擊紅框標示的那個連接,然后填寫關鍵信息,根據提示就創建好了。
創建本地代碼庫(init)
本地代碼庫,其實就是我們的代碼目錄,如果非要區別普通代碼目錄和git倉庫目錄,那就是基于git的代碼目錄里面會多一個.git的目錄,這個目錄一般是不可見的。如何將一個普通代碼目錄變成git工作目錄,其實很簡單。我們可以使用cmd、git bash或任何一個命令行工具,進入工作目錄,然后運行下面這行代碼就可以了:
git init
當本地倉庫初始化好后,其實我們已經可以使用git工作了,比如將代碼文件添加到版本記錄,創建本地分支,合并本地分支代碼等等。
綁定本地代碼庫與遠程倉庫(remote | clone)
如果僅僅使用git在本地搗鼓,那么我們上面提到的遠程代碼托管的優勢就完全沒有意義了,所以我們要把我們的本地倉庫和遠程倉庫綁定起來,這里就要分情況了。
-
如果是現在本地已經開發的一個全新項目需要推送到遠程倉庫,你需要先這么做:
git remote add origin https://github.com/username/project.git
-
如果是在別人已經開發過的倉庫中繼續開發,我們不需要預先建立并初始化本地倉庫,直接執行下面這條命令就可以了:
git clone https://github.com/username/project.git
查看倉庫文件狀態(status)
當我們已經擁有一個本地git倉庫或對我們的項目進行了修改后,我們可能迫不及待的想看看我們項目中各個文件的當前狀態,我們只需在git bash中執行:
git status
通常情況下,我們可能看到一堆紅色標記的列表,包括以下信息:
- Changes to be committed:等待提交的更改
- new file:新增文件
- modified:有改動的文件
- deleted:刪除的文件
- Untracked files:未添加到版本記錄的文件
如果是一個全新倉庫,我們只能看到Untracked files項。
添加文件并提交到暫存區(add & commit)
當我們通過git status看到有紅色文件列表,而且其中有我們想要保存到遠程倉庫中的文件時,我們可通過git add <filename>命令,將相應文件添加到暫存區,我們也可以通過git add .命令,添加所有新增或有更新的文件,但這里要注意刪除的文件不會被添加。
添加刪除的文件需要使用git add -u <filename>或git add -u .命令。
接下來我們還需要執行一個命令git commit,才能將添加的文件(變化)提交到暫存區。這個命令的用法也有幾種,常見的是直接執行git commit -m 'log info',還有一種是執行git commit打開指定編輯器,編輯好日志后關閉編輯器即可,一般用于日志內容比較多的情況。
創建并切換分支(branch & checkout)
在實際開發過程中,我們需要考慮代碼的穩定性,未經過測試的代碼不能發布到線上環境。這就意味著我們如果我們一直在一個分支上開發代碼是很危險的, 一步留神就可能把有bug的代碼提交到了遠程倉庫,造成不必要的麻煩,所以一般情況下使用版本控制器,我們都會使用它的分支功能。即開發分支、主干分支, 當開發分支上的代碼測試穩定后,再合并到主干分支,將主干分支提交到遠程倉庫,這樣出錯的概率就降低了很多。
使用git bash可以很方便的建立分支,我們只需執行git branch newbranch即可創建一個名為newbranch的分支,然后我們只需執行git checkout newbranch命令,即可將我們的工作環境切換到newbranch分支上。
還有一種更為簡便的方法,可以直接使用checkout命令,完成創建并切換到分支:
git checkout -b newbranch
合并分支(merge)
前面我們提到了,當開發分支上的代碼測試穩定后,我們就可以合并到主干分支上,并提交到遠程倉庫。那么如何合并兩個分支的代碼成了一個問題。難道要 對比兩個文件的差異,一行一行的copy代碼?顯然git不會這么笨,它是很智能的,我們只需簡單的運行一條命令即可完成代碼自動合并。我們設想開發分支 (newbranch)將被合并到主干分支(master)上,那么首先我們要先將開發分支的代碼提交到暫存區,然后切換到主干分支,最后執行合并操作, 完整的操作流程大致如下:
git add . git commit -m 'newbranch 上的變動內容' git checkout master git merge newbranch
但是,我們在合并代碼的時候,特別是多人開發的時候,偶爾出現沖突(兩個人同時改動了同一個地方)也是在所難免的,這種情況,我么恐怕就需要人肉解決下了。不過問題不大,git將文件沖突的地方都會以特殊的形式標明的。
# 沖突示例 <<<<<<< HEAD aa # 當前分支上的內容 ======= bb # 被合并分支上的內容 >>>>>>> nb
將本地代碼推送到遠程倉庫(push)
當開發分支上的代碼都被合并到主干分支上,并且所有的沖突都解決好后,我們就可以將主干分支的代碼推送到遠程倉庫,提供給別人使用了。這一步很簡單:
git push origin master
還記得我們執行git remote add后面的origin嗎?這里和那里是一樣的哦,而最后那個master就是分支名稱了。如果遠程已經有該分支,便會先檢查遠程倉庫在最近一次更新之后發生過更改,如果有會提示先進行更新代碼,然后再提交。如果未變動過,本地代碼則會直接提交至遠程代碼倉庫。
將遠程倉庫中的代碼更新到本地(pull & fetch)
然而,一般情況下,我們在執行git push之前,都會先更新一次遠程倉庫中的內容:
git pull origin master
這里我們需要注意一下,和git merge命令一樣,pull命令是有可能導致代碼沖突的。而pull命令從某種意義來講實際和fetch+merge命令一樣,這里就不再對fetch做進一步說明了。
比較代碼差異(diff)
通常我們在開發過程中涉及的文件比較多,修改的地方也比較多,當我們需要提交代碼的時候,往往想不起來我們修改了哪些內容,哪些問需被提交。這時候我們可能希望能查看一下在前次提交代碼之后我們對本地倉庫所做的改動,那么你可以這么做:
git diff
查看working tree和index file的差別,也可以:
git diff --cached
查看index file與commit的差別,還可以:
git diff HEAD
查看working tree和commit的差別。
diff命令的使用,大致就是這個樣子,她們之間的細節差異,可以通過網絡查找更詳細的說明,也可以在實際使用中自己去觀察,這里就不做贅述了。
代碼回滾與日志(reset & log)
當我們的項目開發到一定階段后,也許偶爾就發現該版本的升級存在問題,需要臨時將項目恢復到上一個穩定版本。但是,人肉的將升級代碼改回去,顯然是不現實的,更科學的解決方法是使用git的reset命令:
git reset --hard commitId
將本地倉庫代碼回滾到commitId對應的版本,或者:
git reset --hard HEAD~number
將最近number次的提交進行回滾,number為一個整數。那么問題來了,當我們需要回滾到指定版本的時候,commitId從何而來?我們怎么知道哪個commit是最近的穩定版本?
說到這里,就該log命令出場了。我們可以使用log命令,查看倉庫的提交歷史,以及每個提交的更改日志,甚至更改的內容,其最基本的用法如下:
git log -2 # 查看最近兩次的提交歷史 git log # 默認會輸出所有的提交歷史,最近的在最上面
我們可以根據日志內容,找到響應的穩定版本代碼的commitId,然后再使用reset命令進行代碼恢復。怎么樣,是不是很強大?但是筆者要告訴 你的是,reset和log命令非常強大,參數也比較多,特別是log命令,上面僅僅列舉了最最基本的使用方法,如果讀者還想了解更多,更深入的東西,還 需要翻看更多,更全面的資料學習。由于筆者能力有限,且考慮到篇幅問題,就不再啰嗦了。
給代碼庫打標簽(tag)
tag命令,是用來給我們的代碼庫打標簽的。聽起來可能有些不太理解,其實日常使用中,通常是用來添加版本標記。
git tag v1.0.0
表明在這里我們發布了1.0.0版本。這樣就可以很方便的讓我們回顧項目每個版本的樣子,歷史就是這樣用血寫成的。我們也可以通過tag命令查看已有的標簽,只需要執行:
git tag
這樣就行了。
打造自己的git命令
Git已然非常強大,而且git的命令也已經非常簡潔明了。但是,開發者們往往希望使用工具的同時能保留自己的個性,希望能符合自己的操作習慣。比 如筆者就嫌checkout命令太長了,雖然各種自動補全,但用起來還是覺得不順手,那么有沒有什么辦法可以再簡潔些呢?答案是肯定的。下面給大家列出筆 者的縮寫配置,當然也是曾經參考了很多網上大牛們的教程的。
git config --global alias.st status git config --global alias.br branch git config --global alias.co checkout git config --global alias.ci commit
配置好后再輸入git命令的時候就不用再輸入一大段了,例如我們要查看狀態,只需:
git st
是不是很方便?這里只列了一些最為簡單的配置,以拋磚引玉,更多更高大上的配置,就待讀者深入挖掘了。
總結
Git是一款非常強大的分布式版本控制工具,掌握git的使用,可以讓我們在工作中如虎添翼。本文僅僅在筆者能力范圍之內列舉了最基本的使用方法,如有不當之處,歡迎讀者朋友們熱心指正。如有興趣,推薦閱讀:
作者博客:百碼山莊