詳解Git


版本控制

基本概念

   版本控制是一個非常簡單的概念,我舉個例子簡單說明一下你就能大概明白它是一個什么東西,當你不會版本控制的時候:

  1. 你的BOSS決定做一款灰常牛逼的軟件,找你進行開發

  2. 當你做好之后,老板又突發奇想覺得加入一個新功能就更好了

  3. 當你添加上新功能之后,老板覺得該功能可能又不太好,讓你去掉它

  4. 當你去掉這個功能的時候,老板說鐵汁,你還是把它加上來吧,我突然覺得這個功能又挺好的

  5. 你心里想老板我不干了,你自己來弄吧,但是現實確讓你抱起鍵盤乖乖就范

   See the source image

   這個時候聰明的同學可能會這個樣子做,在做完基本功能后進行拷貝,再到拷貝的副本上做出修改添加上新功能,這樣不管老板怎么奇思妙想你都有應對之策:

   image-20201107205553831

   那么這就是一個最簡單的版本控制了,是不是非常簡單?

歷史發展

   版本控制大概經歷了四個階段,如下:

  1. 文件夾拷貝
  2. 本地版本控制
  3. 集中式版本控制
  4. 分布式版本控制

   文件夾拷貝

   這個不必多說了,相信傻子都明白,正如上面示例中提到的對原產品進行拷貝后再添加新功能。

   這個也確實是很長一段時間中的解決方案,但是它有一個非常大的問題,比如我原產品的代碼有十萬行,我的新功能有兩萬行,那么我的原產品(V1)加上我的新功能(V2)就要有二十二萬行代碼進行存儲,非常的浪費存儲空間(V1十萬行,V2十二萬行)。

   本地版本控制

   到了后面,逐漸的出現了一些軟件,它可以幫助我們做版本控制,而並非由我們手動進行拷貝。

   並且,它有以下幾個特點:

   1.同一時間只能看到一個版本,如果你想回到之前版本,就可以通過其命令等操作方式進行回滾

   2.不會很干脆的進行拷貝,而是在原有代碼的基礎上進行增量更新,這意味着我兩個版本的存儲總代碼量只有十四萬行,非常節約空間

   記住,第一個特點十分的具有代表性,那么下面放上一張Git官網的圖片,你可以清晰的看見,同一時間我們只能看到一個文件,但是在版本庫中會存儲多個版本:

   本地版本控制圖解

   集中式版本控制

   慢慢的,大家都開始發現單兵作戰不能解決全部的問題,我們需要共同生產。

   所以當有多名開發者同時進行開發時,就需要有一個公共的倉庫來進行存放代碼,那么現在的代碼都會提交至一個共有倉庫中,這樣一來就解決了協同開發的問題,但是相應的,如果存放共有倉庫的計算機一宕機,那么大家都不能進行生產了,如果情況更加糟糕比如共有倉庫中的磁盤損壞,那么大家這么久以來的辛苦就全都白費了。

   這里還是舉兩個特征,來進行闡述:

   1.集中式版本控制主要用於解決協同開發

   2.所有代碼都只提交至共有倉庫,這樣會帶來一些安全隱患

   centralized

   分布式版本控制

   為了解決集中式版本控制的弊端,后來出現了分布式版本控制,諸如 GitMercurialBazaar以及 Darcs等,你可以選擇將自己寫好的代碼推送到本地,也可以選擇推送到遠程倉庫。對於目前而言,這是一種非常棒的解決方案,如圖所示:

   分布式版本控制圖解

   你可以在同一個項目中,分別和不同工作小組的人相互協作。 你可以根據需要設定不同的協作流程,比如層次模型式的工作流,而這在以前的集中式系統中是無法實現的。

Git介紹

基本介紹

   Git是分布式的版本控制軟件,以下是它的官方網站:

   Git官網

   它的文檔說明十分詳細,並且使用簡單,目前在大多數場景下我們都會選擇Git來做版本控制。

   所以說,學習它已經是大勢所趨了,逃避不了的,面對疾風吧。

下載安裝

   官方說明已經非常詳細了,進行查看即可,里面包含了Windows/Linux/Mac的安裝步驟:

   Git安裝

   下面我們用Windows做一下示例,當你下載完成后一直點擊下一步即可,安裝完成當在桌面右擊鼠標如果出現下面兩個選項,則代表安裝完成。

   image-20201108115648386

本地倉庫

   由於Git是分布式的版本控制軟件,所以我們先學習如何將代碼提交至本地,然后再看如何提交至遠端代碼庫。

版本提交

   在Git中,我們首先要做的就是對一個項目進行管理。

   進入項目文件夾,執行初始化命令即可由Git接管當前項目的版本控制。

   如下我們有一個mysite的項目,在里面有一個index.html,內容如下:

   image-20201108120543011

<!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的隱藏文件夾。

   image-20201108120914744

   然后我們使用以下命令來檢測當前文件夾中被管理的文件狀態,輸入以下命令:

git status

   新增的文件和修改后的文件均屬於未被管理的文件,呈現紅色狀態,如下所示:

   image-20201108121110025

   接下來我們來管理該文件,有兩條命令可供你選擇:

git add 文件名  # 僅僅管理一個文件
git add .   # 代表當前目錄下的所有文件

   在這里我們使用git add .即可,當輸入該命令后再次查看文件狀態,會發現變成了綠色:

   image-20201108121334157

   接下來我們開始生成第一個版本,就取名v1吧。執行以下命令進行版本生成:

git commit -m "描述信息"

   在這里它會提示一個異常,大概意思就是讓你進行用戶信息配置,輸入用戶名、郵箱等信息(只輸入一次):

   image-20201108121618978

   那么我們來配置一下個人信息,按照它提供的命令輸入:

git config --global user.email "郵箱地址"
git config --global user.name "用戶名"

   然后再來輸入git commit -m "描述信息"提交版本,會顯示提交成功。

   接下來使用git log命令查看生成的版本:

git log

   image-20201108121913706

   好了,那么現在做一下命令小結:

命令 描述
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>

   image-20201108135539615

   現在,當我們使用git status后,將會看到backend.html呈紅色狀態。

   image-20201108135623686

   此時我們仍然需要執行上面的步驟,來生成第二個版本。

   image-20201108135748049

版本回滾

   如果現在你的Boss告訴你后台功能暫時不需要,你就需要進行版本回滾,將第二版回滾到第一版。

   時候如下命令進行回滾:

# 高版本回滾到低版本,先查看版本號,再設置回滾
git log 
git reset --hard 版本號

   image-20201108140013440

   現在,再次查看該項目下的文件夾,你將看不到backend.html文件了。

   image-20201108140046739

   同時,使用git log命令也看不到第二版本的記錄。

   image-20201108140119021

   如果此時Boss告訴你,后台功能挺好用的又要讓你加回來,你該怎么做?因為git log已經找不到第二版的版本號了。

   別着急,你可以使用如下命令:

# 低版本回滾到高版本,使用reflog查看版本號,再設置回滾
git reflog
git reset --hard 版本號

   image-20201108140424765

   現在,再次查看mysite文件夾下的內容,你會發現backend.html文件又回來了。

   image-20201108140457883

命令 描述
git log 查看版本提交信息,常用於高版本向低版本的回滾
git reflog 查看版本提交信息,常用於低版本向高版本的回滾
git reset --hard 版本號 進行版本回滾

分區概念

   在上面的操作中,可以發現目前的一個文件可以有多個狀態:

  1. 以控制狀態:指該文件可以被git管理的狀態,目前來講所有位於git init文件夾下的文件都是以控制狀態
  2. 以變動狀態:當有新文件,或原本文件被修改后,使用git status呈現紅色狀態的文件
  3. 暫存區狀態:指的是執行git add命令后,紅色狀態文件變為綠色狀態的文件
  4. 版本庫狀態:指的是執行git commit命令后,提交至版本庫的文件

   這些不同的狀態,對應不同的分區,由於此時我們做的是本地版本控制,所以這里的版本庫即為本地版本庫:

   image-20201108141206328

使用分支

   分支是Git中非常重要的一個概念,它可以讓你處理給多的突發情況,以及讓你更好的進行協同開發。

   多個分支互不影響,如下圖所示:

   image-20201108160245076

   不同的分支中所看到的已提交版本並不相同

   當在某一分支中創建新的分支,該子分支將繼承當前分支節點中的所有代碼

   默認有一個master分支

   使用以下命令查看分支,可以看到,它默認的就有一個master分支。

git branch

   image-20201108142840259

   如果你想創建一個新的分支,則可以使用如下命令:

git branch 新分支名字

   如下示例中,將會創建一個新的名叫dev的分支。

   image-20201108143009713

   圖片中的*代指你當前是處於那一條分支中,如果你想切換分支則可以使用如下命令:

git checkout 分支名字

   如下實例,我們將當前分支切換進dev

   image-20201108143158161

   通常情況下,一個項目最少需要兩個分支,devmaster(默認)。

   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>

   image-20201108143810578

   如果測試沒有問題,使用如下命令進行分支合並(先切換分支):

git merge 要合並的分支

   image-20201108144030940

   使用git log查看提交的版本信息,你將看到有一個分支合並的提示:

   image-20201108144248241

   對於某些分支(如測試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分支下對其提交到版本庫中。

   image-20201108154441919

   現在我將切換至dev分支中,也為index.html做修改,內容如下:

    <h1>歡迎來到我的主站</h1>
    <ul>
        <li>我的喜歡</li>
        <li>我的收藏</li>
        <li>我的關注</li>
        <li>歷史記錄</li>
        <li>新內容(dev)</li>
    </ul>

   並且在dev分支中提交到版本庫。

   image-20201108154915858

   現在切換回master中進行合並,將會提示我合並沖突的問題:

   image-20201108155006963

   如果你在vscode等編輯器中打開index.html,可以看到下面的畫面:

   image-20201108155113851

   合並沖突產生的原因是多條分支修改同一處代碼,進行合並時Git並不知道到底聽誰的。所以索性就將其全部保留,由你來手動進行修改。

   所以我把它全部刪掉就解決好合並沖突了:

   image-20201108155236694

   當然,最后進行生成最終版即可。

   image-20201108155400869

   OK,那么關於本地倉庫的介紹目前就差不多啦。看一看我們最終生成了多少個版本:

   image-20201108155614184

處理bug

   當你master分支即穩定版在上線部署之后出現bug,處理流程應該是怎么樣的呢?

   如下圖所示:

   image-20201108155951659

   上線版本如果有bug,應當立即創建一個新分支進行bug修復,之后再進行提交合並。

   同時這不會耽誤你其他業務線的進度,當其他業務線開發完畢后,進行合並時如果沒有沖突則大吉大利,如果出現沖突則解決沖突。

遠程推送

GitHub

   Git是一款分布式的版本控制軟件,在上面已經介紹了基本的本地版本控制。

   接下來就需要介紹如何將本地版本庫中的代碼推送到遠程版本庫中,當然你可以選擇的遠程版本庫非常多,這里就介紹GitHub,因為它是目前使用人數最多的遠程代碼托管倉庫。

   首先你需要注冊一個GitHub,這里就不再進行演示了,自行注冊即可。

   image-20201108160951748

創建倉庫

   當我們登錄GitHub之后,首先要做的就是創建一個遠程倉庫。

   先打開倉庫的頁面:

   image-20201108161406270

   然后點擊New准備新建倉庫:

   image-20201108161332424

   下面是一些設置項:

   image-20201108161853871

   接下來你將會看到這樣的頁面:

   image-20201108162455308

   OK,目前為止我們的倉庫已經創建完畢咯。

推送代碼

   現在,嘗試將mysite中的代碼推送至GitHub吧。

   輸入以下兩條命令:

git remote add origin https://github.com/Yunya-Github/mysite.git
git push -u origin master

   image-20201108162714284

   由於我們是第一次使用GitHub,所以它彈出了這樣的一個頁面:

   image-20201108162831892

   我們點擊中間的按鈕,打開這個頁面

   image-20201108162901829

   然后點擊綠色的按鈕即可

   image-20201108162921325

   你將會收到一封郵件,打開郵件后點擊第一條鏈接,就大功告成了。

   image-20201108163029064

   現在打開你的倉庫,你就能看到文件都已經上傳上去了。

   image-20201108163141669

   值得一提的是,它只上傳了master分支,如果我們想上傳dev分支,則還是需要輸入push命令:

git push -u origin dev

   image-20201108163400961

   現在,不管是master還是dev,都已經成功上傳至GitHub中了。

   image-20201108163346454

   下面是本小結的內容梳理:

命令 描述
git remote add 別名 倉庫地址 給倉庫地址取一個別名
git push -u origin 分支名 將分支推送至遠程倉庫

   注意事項:

   推送代碼時,一個一個分支進行推送

拉取代碼

   當你在一台其他的機器上,如果想要繼續進行未完成的工作,則可以將代碼從遠程版本庫中拉下來進行書寫。

   如下所示,我現在在北京,但是代碼卻在南京,所以我想通過GitHub繼續編輯我未完成的代碼。

   第一步,創建文件夾:

X:\>mkdir beijing

X:\>cd beijing

X:\beijing>

   第二步,使用git拉取代碼:

git clone 遠程倉庫地址  # 自動會取別名,名字是origin  克隆全部的代碼(所有分支)

   image-20201108180739371

   現在我們可以進行開發了,如進入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

   image-20201108181616280

   目前,GitHub上的代碼dev分支也更新完畢了:

   image-20201108181740966

   如果我回到南京后,到了原來的辦公環境中,可以使用以下命令對原本的dev進行增量更新:

git checkout dev
git pull origin dev  # 增量更新

   image-20201108182121447

   就這樣循環往復即可,我畫一張圖感受一下:

   image-20201108183354996

   本章節命令小結:

命令 描述
git clone 遠程倉庫地址 克隆遠程倉庫所有代碼(僅第一次使用)
git pull origin 分支名 增量更新某一分支中的代碼

分區概念

   由於涉及到遠端倉庫,所以又多了一個分區:

   image-20201108183636617

   這張圖中有幾個點,希望你能關注一下。

   使用增量更新的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:(打標簽,后面會介紹到)

   img

   Feature 分支

   Feature分支做完后,必須合並回Develop分支, 合並完分支后一般會刪點這個Feature分支,但是我們也可以保留

   img

   Release分支

   Release分支基於Develop分支創建,打完Release分之后,我們可以在這個Release分支上測試,修改Bug等。同時,其它開發人員可以基於開發新的Feature(記住:一旦打了Release分支之后不要從Develop分支上合並新的改動到Release分支)

   發布Release分支時,合並ReleaseMasterDevelop, 同時在Master分支上打個Tag記住Release版本號,然后可以刪除Release分支了。

   img

   維護分支Hotfix

   hotfix分支基於Master分支創建,開發完后需要合並回MasterDevelop分支,同時在Master上打一個tag

   img

   其他事項

   當然這里面有很多分支你都沒接觸過,沒有任何關系,這只是一種工作流程,可能你的公司在用另外的流程。

單獨項目

   進行協同開發時,需要所有成員都能夠對同一個項目進行操作,此時你需要邀請成員並且賦予其權限,否則該成員將無法開發,GitHub上支持兩種創建項目的方式供多人協同開發。

   我的GitHub上現在已經有了一個mysite的公開項目,現在我想邀請一個開發者來進行共同開發

   image-20201108213927188

   就這樣,當他同意后,就可以與我進行協同開發。

組織項目

   公司常常采用組織的形式來進行協同開發,一個組織下可以有多個項目,那么我們現在來創建一個組織。

   image-20201108214241156

   image-20201108214313463

   image-20201108214514739

   image-20201108214550033

   image-20201108214711786

   image-20201108214741859

   image-20201108214844520

   image-20201108214909066

   現在,你可以將你的第一個版本提交至該倉庫中。

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下載代碼

   image-20201108220137252

   現在,我們的遠程倉庫上,已經對初始版有了個tag了,以后更新版本,切記打上標簽。

   image-20201108220225795

邀請開發

   首先邀請我們的好朋友登場:

   image-20201108221452278

   image-20201108221537081

   現在,我們親愛的KAEJKING經過郵件確認后已經進入組織了,點擊NBSite這個項目,賦予KAEJKING權限。

   image-20201109112915256

開始工作

   現在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  # 將開發的分支推送到組織倉庫

   image-20201109114457019

代碼review

   review是一個新的基於dev的分支,由於KAEJKING是基於dev的功能分支。所以合並前我們要進行代碼測試,也就是review完成后才能夠將KAEJKING開發的內容合並到dev分支。

   image-20201109115932562

   image-20201109120025433

   現在,管理員已經收到了合並請求。進行審查之后代碼沒有問題就可以直接合並到dev分支了。

   image-20201109120526525

   image-20201109120632796

   image-20201109120724150

   review完成之后,KAEJKING寫的新功能將會合並到dev分支中。

   image-20201109120813886

代碼release

   現在dev分支已經做了更新,如果想更新到master分支中,還需要進行代碼release,這是一次十分嚴格的測試,所以應該由一個測試團隊來進行。

  1. 基於dev分支創建release分支

    git checkout dev
    git checkout -b relase
    
  1. 進行測試

  2. 測試完成,將relase的代碼合並到master分支

    git merge relase # master分支下做
    
  1. master分支打tag,進行代碼上傳。

    git tag -a v2 -m "正式版第二版上線"
    git push origin --tags
    
  2. 運維人員可以下載代碼做上線了

    git clone -b v2 地址
    

其他操作

rebase命令

   當你每天都進行代碼提交,那么你的提交記錄將會變得非常的繁瑣。如下所示:

print("初始版本")
print("我第一天寫了這么多代碼了")  # 生成版本 第一天
print("我第二天寫了這么多代碼了")  # 生成版本 第二天
print("我第三天寫了這么多代碼了")  # 生成版本 第三天
print("終於開發完畢了")  # 生成版本 最終版

   image-20201108203958900

   其實,你的Boss並不關心你第幾天開發了多少多少,它只關心最終版。

   所以我們需要把中間三天進行合並,讓他看起來更簡潔。(這可能會引發合並沖突)

   使用如下命令進行合並:

git rebase -i HEAD~4  # 從最上面的版本數四個進行合並

   image-20201108204401773

   現在它會彈出一個vim,讓你編輯描述信息。

   image-20201108204440859

   我對他稍作修改。

   image-20201108204611568

   再使用git log進行查看,就簡潔多了:

   image-20201108204654404

   注意,它其實是將當前分支中的多個版本進行融合成一個版本,

   所以可能導致合並沖突。

配置文件

   git中的配置文件有三部分。

  1. 倉庫級的配置文件:在倉庫的 .git/.gitconfig,該配置文件只對所在的倉庫有效。
  2. 全局配置文件:Mac系統在 ~/.gitconfigWindows系統在 C:\Users\<用戶名>\.gitconfig
  3. 系統級的配置文件:在Git的安裝目錄(Mac系統下安裝目錄在 /usr/local/git)的 etc 文件夾中的 gitconfig
  1. 當前項目的配置文件

    git config --local user.name "xxx"
    git config --local user.email "xxx@xx.com"
    
  1. 全局配置文件

    git config --global user.name "xxx"
    git config --global user.email "xxx@xx.com"
    
  2. 系統配置文件

    git config --system user.name "xxx"
    git config --system user.email "xxx@xx.com"
    
    # 需要有root權限
    

SSH

   使用SSH也可以實現代碼的推送和拉取。

   ~代表當前目錄。

  1. 生成公鑰與私鑰(默認放在~/.ssh目錄下,id_rsa.pub為公鑰,id_rsa為私鑰)

    ssh-keygen
    # 一直回車,生成密鑰
    

       image-20201109122832255

  2. 拷貝公鑰的內容,設置到GitHub

       image-20201109123020419

       image-20201109123054432

       image-20201109123124135

       image-20201109123151717

  3. Git本地配置SSH地址

       image-20201109123341973

    git remote add origin git@github.com:KAKOFS/NBSite.git # ssh地址
    
  4. 使用時用以下命令

    git push origin 分支名
    

fork源碼

   如果你想對一些框架的源碼做出貢獻,可以使用以下步驟向框架開發者提出合並請求。

  1. fork源代碼,將別人源碼拷貝到我自己的遠程倉庫。

       image-20201109124132770

       image-20201109124200913

       image-20201109124217238

       image-20201109124237459

  2. 在自己倉庫中進行修改代碼

       image-20201109145637856

       image-20201109145654209

  3. 給源代碼作者提交修復bug申請。(pull request)

       image-20201109124413122

   image-20201109145734448

   image-20201109145751620

忽略文件

   在項目中創建.gitignore文件,輸入匹配規則,當前項目中所有匹配的文件將不會被Git所管理。

   image-20201109150445231

   image-20201109150350306

   image-20201109150458401

   你還可以有更多的匹配規則:

*.h 	 	# 忽略.h的后綴文件
!a.h  	 	# 但是不忽略a.h這個文件
files/   	# 忽略該文件夾下所有文件
*.py[a|b|c] # 忽略pya、pyb、pyc為后綴的文件

issues&wiki

   issues可以提出一些你發現的問題,開發者會給你進行解答。

   image-20201109150846433

   image-20201109151129671

   使用wiki來對你的項目進行描述,以方便你走后接替你工作的人更快的熟悉該項目。

   image-20201109151237537

刪除不存在的分支

   多人合作開發時,如果遠程的分支被其他開發刪除掉,在本地執行 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

參考文獻

  1. git實戰課程
  1. Git在團隊中的最佳實踐--如何正確使用Git Flow
  1. Git命令大全


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM