git快速入門

背景

git作為現在最為流行的版本管理系統,大部分公司都使用git進行版本控制,

並且最大同性交友網站github也是在git的基礎上建立的。

很多人認為git難,在於它的一些概念與之前流行的集中化的版本管理系統有所出入,

只要通過熟悉git的基本概念,以及git分支切換的流程,想要上手還是很容易的。

這篇文章將介紹git的一些基本概念以及git常用的一些命令。github官方提供了一套git學習教程,感興趣可以去看看。

分散式的版本庫

基本概念

首先,看看官網是怎麼介紹git的。

Git is a free and open source distributed version control system.

Git是一個免費並且開源的分散式版本管理工具。

重點就在於git的分散式,只需要在項目根目錄執行git init你就擁有了一個git版本庫,

同時在該目錄下會生成一個.git文件夾,該文件夾用來記錄你所有的提交信息,類似與.svn文件夾。

該文件夾會存儲你每次提交的文件的全部信息,只是會經過壓縮,具體內容這裡不做深入展開。

如果你對git的內部原理感興趣可以看

這裡。

與集中式的版本管理工具不同,git的commit之後提交到本地的版本庫,

像svn的commit則是直接提交到伺服器的中央版本庫。

這就意味這我們都在本地具有一個版本庫,那麼多人開發時,我們需要如何管理我們的版本庫呢?

這裡git就引入了一個遠程版本庫的概念,遠程版本庫並不會記錄我們的代碼文件,

只是一個裸倉庫,也就是說遠程版本庫只會保存.git目錄下的東西,這也相當於間接的記錄我們的代碼文件。

每個人都能讓遠程版本庫同步你本地的commit信息,但是同步之前會檢查你本地的版本庫是否與遠程版本庫的提交信息一致,

如果不一致會提醒你先從遠程版本庫進行更新。唉,千言萬語不如一張圖。

  1. 當我們告訴遠程版本庫,我有一個新的提交需要你同步,它會拒絕你。
  2. 因為在你之前有一個人先同步了提交到遠程分支,你必須更新他的提交到你本地,你才能繼續同步你的提交。

git在提交到版本庫之前,還有一個步驟,那就是添加到暫存區,至於git為什麼會存在暫存區,知乎上有個回答我覺得說得挺好的(傳送門)。

大致意思是說,早期的版本管理工具有成熟的gui,比如用svn,每一次提交都能讓你自由選擇需要提交哪些文件的修改。

而在命令行下面,這些操作比較麻煩,為了解決這個問題,於是在commit之前增加了一個暫存區,用來存放我們需要提交的文件。好了,我們再回過頭來看看git在版本管理上分了哪些部分。

git命令簡介

了解了這些概念,我們再來看看,如何初始化一個git倉庫,並且在修改代碼後將提交同步給遠程版本庫。

初始化git配置

該配置是用來告訴版本庫是誰提交代碼。

#全局設置用戶名git config --global user.name "your name"#全局設置郵箱git config --global user.email "xxxxxxxxx@qq.com"

初始化git倉庫

這裡有兩種方式,一種是新建一個本地版本庫,然後手動連接遠程版本庫,還一種是直接獲取遠程版本到本地。

  1. 新建本地倉庫,並與遠程版本庫進行連接

mkdir hub && cd hubgit init #初始化git倉庫git remote add origin git@github.com:github/hub.git #關聯遠程版本庫,並取名為origingit pull origin master #獲取名為origin的遠程版本庫的提交信息到本地版本庫

  1. 獲取遠程的版本庫到本地

git clone git@github.com:github/hub.git #該命令相當於上面三步的縮寫

修改文件並提交到暫存區

我們可以新建一個文件(eg. reamde.md),然後通過add命令,將該文件添加到暫存區,表示該文件是我們要提交到版本庫的文件。

# 將一個修改後的文件添加到暫存區git add readme.md# gitadd其他用法# 添加所有修改、刪除或新建的文件到暫存區git add .# 添加所有以js結尾的文件到暫存區git add *.js# 添加所有修改、刪除或新建的文件到暫存區# 除了.開頭的文件,比如 .gitignoregit add *# git add --update 的縮寫# 如果再次修改了在暫存區中的文件,可以通過該命令進行更新git add -u# 作用與git add . 相同git add -A

提交代碼到版本庫

我們現在已經把代碼添加到了暫存區,接下來就需要把暫存區的代碼提交到版本庫。

# 提交暫存區的代碼到版本庫git commit -m commit message# 如果你重新編輯了一些文件,添加到暫存區,想把這些修改合併到上一次提交# 然後會出現一個編輯框,讓你修改上次的提交信息git commit --amend# 如果不想修改上次的提交信息git commit --amend --no-edit

同步遠程版本庫到本地版本庫

最好每次把自己的提交信息同步給遠程版本庫之前,先把遠程版本庫同步到本地。

這裡會涉及到分支的概念,我們先放到一邊,本地版本庫默認默認為master分支

(ps. 也就是我們常說的主幹)。

# 將名為origin的遠程版本庫的master分支同步到本地的當前分支git pull origin master# git pull命令其實是如下兩個命令的簡寫git fetch origin mastergit merge origin/master

同步本地版本庫到遠程版本庫

git將本地版本庫同步到遠程版本庫使用push命令,但是每次都需要指定同步給哪個版本庫的哪一個分支,

這時,你可以使用-u參數將本地版本庫與遠程版本庫綁定,以後提交就不需要指定,默認提交到那個版本庫。

# 將本地的提交同步給遠程版本庫git push origin master# 綁定默認提交的遠程版本庫git push -u origin master# 下次提交只需要使用git push就可以了git push

git分支

git的分支是git版本管理的重點,git的分支對比svn十分輕量級。

注意,前方高能!!!

為了講清楚這些概念得畫一些圖,沒辦法美術功底太好,話又不會說,只好畫圖寫教程了。

何為分支

要搞清楚git的分支概念,首先需要知道git是如何區分不同的分支的。

在git中,一個分支就會存在有一個指針,該指針指向一個commit。

每次拉分支就會在當前commit上創建一個新的指針,而且分支的指針每次都會跟隨commit前移。

# 查看當前分支git branch #剛剛初始化的版本庫默認在master分支上# 新建分支git branch branch #新建一個名為branch的分支

那麼現在有個問題,在新建一個分支之後,兩個分支指向同一個commit,到底怎麼區分現在哪個分支上呢?

這裡就要引入一個新的指針HEAD,用來指向當前所處的分支。

# 切換分支git checkout branch #切換到branch分支# 創建分支與切換分支可以簡寫為一個命令gti checkout -b branch

現在在branch分支上進行了一次commit,然後branch指針就像向前移動。

vim xxx.txtgit add.git commit -m modify xxx.txt

然後再切換到master分支,進行一次提交,看下圖就會發現,這裡會出現分支。

master分支表示的是commit1、2、3、5,而branch分支commit1、2、3、4。

到這裡就很容易理解為什麼說git的分支很輕量級,因為對git來說一個分支只是會新建一個指針,

並指向一個提交,而不是拷貝所有的代碼文件到另一個目錄。

git checkout master #切換到master分支vim yyy.txtgit add.git commit -m modify yyy.txt

合併分支

天下三分,分久必合,合久必分。

有分支就會有合併,舉個例子,項目中突然來了個bug,但是手頭的代碼還沒寫完,不可能直接提交。所以你要先從master分支拉出一個Fix-Bug分支,在分支上修改好之後再進行提交。最後這個提交需要merge回master分支。

#1. 先創建feature分支,將手頭的代碼提交到feature分支上git checkout -b featuregit add .git commit -m feature branch commit#2. 切換回master分支,從master拉一個新的分支git checkout mastergit checkout -b Fix-Bug#3. bug修改完畢後,提交代碼到Fix-Bug分支git add .git commit -m fixed bug#4. 把修復了bug的代碼merge到master分支git checkout master #重新切換回master分支git pull origin master #把同事提交的代碼先更新到本地git merge Fix-Buggit push origin master #將merge的代碼同步到線上,進行bug修復git branch -d Fix-Bug #bug修復後將Fix-Bug分支刪除

上面只是進行了簡單的演示,真實情況比這更加複雜。

觀察上圖,可以發現在merge操作後,自動會生成一個新的commit。如果你不想生成這個commit,

merge之後還有其他修改,或者想要自己寫commit的message,也可以使用如下命令來取消自動commit。

git merge --no-commit branch

merge的特殊情況:衝突

有時候遠程版本庫和本地版本庫進行merge的時候,你和你的同事可能同事修改了同一個文件的同一個位置,這就會出現衝突。

出現衝突怎麼辦,當然是解決衝突。解決衝突你可以自己一個個手動去解決,當然你也可以使用一些工具,比如下圖使用vscode來解決衝突。

可以通過git status查看哪些文件出現了衝突,通過編輯器將所有衝突解決後就可以進行提交了。

常見的git分支管理模式:gitflow

這裡主要涉及常用的分支的命名規範:

  1. master主幹,用來存放最穩定的代碼
  2. hotfix,用來緊急修改bug的分支
  3. release,用來發布上線的分支
  4. feature,特性分支,每一個新功能都應該有一個特性分支
  5. develop,開發分支,當特性開發完畢後,將特性分支合併到develop分支

參考

這裡只是介紹了git中最基本的一些概念,git還有很多高級命令待大家去發現,比如rebase、reset、stash。

最後給大家推薦一些git的好教程。

  1. pro git
  2. git常用命令匯總
  3. git push與pull的默認行為

推薦閱讀:

Git由淺入深之操作與指令
一入前端深似海,從此紅塵是路人系列第十彈之如何合理利用Git進行團隊協作(一)
說說Git reset 與 revert 的故事
git文件狀態,暫存與提交
git分支

TAG:互聯網 | GitHub | Git |