版本控制
基本概念
版本控制是一個非常簡單的概念,我舉個例子簡單說明一下你就能大概明白它是一個什么東西,當你不會版本控制的時候:
-
你的BOSS決定做一款灰常牛逼的軟件,找你進行開發
-
當你做好之后,老板又突發奇想覺得加入一個新功能就更好了
-
當你添加上新功能之后,老板覺得該功能可能又不太好,讓你去掉它
-
當你去掉這個功能的時候,老板說鐵汁,你還是把它加上來吧,我突然覺得這個功能又挺好的
-
你心里想老板我不干了,你自己來弄吧,但是現實確讓你抱起鍵盤乖乖就范
這個時候聰明的同學可能會這個樣子做,在做完基本功能后進行拷貝,再到拷貝的副本上做出修改添加上新功能,這樣不管老板怎么奇思妙想你都有應對之策:
那么這就是一個最簡單的版本控制了,是不是非常簡單?
歷史發展
版本控制大概經歷了四個階段,如下:
- 文件夾拷貝
- 本地版本控制
- 集中式版本控制
- 分布式版本控制
文件夾拷貝
這個不必多說了,相信傻子都明白,正如上面示例中提到的對原產品進行拷貝后再添加新功能。
這個也確實是很長一段時間中的解決方案,但是它有一個非常大的問題,比如我原產品的代碼有十萬行,我的新功能有兩萬行,那么我的原產品(V1
)加上我的新功能(V2
)就要有二十二萬行代碼進行存儲,非常的浪費存儲空間(V1
十萬行,V2
十二萬行)。
本地版本控制
到了后面,逐漸的出現了一些軟件,它可以幫助我們做版本控制,而並非由我們手動進行拷貝。
並且,它有以下幾個特點:
1.同一時間只能看到一個版本,如果你想回到之前版本,就可以通過其命令等操作方式進行回滾
2.不會很干脆的進行拷貝,而是在原有代碼的基礎上進行增量更新,這意味着我兩個版本的存儲總代碼量只有十四萬行,非常節約空間
記住,第一個特點十分的具有代表性,那么下面放上一張Git
官網的圖片,你可以清晰的看見,同一時間我們只能看到一個文件,但是在版本庫中會存儲多個版本:
集中式版本控制
慢慢的,大家都開始發現單兵作戰不能解決全部的問題,我們需要共同生產。
所以當有多名開發者同時進行開發時,就需要有一個公共的倉庫來進行存放代碼,那么現在的代碼都會提交至一個共有倉庫中,這樣一來就解決了協同開發的問題,但是相應的,如果存放共有倉庫的計算機一宕機,那么大家都不能進行生產了,如果情況更加糟糕比如共有倉庫中的磁盤損壞,那么大家這么久以來的辛苦就全都白費了。
這里還是舉兩個特征,來進行闡述:
1.集中式版本控制主要用於解決協同開發
2.所有代碼都只提交至共有倉庫,這樣會帶來一些安全隱患
分布式版本控制
為了解決集中式版本控制的弊端,后來出現了分布式版本控制,諸如 Git
、Mercurial
、Bazaar
以及 Darcs
等,你可以選擇將自己寫好的代碼推送到本地,也可以選擇推送到遠程倉庫。對於目前而言,這是一種非常棒的解決方案,如圖所示:
你可以在同一個項目中,分別和不同工作小組的人相互協作。 你可以根據需要設定不同的協作流程,比如層次模型式的工作流,而這在以前的集中式系統中是無法實現的。
Git介紹
基本介紹
Git
是分布式的版本控制軟件,以下是它的官方網站:
它的文檔說明十分詳細,並且使用簡單,目前在大多數場景下我們都會選擇Git
來做版本控制。
所以說,學習它已經是大勢所趨了,逃避不了的,面對疾風吧。
下載安裝
官方說明已經非常詳細了,進行查看即可,里面包含了Windows
/Linux
/Mac
的安裝步驟:
下面我們用Windows
做一下示例,當你下載完成后一直點擊下一步即可,安裝完成當在桌面右擊鼠標如果出現下面兩個選項,則代表安裝完成。
本地倉庫
由於Git
是分布式的版本控制軟件,所以我們先學習如何將代碼提交至本地,然后再看如何提交至遠端代碼庫。
版本提交
在Git
中,我們首先要做的就是對一個項目進行管理。
進入項目文件夾,執行初始化命令即可由Git
接管當前項目的版本控制。
如下我們有一個mysite
的項目,在里面有一個index.html
,內容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>主站</title>
</head>
<body>
<h1>歡迎來到我的主站</h1>
<ul>
<li>我的喜歡</li>
<li>我的收藏</li>
<li>我的關注</li>
<li>歷史記錄</li>
</ul>
</body>
</html>
現在,我們需要打開terminal
,然后進入到該文件夾下,讓Git
進行接管mysite
文件夾。
或者你可以直接在文件夾下單擊鼠標右鍵,選擇Git Bash Here
后在其終端中輸入以下命令:
git init
當初始化命令生效后,在mysite
文件夾中會生成一個.git
的隱藏文件夾。
然后我們使用以下命令來檢測當前文件夾中被管理的文件狀態,輸入以下命令:
git status
新增的文件和修改后的文件均屬於未被管理的文件,呈現紅色狀態,如下所示:
接下來我們來管理該文件,有兩條命令可供你選擇:
git add 文件名 # 僅僅管理一個文件
git add . # 代表當前目錄下的所有文件
在這里我們使用git add .
即可,當輸入該命令后再次查看文件狀態,會發現變成了綠色:
接下來我們開始生成第一個版本,就取名v1
吧。執行以下命令進行版本生成:
git commit -m "描述信息"
在這里它會提示一個異常,大概意思就是讓你進行用戶信息配置,輸入用戶名、郵箱等信息(只輸入一次):
那么我們來配置一下個人信息,按照它提供的命令輸入:
git config --global user.email "郵箱地址"
git config --global user.name "用戶名"
然后再來輸入git commit -m "描述信息"
提交版本,會顯示提交成功。
接下來使用git log
命令查看生成的版本:
git log
好了,那么現在做一下命令小結:
命令 | 描述 |
---|---|
git init | 初始化git,讓git接管當前文件夾 |
git status | 查看當前文件狀態,新增或修改的文件都呈紅色,而執行add命令后的文件都呈綠色 |
git add [./filename] | 將文件進行提交 |
git commit -m "描述信息" | 生成一個版本 |
git log | 查看版本提交信息 |
修改新增
當你對項目中的文件進行變動時,也會被Git
進行檢測到。如下所示,我們除開index.html
外還新增了backend.html
文件。
內容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>后台管理</title>
</head>
<body>
<h1>歡迎進入后台管理</h1>
</body>
</html>
現在,當我們使用git status
后,將會看到backend.html
呈紅色狀態。
此時我們仍然需要執行上面的步驟,來生成第二個版本。
版本回滾
如果現在你的Boss
告訴你后台功能暫時不需要,你就需要進行版本回滾,將第二版回滾到第一版。
時候如下命令進行回滾:
# 高版本回滾到低版本,先查看版本號,再設置回滾
git log
git reset --hard 版本號
現在,再次查看該項目下的文件夾,你將看不到backend.html
文件了。
同時,使用git log
命令也看不到第二版本的記錄。
如果此時Boss
告訴你,后台功能挺好用的又要讓你加回來,你該怎么做?因為git log
已經找不到第二版的版本號了。
別着急,你可以使用如下命令:
# 低版本回滾到高版本,使用reflog查看版本號,再設置回滾
git reflog
git reset --hard 版本號
現在,再次查看mysite
文件夾下的內容,你會發現backend.html
文件又回來了。
命令 | 描述 |
---|---|
git log | 查看版本提交信息,常用於高版本向低版本的回滾 |
git reflog | 查看版本提交信息,常用於低版本向高版本的回滾 |
git reset --hard 版本號 | 進行版本回滾 |
分區概念
在上面的操作中,可以發現目前的一個文件可以有多個狀態:
- 以控制狀態:指該文件可以被git管理的狀態,目前來講所有位於git init文件夾下的文件都是以控制狀態
- 以變動狀態:當有新文件,或原本文件被修改后,使用git status呈現紅色狀態的文件
- 暫存區狀態:指的是執行git add命令后,紅色狀態文件變為綠色狀態的文件
- 版本庫狀態:指的是執行git commit命令后,提交至版本庫的文件
這些不同的狀態,對應不同的分區,由於此時我們做的是本地版本控制,所以這里的版本庫即為本地版本庫:
使用分支
分支是Git
中非常重要的一個概念,它可以讓你處理給多的突發情況,以及讓你更好的進行協同開發。
多個分支互不影響,如下圖所示:
不同的分支中所看到的已提交版本並不相同
當在某一分支中創建新的分支,該子分支將繼承當前分支節點中的所有代碼
默認有一個master分支
使用以下命令查看分支,可以看到,它默認的就有一個master
分支。
git branch
如果你想創建一個新的分支,則可以使用如下命令:
git branch 新分支名字
如下示例中,將會創建一個新的名叫dev
的分支。
圖片中的*
代指你當前是處於那一條分支中,如果你想切換分支則可以使用如下命令:
git checkout 分支名字
如下實例,我們將當前分支切換進dev
:
通常情況下,一個項目最少需要兩個分支,dev
與master
(默認)。
master
分支只存放一些穩定的版本。而dev
分支則存放開發版本。
現在,我想書寫一個數據統計的功能,在dev
完成開發並進行提交之后,再切換至master
分支進行合並(你在那個分支下進行合並,就將代碼合並到那個分支)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>數據統計</title>
</head>
<body>
<h1>數據統計主頁</h1>
</body>
</html>
如果測試沒有問題,使用如下命令進行分支合並(先切換分支):
git merge 要合並的分支
使用git log
查看提交的版本信息,你將看到有一個分支合並的提示:
對於某些分支(如測試bug),如果你不想要了,可以對其進行刪除:
git branch -d 分支名稱
以下是關於本小節的命令總結:
命令 | 描述 |
---|---|
git branch | 查看當前項目所有分支 |
git branch 分支名 | 創建一個新的分支 |
git checkout 分支名 | 切換分支 |
git merge 要合並的分支 | 合並分支,在那個分支下進行合並 |
git branch -d 分支名 | 刪除分支 |
合並沖突
由於多分支開發,可能會出現多條分支修改同一處代碼的情況,這個時候就會出現合並沖突問題。
如下所示,我們在master
中關於index.html
中的內容是這個樣子的:
<h1>歡迎來到我的主站</h1>
<ul>
<li>我的喜歡</li>
<li>我的收藏</li>
<li>我的關注</li>
<li>歷史記錄</li>
</ul>
如果我現在在master
分支里,為index.html
添加一個新的內容,如下所示:
<h1>歡迎來到我的主站</h1>
<ul>
<li>我的喜歡</li>
<li>我的收藏</li>
<li>我的關注</li>
<li>歷史記錄</li>
<li>新內容(master)</li>
</ul>
並且在master
分支下對其提交到版本庫中。
現在我將切換至dev
分支中,也為index.html
做修改,內容如下:
<h1>歡迎來到我的主站</h1>
<ul>
<li>我的喜歡</li>
<li>我的收藏</li>
<li>我的關注</li>
<li>歷史記錄</li>
<li>新內容(dev)</li>
</ul>
並且在dev
分支中提交到版本庫。
現在切換回master
中進行合並,將會提示我合並沖突的問題:
如果你在vscode
等編輯器中打開index.html
,可以看到下面的畫面:
合並沖突產生的原因是多條分支修改同一處代碼,進行合並時Git
並不知道到底聽誰的。所以索性就將其全部保留,由你來手動進行修改。
所以我把它全部刪掉就解決好合並沖突了:
當然,最后進行生成最終版即可。
OK,那么關於本地倉庫的介紹目前就差不多啦。看一看我們最終生成了多少個版本:
處理bug
當你master
分支即穩定版在上線部署之后出現bug
,處理流程應該是怎么樣的呢?
如下圖所示:
上線版本如果有bug
,應當立即創建一個新分支進行bug
修復,之后再進行提交合並。
同時這不會耽誤你其他業務線的進度,當其他業務線開發完畢后,進行合並時如果沒有沖突則大吉大利,如果出現沖突則解決沖突。
遠程推送
GitHub
Git
是一款分布式的版本控制軟件,在上面已經介紹了基本的本地版本控制。
接下來就需要介紹如何將本地版本庫中的代碼推送到遠程版本庫中,當然你可以選擇的遠程版本庫非常多,這里就介紹GitHub
,因為它是目前使用人數最多的遠程代碼托管倉庫。
首先你需要注冊一個GitHub
,這里就不再進行演示了,自行注冊即可。
創建倉庫
當我們登錄GitHub
之后,首先要做的就是創建一個遠程倉庫。
先打開倉庫的頁面:
然后點擊New
准備新建倉庫:
下面是一些設置項:
接下來你將會看到這樣的頁面:
OK,目前為止我們的倉庫已經創建完畢咯。
推送代碼
現在,嘗試將mysite
中的代碼推送至GitHub
吧。
輸入以下兩條命令:
git remote add origin https://github.com/Yunya-Github/mysite.git
git push -u origin master
由於我們是第一次使用GitHub
,所以它彈出了這樣的一個頁面:
我們點擊中間的按鈕,打開這個頁面
然后點擊綠色的按鈕即可
你將會收到一封郵件,打開郵件后點擊第一條鏈接,就大功告成了。
現在打開你的倉庫,你就能看到文件都已經上傳上去了。
值得一提的是,它只上傳了master
分支,如果我們想上傳dev
分支,則還是需要輸入push
命令:
git push -u origin dev
現在,不管是master
還是dev
,都已經成功上傳至GitHub
中了。
下面是本小結的內容梳理:
命令 | 描述 |
---|---|
git remote add 別名 倉庫地址 | 給倉庫地址取一個別名 |
git push -u origin 分支名 | 將分支推送至遠程倉庫 |
注意事項:
推送代碼時,一個一個分支進行推送
拉取代碼
當你在一台其他的機器上,如果想要繼續進行未完成的工作,則可以將代碼從遠程版本庫中拉下來進行書寫。
如下所示,我現在在北京,但是代碼卻在南京,所以我想通過GitHub
繼續編輯我未完成的代碼。
第一步,創建文件夾:
X:\>mkdir beijing
X:\>cd beijing
X:\beijing>
第二步,使用git
拉取代碼:
git clone 遠程倉庫地址 # 自動會取別名,名字是origin 克隆全部的代碼(所有分支)
現在我們可以進行開發了,如進入dev
分支進行更新。
<h1>歡迎來到我的主站</h1>
<ul>
<li>我的喜歡</li>
<li>我的收藏</li>
<li>我的關注</li>
<li>歷史記錄</li>
<li>新內容(master)</li>
<li>新內容(dev)</li>
<li>在家更新的內容</li>
</ul>
在更新完成后先在dev
中進行本地提交,然后提交到GitHub
上即可。
git push origin -u dev
目前,GitHub
上的代碼dev
分支也更新完畢了:
如果我回到南京后,到了原來的辦公環境中,可以使用以下命令對原本的dev
進行增量更新:
git checkout dev
git pull origin dev # 增量更新
就這樣循環往復即可,我畫一張圖感受一下:
本章節命令小結:
命令 | 描述 |
---|---|
git clone 遠程倉庫地址 | 克隆遠程倉庫所有代碼(僅第一次使用) |
git pull origin 分支名 | 增量更新某一分支中的代碼 |
分區概念
由於涉及到遠端倉庫,所以又多了一個分區:
這張圖中有幾個點,希望你能關注一下。
使用增量更新的pull
實際上可以拆分為兩條命令:
git fetch origin 分支 # 將遠程版本庫的分支拉到本地版本庫中
git marge origin/分支 # 將本地版本空中代碼合到本地的分支中
協同開發
gitflow
gitflow
是一種工作流程,下面是在進行開發中應當遵循的一些流程。
gitflow常用分支
- Production 分支
也就是我們經常使用的Master分支,這個分支最近發布到生產環境的代碼,最近發布的Release, 這個分支只能從其他分支合並,不能在這個分支直接修改
- Develop 分支
這個分支是我們是我們的主開發分支,包含所有要發布到下一個Release的代碼,這個主要合並與其他分支,比如Feature分支
- Feature 分支
這個分支主要是用來開發一個新的功能,一旦開發完成,我們合並回Develop分支進入下一個Release
- Release分支
當你需要一個發布一個新Release的時候,我們基於Develop分支創建一個Release分支,完成Release后,我們合並到Master和Develop分支
- Hotfix分支
當我們在Production發現新的Bug時候,我們需要創建一個Hotfix, 完成Hotfix后,我們合並回Master和Develop分支,所以Hotfix的改動會進入下一個Release
初始分支
所有在Master
分支上的Commit
應該Tag
:(打標簽,后面會介紹到)
Feature 分支
Feature
分支做完后,必須合並回Develop
分支, 合並完分支后一般會刪點這個Feature
分支,但是我們也可以保留
Release分支
Release
分支基於Develop
分支創建,打完Release
分之后,我們可以在這個Release
分支上測試,修改Bug
等。同時,其它開發人員可以基於開發新的Feature
(記住:一旦打了Release
分支之后不要從Develop
分支上合並新的改動到Release
分支)
發布Release
分支時,合並Release
到Master
和Develop
, 同時在Master
分支上打個Tag
記住Release
版本號,然后可以刪除Release
分支了。
維護分支Hotfix
hotfix
分支基於Master
分支創建,開發完后需要合並回Master
和Develop
分支,同時在Master
上打一個tag
其他事項
當然這里面有很多分支你都沒接觸過,沒有任何關系,這只是一種工作流程,可能你的公司在用另外的流程。
單獨項目
進行協同開發時,需要所有成員都能夠對同一個項目進行操作,此時你需要邀請成員並且賦予其權限,否則該成員將無法開發,GitHub
上支持兩種創建項目的方式供多人協同開發。
我的GitHub
上現在已經有了一個mysite
的公開項目,現在我想邀請一個開發者來進行共同開發
就這樣,當他同意后,就可以與我進行協同開發。
組織項目
公司常常采用組織的形式來進行協同開發,一個組織下可以有多個項目,那么我們現在來創建一個組織。
現在,你可以將你的第一個版本提交至該倉庫中。
tag應用
我們上面看得到的版本號,都是一大串哈希值。
這顯然十分的不友好,所以在開發時最好能夠給每個版本打一個別名,或者稱之為標簽。
現在我們新創建了一個本地項目叫NBSite
,並且寫好了初版。在提交時我們需要給他打上一個標簽。
git tag -a v1.0 -m "描述" # 在本地創建tag信息
git tag -d v1.0 # 刪除tag
git push origin --tags # 將本地tag信息推送到遠程倉庫
git pull origin --tags # 更新本地tag版本信息
git checkout v.10 # 切換tag
git clone -b v-.1 地址 # 指定tag下載代碼
現在,我們的遠程倉庫上,已經對初始版有了個tag了,以后更新版本,切記打上標簽。
邀請開發
首先邀請我們的好朋友登場:
現在,我們親愛的KAEJKING
經過郵件確認后已經進入組織了,點擊NBSite
這個項目,賦予KAEJKING
權限。
開始工作
現在KAEJKING
這個成員已經有寫的權限了。我們嘗試讓它對NBSite
項目做出更新。
git clone https://github.com/KAKOFS/NBSite.git
cd NBSite
git checkout dev # 切換到dev
git bransh KAEJKING # 創建新的分支,可以以功能命名,也可以人名。一定要在dev下創建
# 寫代碼
git add .
git commit -m "KAEJKING開發的新功能"
git push origin KAEJKING # 將開發的分支推送到組織倉庫
代碼review
review
是一個新的基於dev
的分支,由於KAEJKING
是基於dev
的功能分支。所以合並前我們要進行代碼測試,也就是review
完成后才能夠將KAEJKING
開發的內容合並到dev
分支。
現在,管理員已經收到了合並請求。進行審查之后代碼沒有問題就可以直接合並到dev
分支了。
review
完成之后,KAEJKING
寫的新功能將會合並到dev
分支中。
代碼release
現在dev
分支已經做了更新,如果想更新到master
分支中,還需要進行代碼release
,這是一次十分嚴格的測試,所以應該由一個測試團隊來進行。
-
基於
dev
分支創建release
分支git checkout dev git checkout -b relase
-
進行測試
-
測試完成,將
relase
的代碼合並到master
分支git merge relase # master分支下做
-
在
master
分支打tag
,進行代碼上傳。git tag -a v2 -m "正式版第二版上線" git push origin --tags
-
運維人員可以下載代碼做上線了
git clone -b v2 地址
其他操作
rebase命令
當你每天都進行代碼提交,那么你的提交記錄將會變得非常的繁瑣。如下所示:
print("初始版本")
print("我第一天寫了這么多代碼了") # 生成版本 第一天
print("我第二天寫了這么多代碼了") # 生成版本 第二天
print("我第三天寫了這么多代碼了") # 生成版本 第三天
print("終於開發完畢了") # 生成版本 最終版
其實,你的Boss
並不關心你第幾天開發了多少多少,它只關心最終版。
所以我們需要把中間三天進行合並,讓他看起來更簡潔。(這可能會引發合並沖突)
使用如下命令進行合並:
git rebase -i HEAD~4 # 從最上面的版本數四個進行合並
現在它會彈出一個vim
,讓你編輯描述信息。
我對他稍作修改。
再使用git log
進行查看,就簡潔多了:
注意,它其實是將當前分支中的多個版本進行融合成一個版本,
所以可能導致合並沖突。
配置文件
git
中的配置文件有三部分。
- 倉庫級的配置文件:在倉庫的
.git/.gitconfig
,該配置文件只對所在的倉庫有效。 - 全局配置文件:
Mac
系統在~/.gitconfig
,Windows
系統在C:\Users\<用戶名>\.gitconfig
。 - 系統級的配置文件:在
Git
的安裝目錄(Mac
系統下安裝目錄在/usr/local/git
)的etc
文件夾中的gitconfig
。
-
當前項目的配置文件
git config --local user.name "xxx" git config --local user.email "xxx@xx.com"
-
全局配置文件
git config --global user.name "xxx" git config --global user.email "xxx@xx.com"
-
系統配置文件
git config --system user.name "xxx" git config --system user.email "xxx@xx.com" # 需要有root權限
SSH
使用SSH
也可以實現代碼的推送和拉取。
~
代表當前目錄。
-
生成公鑰與私鑰(默認放在~/.ssh目錄下,id_rsa.pub為公鑰,id_rsa為私鑰)
ssh-keygen # 一直回車,生成密鑰
-
拷貝公鑰的內容,設置到
GitHub
中 -
在
Git
本地配置SSH
地址git remote add origin git@github.com:KAKOFS/NBSite.git # ssh地址
-
使用時用以下命令
git push origin 分支名
fork源碼
如果你想對一些框架的源碼做出貢獻,可以使用以下步驟向框架開發者提出合並請求。
-
fork
源代碼,將別人源碼拷貝到我自己的遠程倉庫。 -
在自己倉庫中進行修改代碼
-
給源代碼作者提交修復
bug
申請。(pull request
)
忽略文件
在項目中創建.gitignore
文件,輸入匹配規則,當前項目中所有匹配的文件將不會被Git
所管理。
你還可以有更多的匹配規則:
*.h # 忽略.h的后綴文件
!a.h # 但是不忽略a.h這個文件
files/ # 忽略該文件夾下所有文件
*.py[a|b|c] # 忽略pya、pyb、pyc為后綴的文件
issues&wiki
issues
可以提出一些你發現的問題,開發者會給你進行解答。
使用wiki
來對你的項目進行描述,以方便你走后接替你工作的人更快的熟悉該項目。
刪除不存在的分支
多人合作開發時,如果遠程的分支被其他開發刪除掉,在本地執行 git branch --all
依然會顯示該遠程分支,可使用下列的命令進行刪除:
# 使用 pull 命令,添加 -p 參數
$ git pull -p
# 等同於下面的命令
$ git fetch -p
$ git fetch --prune origin
命令大全
本篇命令
下面是一些在本文章中有的命令:
命令 | 描述 |
---|---|
git init | 初始化 |
git status | 查看狀態 |
git add | 管理指定文件 |
git commit -m "描述" | 生成版本 |
git log | 查看版本記錄(之前) |
git reflog | 查看版本記錄(之后) |
git reset --hard 版本號 | 版本回滾 |
git branch | 查看所有分支 |
git branch 分支名 | 創建新分支 |
git checkout 分支名 | 切換分支 |
git merge | 分支合並 |
git branch -d 分支名 | 刪除分支 |
git remote add 別名 地址 | 遠程倉庫取別名 |
git push -u 別名 分支 | 推送某分支到遠程倉庫 |
git clone 地址 | 克隆遠程倉庫代碼 |
git pull 別名 分支 | 拉取遠程倉庫中某一分支代碼,增量更新 |
git rebase -i HEAD~條數 | 版本合並 |
config
配置的相關命令及參數:
# 查看配置信息
# --local:倉庫級,--global:全局級,--system:系統級
$ git config <--local | --global | --system> -l
# 查看當前生效的配置信息
$ git config -l
# 編輯配置文件
# --local:倉庫級,--global:全局級,--system:系統級
$ git config <--local | --global | --system> -e
# 添加配置項
# --local:倉庫級,--global:全局級,--system:系統級
$ git config <--local | --global | --system> --add <name> <value>
# 獲取配置項
$ git config <--local | --global | --system> --get <name>
# 刪除配置項
$ git config <--local | --global | --system> --unset <name>
# 配置提交記錄中的用戶信息
$ git config --global user.name <用戶名>
$ git config --global user.email <郵箱地址>
# 更改Git緩存區的大小
# 如果提交的內容較大,默認緩存較小,提交會失敗
# 緩存大小單位:B,例如:524288000(500MB)
$ git config --global http.postBuffer <緩存大小>
# 調用 git status/git diff 命令時以高亮或彩色方式顯示改動狀態
$ git config --global color.ui true
# 配置可以緩存密碼,默認緩存時間15分鍾
$ git config --global credential.helper cache
# 配置密碼的緩存時間
# 緩存時間單位:秒
$ git config --global credential.helper 'cache --timeout=<緩存時間>'
# 配置長期存儲密碼
$ git config --global credential.helper store
git clone
從遠程倉庫克隆一個版本庫到本地。
# 默認在當前目錄下創建和版本庫名相同的文件夾並下載版本到該文件夾下
$ git clone <遠程倉庫的網址>
# 指定本地倉庫的目錄
$ git clone <遠程倉庫的網址> <本地目錄>
# -b 指定要克隆的分支,默認是master分支
$ git clone <遠程倉庫的網址> -b <分支名稱> <本地目錄>
git init
初始化項目所在目錄,初始化后會在當前目錄下出現一個名為 .git
的目錄。
# 初始化本地倉庫,在當前目錄下生成 .git 文件夾
$ git init
git status
查看本地倉庫的狀態。
# 查看本地倉庫的狀態
$ git status
# 以簡短模式查看本地倉庫的狀態
# 會顯示兩列,第一列是文件的狀態,第二列是對應的文件
# 文件狀態:A 新增,M 修改,D 刪除,?? 未添加到Git中
$ git status -s
git remote
操作遠程庫。
# 列出已經存在的遠程倉庫
$ git remote
# 列出遠程倉庫的詳細信息,在別名后面列出URL地址
$ git remote -v
$ git remote --verbose
# 添加遠程倉庫
$ git remote add <遠程倉庫的別名> <遠程倉庫的URL地址>
# 修改遠程倉庫的別名
$ git remote rename <原遠程倉庫的別名> <新的別名>
# 刪除指定名稱的遠程倉庫
$ git remote remove <遠程倉庫的別名>
# 修改遠程倉庫的 URL 地址
$ git remote set-url <遠程倉庫的別名> <新的遠程倉庫URL地址>
git branch
操作 Git 的分支命令.
# 列出本地的所有分支,當前所在分支以 "*" 標出
$ git branch
# 列出本地的所有分支並顯示最后一次提交,當前所在分支以 "*" 標出
$ git branch -v
# 創建新分支,新的分支基於上一次提交建立
$ git branch <分支名>
# 修改分支名稱
# 如果不指定原分支名稱則為當前所在分支
$ git branch -m [<原分支名稱>] <新的分支名稱>
# 強制修改分支名稱
$ git branch -M [<原分支名稱>] <新的分支名稱>
# 刪除指定的本地分支
$ git branch -d <分支名稱>
# 強制刪除指定的本地分支
$ git branch -D <分支名稱>
git checkout
檢出命令,用於創建、切換分支等。
# 切換到已存在的指定分支
$ git checkout <分支名稱>
# 創建並切換到指定的分支,保留所有的提交記錄
# 等同於 "git branch" 和 "git checkout" 兩個命令合並
$ git checkout -b <分支名稱>
# 創建並切換到指定的分支,刪除所有的提交記錄
$ git checkout --orphan <分支名稱>
# 替換掉本地的改動,新增的文件和已經添加到暫存區的內容不受影響
$ git checkout <文件路徑>
git cherry-pick
把已經提交的記錄合並到當前分支。
# 把已經提交的記錄合並到當前分支
$ git cherry-pick <commit ID>
git add
把要提交的文件的信息添加到暫存區中。當使用 git commit
時,將依據暫存區中的內容來進行文件的提交。
# 把指定的文件添加到暫存區中
$ git add <文件路徑>
# 添加所有修改、已刪除的文件到暫存區中
$ git add -u [<文件路徑>]
$ git add --update [<文件路徑>]
# 添加所有修改、已刪除、新增的文件到暫存區中,省略 <文件路徑> 即為當前目錄
$ git add -A [<文件路徑>]
$ git add --all [<文件路徑>]
# 查看所有修改、已刪除但沒有提交的文件,進入一個子命令系統
$ git add -i [<文件路徑>]
$ git add --interactive [<文件路徑>]
git commit
將暫存區中的文件提交到本地倉庫中。
# 把暫存區中的文件提交到本地倉庫,調用文本編輯器輸入該次提交的描述信息
$ git commit
# 把暫存區中的文件提交到本地倉庫中並添加描述信息
$ git commit -m "<提交的描述信息>"
# 把所有修改、已刪除的文件提交到本地倉庫中
# 不包括未被版本庫跟蹤的文件,等同於先調用了 "git add -u"
$ git commit -a -m "<提交的描述信息>"
# 修改上次提交的描述信息
$ git commit --amend
git fetch
從遠程倉庫獲取最新的版本到本地的 tmp 分支上。
# 將遠程倉庫所有分支的最新版本全部取回到本地
$ git fetch <遠程倉庫的別名>
# 將遠程倉庫指定分支的最新版本取回到本地
$ git fetch <遠程主機名> <分支名>
git merge
合並分支。
# 把指定的分支合並到當前所在的分支下
$ git merge <分支名稱>
git diff
比較版本之間的差異。
# 比較當前文件和暫存區中文件的差異,顯示沒有暫存起來的更改
$ git diff
# 比較暫存區中的文件和上次提交時的差異
$ git diff --cached
$ git diff --staged
# 比較當前文件和上次提交時的差異
$ git diff HEAD
# 查看從指定的版本之后改動的內容
$ git diff <commit ID>
# 比較兩個分支之間的差異
$ git diff <分支名稱> <分支名稱>
# 查看兩個分支分開后各自的改動內容
$ git diff <分支名稱>...<分支名稱>
git pull
從遠程倉庫獲取最新版本並合並到本地。
首先會執行 git fetch
,然后執行 git merge
,把獲取的分支的 HEAD 合並到當前分支。
# 從遠程倉庫獲取最新版本。
$ git pull
git push
把本地倉庫的提交推送到遠程倉庫。
# 把本地倉庫的分支推送到遠程倉庫的指定分支
$ git push <遠程倉庫的別名> <本地分支名>:<遠程分支名>
# 刪除指定的遠程倉庫的分支
$ git push <遠程倉庫的別名> :<遠程分支名>
$ git push <遠程倉庫的別名> --delete <遠程分支名>
git log
顯示提交的記錄。
# 打印所有的提交記錄
$ git log
# 打印從第一次提交到指定的提交的記錄
$ git log <commit ID>
# 打印指定數量的最新提交的記錄
$ git log -<指定的數量>
git reset
還原提交記錄。
# 重置暫存區,但文件不受影響
# 相當於將用 "git add" 命令更新到暫存區的內容撤出暫存區,可以指定文件
# 沒有指定 commit ID 則默認為當前 HEAD
$ git reset [<文件路徑>]
$ git reset --mixed [<文件路徑>]
# 將 HEAD 的指向改變,撤銷到指定的提交記錄,文件未修改
$ git reset <commit ID>
$ git reset --mixed <commit ID>
# 將 HEAD 的指向改變,撤銷到指定的提交記錄,文件未修改
# 相當於調用 "git reset --mixed" 命令后又做了一次 "git add"
$ git reset --soft <commit ID>
# 將 HEAD 的指向改變,撤銷到指定的提交記錄,文件也修改了
$ git reset --hard <commit ID>
git revert
生成一個新的提交來撤銷某次提交,此次提交之前的所有提交都會被保留。
# 生成一個新的提交來撤銷某次提交
$ git revert <commit ID>
git tag
操作標簽的命令。
# 打印所有的標簽
$ git tag
# 添加輕量標簽,指向提交對象的引用,可以指定之前的提交記錄
$ git tag <標簽名稱> [<commit ID>]
# 添加帶有描述信息的附注標簽,可以指定之前的提交記錄
$ git tag -a <標簽名稱> -m <標簽描述信息> [<commit ID>]
# 切換到指定的標簽
$ git checkout <標簽名稱>
# 查看標簽的信息
$ git show <標簽名稱>
# 刪除指定的標簽
$ git tag -d <標簽名稱>
# 將指定的標簽提交到遠程倉庫
$ git push <遠程倉庫的別名> <標簽名稱>
# 將本地所有的標簽全部提交到遠程倉庫
$ git push <遠程倉庫的別名> –tags
git mv
重命名文件或者文件夾。
# 重命名指定的文件或者文件夾
$ git mv <源文件/文件夾> <目標文件/文件夾>
git rm
刪除文件或者文件夾。
# 移除跟蹤指定的文件,並從本地倉庫的文件夾中刪除
$ git rm <文件路徑>
# 移除跟蹤指定的文件夾,並從本地倉庫的文件夾中刪除
$ git rm -r <文件夾路徑>
# 移除跟蹤指定的文件,在本地倉庫的文件夾中保留該文件
$ git rm --cached