天天看點

Git: 非官方指南,快速掌握就靠它了

Git: 非官方指南,快速掌握就靠它了

最近公司來了不少小夥伴,一開始我隻是以為他們對Git使用不熟練,我跟他們零零散散講過幾次Git的一些使用方法,讓他們回去自己上網找些資料看看,感覺對他們來說這些不是什麼問題。直到有一天,我讓他們送出代碼的時候,他們半天都送出不上來。我過去打聽原因的時候,驚訝地發現他們在磁盤裡面的項目都是按日期命名檔案夾存放的,合并代碼是通過手工對比工具完成的。經過交流,我發現他們認為Git的門檻比我想象中還要高。貌似有SVN使用經驗的人學習Git會感覺很不适應。我想隻要把Git的一些概念搞清楚,學習起來應該也不難。于是,我想結合自己粗淺的一些了解,聊聊Git。首先從Git是什麼說起吧。

Git是什麼

事情是這樣的,自2002年開始,林納斯·托瓦茲決定使用BitKeeper作為Linux核心主要的版本控制系統用以維護代碼。到了2005年,Linux核心開發團隊的安德魯·垂鸠寫了一個簡單程式,可以連接配接BitKeeper的存儲庫。這時BitKeeper著作權擁有者拉裡·麥沃伊不高興了,認為這事對BitKeeper内部使用的協定進行逆向工程,于是決定收回Linux核心開發團隊無償使用BitKeeper的許可。這點小事肯定難不倒大神林納斯,僅僅10天之後,第一個git版本就寫出來了。看到這裡大家應該都知道git是一個版本控制管理系統了。對,Git就是一款開源的分布式版本控制系統(Distributed Version Control System)。

版本控制系統

為什麼需要版本控制?舉個栗子,某天産品經理提了一個新需求,程式員阿秃經過連續幾個晚上通宵奮戰,終于用方案A完美實作了。然後高興都跑去讓産品經理驗收。産品經理看完後,丢給阿秃一句,這是什麼狗屎?不行,給我換方案B重做。阿秃隻好把方案A的代碼都删了,按照方案B,再經過幾個晚上的奮戰,用方案B把需求實作了。阿秃又高興地跑去讓産品經理驗收。這時産品經理說,好像還是方案A合理一點,你給我改回方案A吧……此時阿秃是奔潰的,因為他沒有使用版本控制工具。如果使用Git做版本控制的話,隻需在鍵盤上敲入幾行指令就能找回方案A的代碼,阿秃自然不用再通宵了。版本控制是指對軟體開發過程中各種程式代碼、配置檔案及說明文檔等檔案變更的管理,是軟體配置管理的核心思想之一。運用版本控制系統,我們可以對代碼進行版本管理,可以随時檢視之前版本的内容,随時回溯到之前版本中。團隊合作的時候也可以自動合并代碼,而不需要用一個共享檔案,或者是進行定期的備份。

集中式和分布式版本控制系統

要了解SVN和Git的使用差别為什麼那麼大,最直接的辦法是搞清楚集中式和分布式版本控制系統之間的差别。集中式版本控制系統有單一的集中管理伺服器,儲存所有檔案的修訂版本,所有的檔案。用戶端的電腦并不會儲存曆史版本,是以如果想檢視曆史版本,必須聯網才能檢視,并且如果集中管理的伺服器出現故障,可能導緻曆史版本丢失,最多隻能從本地的檔案恢複到最後的版本。另外網速直接影響送出和下載下傳檔案的速度,很多時候很影響使用體驗。

分布式版本控制系統沒有集中管理的伺服器,每個人的電腦都有一個完整的版本庫,我們可以在本地進行修改送出,檢視曆史版本。這裡很多人有個疑問,我們平時工作中,經常把代碼推到“遠端倉庫”,這個“遠端倉庫”不就是集中式版本控制系統裡面的集中管理伺服器嘛?其實,這隻是分布式版本控制系統裡面的一個節點而已,這和你自己的電腦還有你同僚阿秃的電腦一樣,都是可以了解為其中一個節點。為了協作友善,我們都在這個“遠端倉庫”上面交換“修改”,是以容易給大家造成中央伺服器的錯覺。

基本概念

工作拷貝(工作目錄):用于存放産品開發資料本地工作目錄。

暫存區 (Index):用于存放待送出資料的緩存區。

本地倉庫:遠端庫的一個完整的拷貝,包括所有檔案的修改記錄,分支等。

遠端倉庫:本地倉庫clone來源。

快照(snapshot):版本庫某個時間點所有檔案集合。

全球版本号(commitID):Git庫的版本号是通過SHA-1算法根據庫中的所有内容計算出一個40位的哈希值,這個哈希值是全球唯一的,基本隻要前六位就可以唯一辨別了。

了解修改檔案在Git的流動

我們所有修改都是在工作目錄進行的,修改完以後需要先添加到暫存區,然後再送出到本地倉庫。送出完以後會産生commitID,辨別當次送出。在之後的操作中,可以通過commitID復原到某次送出狀态。最後,我們還需要把本地的倉庫的送出記錄推送到遠端倉庫。

基本操作

初始化倉庫

倉庫的初始化有兩種方式,第一張是直接在目前目錄初始化,執行如下指令:

git init           

另外一種是從遠端倉庫克隆,執行指令如下:

git clone 中心庫名稱位址  本地工作目錄名稱           
添加檔案到暫存區

實際工作中,我們在本地初始化倉庫以後,就會往工作目錄裡面新增檔案或者修改倉庫裡面已有的檔案,當我們完成我們的新增或者修改後,需要把新增或者修改的檔案添加到暫存區,執行指令如下:

git add 檔案名           

添加所有檔案可以執行以下指令:

git add.           
送出到本地倉庫

接下來,我們就需要把暫存區的檔案送出到本地倉庫,執行指令如下:

git commit -m '送出資訊'           
更新本地分支

在我們把本地倉庫的送出記錄push到遠端倉庫之前,最好先pull遠端倉庫對應的“追蹤分支”的更新。我們需要用到git pull 指令。git pull 指令的作用是拉取遠端主機某個分支的更新,并與本地指定分支合并。很多時候代碼沖突是需要在這時候解決的。git pull的完整使用方法如下:

git pull <遠端主機名> <遠端分支名>:<本地分支名>           

其實Git本地分支和遠端分支之間可以建立一種追蹤關系(tracking)。在使用git clone初始化倉庫的時候,所有本地分支預設與遠端倉庫的同名分支建立追蹤關系。比如,本地的master分支自動追蹤origin/master分支。

注意:origin一般指原始倉庫位址的别名

另外也可以手動建立這種追蹤關系,指令如下:

git branch --track <本地分支名> <遠端主機名>/<遠端分支名>           

如果目前本地分支和遠端分支建立了追蹤關系,使用git pull就可以省略遠端分支名,指令如下:

git pull origin           

如果目前分支隻有一個追蹤分支,那麼遠端主機名也可以省略,指令如下:

git pull           
本地倉庫送出記錄推送到遠端倉庫

為了實作團隊協作,我們的更改,最終肯定需要推送到遠端倉庫,讓團隊中的其他同學合并的。這裡我們使用git push指令,完整指令如下:

git push <遠端主機名> <本地分支名>:<遠端分支名>           

和git pull一樣,如果本地分支和遠端分支之間存在“追蹤關系”,我們可以省略遠端分支名,指令如下:

git push <遠端主機名> <本地分支名>           

這裡需要注意,如果省略的是本地分支名,就相當于把一個空的本地分支推送到遠端分支,這個操作就是删除遠端分支。

git push <遠端主機名> :<遠端分支名>

#相當于

git push <遠端主機名> --delete <遠端分支名>           
檢視送出曆史

很多時候由于各種原因,我們需要復原到某次曆史送出,這時候可以通過一下指令檢視:

git log           
代碼復原
代碼復原主要有兩種方式,git revert和git reset。           

git revet是送出復原,即忽略指定的版本,然後送出一個新的版本。新的版本中會删除指定的版本。注意:git revert是會産生一次新的送出的。

git revert < commitID >           

git reset的作用是重置到指定的版本。通常是配合以下兩種參數一起使用的: —soft 和 —hard。

  • 預設參數 —soft, 所有commit的修改都會退回到git緩沖區。
  • 參數—hard,所有commit的修改直接丢棄。

指令如下:

#回退到上個版本

git reset --hard HEAD^      
#退到/進到 指定commitID 

git reset --hard < commitID >           

人生總是無常的,有時候你復原完代碼後,可能你又後悔了,你又想復原到你復原之前,怎麼辦?git reflog可以幫到你。你用git reflog列印你的每一次操作,找到你的操作id,就可以輕松回到你復原之前的版本了。具體指令如下:

#檢視你復原操作,找到復原操作的commitID

git reflog
#回退到指定的復原版本

git reset --hard < commitID >           

總結

git之是以如此強大,是因為它可以通過各種指令靈活使用,應對各種複雜的場景。機械地記憶幾條指令的組合是沒辦法滿足各種使用場景的,是以有時間還是需要慢慢了解各個指令的使用細節。熟練掌握上面那幾條指令應該可以應付日常工作的大部分使用場景了,當然git還有很多其他很強大的指令,大家可以深入學習一下。

原文釋出時間為:2018-10-29

本文作者:勞大濕

本文來自雲栖社群合作夥伴“

終端研發部

”,了解相關資訊可以關注“

”。

繼續閱讀