【原創】Git版本控制器的基本使用

關於git

Git,是一個分佈式版本控制軟件。最初本是爲了更好的管理Linux內核開發而被林納斯·託瓦茲開發,後來由於項目開發中版本控制的強烈需求,而git也日趨成熟,最終成爲了一個獨立的版本控制軟件。css

git使用方法

建立遠程倉庫

創建遠程倉庫,說得白話一點就是在代碼託管服務器上給我分配一片可遠程訪問的空間。其實跟git的使用沒有直接的關係,可是爲了更好的說明問題,咱就稍微囉嗦下。git

目前支持git的代碼託管服務不少,名氣最大的莫過於Github,其餘還有GitLabBitbucketCSDN-CODEGit@OSC等等。咱們先來講說爲何須要代碼託管服務器,不管咱們開發的是我的項目仍是團隊項目,從長遠來看,將代碼託管到遠程服務器上都是比較好的選擇。理由很容易想到:github

  • 一、方便多人(有權限)共享,團隊開發尤其重要;
  • 二、不怕更換電腦,公司和家裏或出差,只要有電腦就能夠訪問;
  • 三、不怕硬盤損壞代碼丟失;
  • 四、其餘還有不少。

基於以上代碼託管服務器,創建一個遠程倉庫很是簡單,以Github爲例,打開https://github.com首頁登陸進去後,頁面右上角有一個「+」圖標,鼠標點上去就看到如圖所示的樣子:bash

New repository

點擊紅框標示的那個鏈接,而後填寫關鍵信息,根據提示就建立好了。服務器

建立本地代碼庫(init)

本地代碼庫,其實就是咱們的代碼目錄,若是非要區別普通代碼目錄和git倉庫目錄,那就是基於git的代碼目錄裏面會多一個.git的目錄,這個目錄通常是不可見的。如何將一個普通代碼目錄變成git工做目錄,其實很簡單。咱們可使用cmdgit bash或任何一個命令行工具,進入工做目錄,而後運行下面這行代碼就能夠了:網絡

git init

當本地倉庫初始化好後,其實咱們已經可使用git工做了,好比將代碼文件添加到版本記錄,建立本地分支,合併本地分支代碼等等。編輯器

綁定本地代碼庫與遠程倉庫(remote | clone)

若是僅僅使用git在本地搗鼓,那麼咱們上面提到的遠程代碼託管的優點就徹底沒有意義了,因此咱們要把咱們的本地倉庫和遠程倉庫綁定起來,這裏就要分狀況了。分佈式

  1. 若是是如今本地已經開發的一個全新項目須要推送到遠程倉庫,你須要先這麼作:ide

    git remote add origin https://github.com/username/project.git
  2. 若是是在別人已經開發過的倉庫中繼續開發,咱們不須要預先創建並初始化本地倉庫,直接執行下面這條命令就能夠了:工具

    git clone https://github.com/username/project.git

查看倉庫文件狀態(status)

當咱們已經擁有一個本地git倉庫或對咱們的項目進行了修改後,咱們可能火燒眉毛的想看看咱們項目中各個文件的當前狀態,咱們只需在git bash中執行:

git status

一般狀況下,咱們可能看到一堆紅色標記的列表,包括如下信息:

  1. Changes to be committed:等待提交的更改
    • new file:新增文件
    • modified:有改動的文件
    • deleted:刪除的文件
  2. 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的使用,可讓咱們在工做中如虎添翼。本文僅僅在筆者能力範圍以內列舉了最基本的使用方法,若有不當之處,歡迎讀者朋友們熱心指正。若有興趣,推薦閱讀:

做者博客:百碼山莊

相關文章
相關標籤/搜索