1. 程式人生 > >Git版本控制 Git、github,gitlab相關操作

Git版本控制 Git、github,gitlab相關操作

目錄

  • 關於版本控制
    • 版本管理工具
      • 集中式管理
      • 分散式管理
  • git版本管理
    • git介紹
    • 軟體安裝
    • Git工作狀態
    • 原理流程步驟
    • git基本操作
      • 對檔案進行修改
    • 分支
    • 共享倉庫
      • 建立共享倉庫:
      • 共享倉庫上傳程式碼
      • 從共享倉庫下拉程式碼
    • 解決衝突
      • 解決衝突
    • gitLab操作
      • 配置ssh金鑰
    • gitHub操作 和gitLab大同小異
    • 開發工具中git使用
      • 提交檔案
      • 分支開發
      • 合併分支
      • 衝突解決
      • 日誌檢視
      • 版本檢視
      • 版本回退
      • 對比不同版本
  • GitworkFlow
    • workFlow
    • Git Flow:
    • GitHub Flow :
    • GitLab Flow
    • 合併請求
      • 建立團隊:
      • 分支許可權與合併請求
  • 忽略檔案

關於版本控制

  1. 什麼是版本控制
  1. 版本控制(Version Control Systems)版本控制(Revision control)是一種軟體工程技巧
  2. 在開發的過程中,確保由不同人所編輯的同一檔案都得到更新
  1. 舉例
  1. 我們通常都是手動的重新命名一個檔案進行備份的 hello.java改成hello1.java或者hello.java.bak等形式
  2. 然後這種方式對於單個檔案我們還能夠管理,但是對於整個專案而言,就會成為噩夢了!!!
  1. 檔案版本常見問題
  1. 合併程式碼:兩個人寫的程式碼如何合併到一起
  2. 版本回退:在寫程式碼過程當中, 程式碼出現錯誤,如如何才能加回到以前沒有錯誤的程式碼

版本管理工具

集中式管理

特點:

  1. 集中式版本控制系統,版本庫是集中存放在中央伺服器的 而幹活的時候,用的都是自己的電腦
  2. 所以要先從中央伺服器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央伺服器 中央伺服器就好比是一個圖書館
  3. 你要改一本書,必須先從圖書館借出來,然後回到家自己改,改完了,再放回圖書館

缺點:

集中式版本控制系統最大的毛病就是必須聯網才能工作 所有的版本都在一個伺服器上面 如果服務掛了, 所有記錄的版本都沒了

分散式管理

特點:

  1. 分散式版本控制系統,則不需要中央伺服器
  2. 每個協同開發者都擁有一個完整的版本庫
  3. 這麼一來,任何協同開發者用的伺服器發生故障
  4. 事後都可以用其它協同開發者本地倉庫恢復
    結構:

使用方式:

  1. 在實際使用分散式版本控制系統的時候,其實很少在兩人之間的電腦上推送版本庫的修改,
  2. 因為可能你們倆不在一個區域網內,兩臺電腦互相訪問不了,也可能今天你的同事病了,他的電腦壓根沒有開機。
  3. 因此,分散式版本控制系統通常也有一臺充當“中央伺服器”的電腦,
  4. 但這個伺服器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣幹活,只是交換修改不方便而已。

git版本管理

git介紹

  1. git是一款開源的分散式版本管理工具,作者Linux之父-Linus
  2. 當初Linus 僅僅是為了輔助Linux核心的開發才一併開發了這個至今為止世界上最快的、最簡單的版本管理工具

軟體安裝

git下載地址

安裝步驟:點選exe檔案,一直下一步

安裝完成效果

Git工作狀態

  1. Git 管理專案時,檔案流轉分為三個工作區域

Git 的工作目錄, 暫存區域, 以及本地倉庫

  1. 對於任何一個檔案,在 Git 內都只有三種狀態

1.已修改(modified) 已修改表示修改了某個檔案,但還沒有提交儲存
2.已暫存(staged) 已暫存表示把已修改的檔案放在下次提交時要儲存的清單中
3.已提交(committed) 已提交表示該檔案已經被安全地儲存在本地資料庫中了

原理流程步驟

  1. 工作目錄
  1. 從專案中取出某個版本的所有檔案和目錄,用以開始後續工作的叫做工作目錄
  2. 這些檔案實際上都是從 Git 目錄中的壓縮物件資料庫中提取出來的
  3. 接下來就可以在工作目錄中對這些檔案進行編輯
  1. 暫存區域

只不過是個簡單的檔案 .git目錄之下,名為index,它一般很小,一般不超過1KB左右 一般都放在 Git 目錄中
有時候人們會把這個檔案叫做索引檔案
暫存區這個索引檔案裡面包含的是檔案的目錄樹,像一個虛擬的工作區,在這個虛擬工作區的目錄樹中,記錄了檔名、檔案的時間戳、檔案長度、檔案型別以及最重要的SHA-1值,檔案的內容並沒有儲存在其中
暫存區的作用:除非是繞過暫存區直接提交,否則Git想把修改提交上去,就必須將修改存入暫存區最後才能commit。每次提交的是暫存區所對應的檔案快照

  1. git目錄(本地倉庫)
  1. 當我們在某個目錄下執行git init命令後,在該目錄下便會生成一個.git的子目錄,這個目錄是隱藏的。
  2. 它是 Git 用來儲存元資料和物件資料庫的地方,這個目錄可以說是Git的核心
  3. 每次克隆映象倉庫時,實際上拷貝的這個目錄裡的內容而已
  1. 工作流程

1、在工作目錄中修改檔案。
2、暫存檔案,將檔案的快照放入暫存區域。
3、提交更新,找到暫存區域的檔案,將快照永久性儲存到Git倉庫目錄。 示圖

git基本操作

  1. 初始化使用者名稱和郵箱
git config --global user.name "自已的名字"
git config --global user.email "自已的郵箱地址"
# 檢視配置的資訊 git config --list
  1. 建立一個空的資料夾
  2. 在空的工程中通過git base here命令視窗初始化倉庫

  3. 在空的專案當中建立新增一些檔案
  4. 檢視這些檔案在git當中的狀態 命令:git status

    發現檔案和資料夾的顏色都是紅色 ,當出現這種情況的時候, 說明這些檔案還沒有新增到git倉庫當中
  5. 把檔案新增git倉庫中
    執行git add *命令後, 再檢視狀態

    此時全部變成綠色, 檔案已經新增到git暫存區當中,還沒有提交
  6. 提交 執行git commit

    在執行commit的時候 ,會進入一個vi編輯器介面, 提示讓輸入資訊, 輸入本次做了哪些操作, 儲存並退出即可

    在檢視狀態,已經沒有任何需要提交的資料了
  7. 檢視歷史: git log 檢視提交日誌

對檔案進行修改

  1. 開啟index.txt對檔案的內容新增進行修改
  2. 修改之後再檢視狀態時,會出現modified狀態

    此時需要再次提交到暫存區並提交
    執行 git add * 和 git commit
  3. 通過git log檢視日誌,可以看到,有一條新的sha記錄
  4. 恢復歷史
    第一個sha就是一個版本記錄, 可能使用reset命令恢復到指定的版本
    命令:git reset --hard sha值

分支

  1. 分支概念:
  1. 使用分支意味著你可以把你的工作從開發主線上分離開來,以免影響開發主線
  2. 幾乎所有的版本控制系統都以某種形式支援分支。
  1. 建立分支:
    命令:git branch 分支名稱
  2. 檢視分支
    命令:git branch

    綠色為當前所在分支,預設有一個master主分支
  3. 切換分支
    命令:git checkout 分支名稱
  4. 在newBranch分支上新增一些新的程式碼

    在次檢視狀態

    提交

    再次切換到master分支上,檢視日誌,裡面並沒有在newBranch中新增的程式碼
  5. 合併分支
    命令:git merge 分支名稱
  6. 刪除分支
    命令:git branch -d 分支名稱

共享倉庫

  1. 使用者clone專案
    在當中目錄下,clone使用者1專案
    命令:git clone 要複製的專案路徑和名稱 複製之後的專案路徑和名稱
  2. 共享倉庫建立
    共享倉庫特點:
  1. 以專案名稱.git結尾
  2. 看不到工作區
  3. 它只用來共享, 不能夠進行修改新增等操作
  4. 從共享倉庫當中clone的程式碼是可以看到工作的

建立共享倉庫:

命令:

兩種方式:

  1. git init --bare 倉庫名稱
  2. git clone --bare 要clone的專案路徑和名稱

共享倉庫上傳程式碼

  1. 在本地倉庫當中新增檔案, 新增加到本地倉庫
  2. 先提交到本地倉庫,再推送到遠端倉庫

推送命令:git push 遠端倉庫地址 分支名稱

從共享倉庫下拉程式碼

命令:git pull 倉庫地址 分支名稱
新建goods1資料夾 並初始化

解決衝突

  1. 什麼是衝突

兩個人共同協作開發時, 改了相同的檔案,都做了提交

  1. 什麼情況下會產生衝突
  1. 兩人同時更改了相同的程式碼,並且都提交到了本地.
  2. 先提交到遠端倉庫的人不會有任何問題
  3. 後提交的人,需要先pull下來,在pull的時候,就會產生衝突
  4. 這時就需要先解決衝突,解決衝突完畢後,提交到本地, 再提交到遠端倉庫

操作:
使用者1更改程式碼,提交程式碼,使用者2做同樣的操作

使用者2提交遠端的時候會報錯

解決衝突

先從遠端倉庫下拉程式碼,但是也會出現報錯

解決方案:
開啟下拉的檔案,進行手動修改,保留最終資料

刪除<<<<<<head ======== >>>>>>>sha值
保留最終程式碼

在進行提交遠端

gitLab操作

得現有gitLab賬號,登陸上去 gitLab官方地址

  1. 建立一個新的倉庫
  2. 填寫相關資訊

    建立完成

配置ssh金鑰

  1. 點選add an SSH key
  2. 在本地電腦當中新增生成金鑰
    命令:ssh-keygen -t rsa --在客戶端上生成一對金鑰,-t 指定加密型別
    在電腦C盤使用者當中檢視生成的金鑰:
  3. 把id_rsq.pub的內容複製到gitlab當中
  4. clone遠端的倉庫到本地當中


  5. 本地檔案push到遠端倉庫

gitHub操作 和gitLab大同小異

開發工具中git使用

  1. 從gitHub上Clone程式碼
  1. 在IEDA裡配置git執行程式的路徑:選擇 【File】→ 【Settings】→ 【Vwesion Control】→ 【Git】
  2. 在遠端git伺服器上建立倉庫
  3. 開啟IDEA,選擇選單上的 VCS(版本控制工具),選擇【Checkout from Version Control】→【Git】
    然後將上邊複製的 git倉庫地址貼上到URL中,選擇一個本地一個空的目錄作為工作區

提交檔案

  1. 新增檔案到暫存區

在每建立一個檔案的時候, 都會提示新增到暫存區

如果沒有新增到暫存區當中, 也可以手動新增

  1. 提交到本地倉庫

完成程式碼的開發後,需要將修改和新增的程式碼或檔案提交到本地倉庫上(檔案已新增至暫存區,受git追蹤)
選擇【VCS】→ 【Commit】

  1. 推送到遠端倉庫

把程式碼推送到遠端伺服器上,點選專案右鍵,【Git】→【 Repositry 】→【Push】

分支開發

假如,現在專案開發完成,需釋出1.0版本,然後新增一個1.0的分支

  1. 建立分支
  2. 開啟git分支的面板,點選【New Branch】

    切換回主分支

合併分支

把主分支(master分支)與1.0分支進行合併

衝突解決

  1. 在newbranch分支上c.txt編寫程式碼並提交
  2. 在master分支上c.txt編寫程式碼並提交

日誌檢視

版本檢視

版本回退

當你誤刪了一段程式碼(方法),但又提交了,可以使用下面的操作來進行回退 開啟檔案的歷史提交記錄

對比不同版本

  1. 對單個程式碼檔案的比較,點選檔案,右鍵彈出的選單選項 → 【Git 】→ 【compare with...】
  2. Compare with the Same Repository Version 當前檔案與伺服器同一分支上該檔案版本的內容進行比較
  3. Compare with 當前檔案與檔案各次提交的版本做比較
  4. Compare with Branch 當前檔案與其他分支上該檔案版本進行比較

GitworkFlow

workFlow

概念:

  1. WorkFlow 的字面意思,工作流,即工作流程
  2. 專案開發中,多人協作,分支很多,雖然各自在分支上互不干擾,但是我們總歸需要把分支合併到一起
  3. 而且真實專案中涉及到很多問題,例如版本迭代,版本釋出,bug 修復等
  4. 為了更好的管理程式碼,需要制定一個工作流程,這就是我們說的工作流,分支管理策略
  5. 工作流不涉及任何命令,因為它就是一個規則,完全由開發者自定義,並且自遵守

常用工作流形式:

  1. Git Flow:Git Flow 出現的最早
  2. GitHub Flow:GitHub Flow 在 Git Flow 的基礎上,做了一些優化,適用於持續版本的釋出
  3. GitLab Flow:GitLab Flow 出現的時間比較晚,所以綜合前面兩種工作流的優點,制定而成的一個工作流

Git Flow:

特點:採用 Git Flow 工作流的專案中,程式碼的中央倉庫會一直存在以下兩個長期分支
主要分支:

  1. master:分支上的最新程式碼永遠是版本釋出狀態
  2. develop:分支則是最新的開發進度

協助分支:

Feature Branch:

  1. Feature 分支用來做分模組功能開發
  2. 模組完成之後,會合併到 develop 分支,然後刪除自己。

Release Branch:

  1. Release 分支用來做版本釋出的預釋出分支,建議命名為 release-xxx
    例如:
    在軟體 1.0.0 版本的功能全部開發完成,提交測試之後,從 develop 檢出release-1.0.0
    測試中出現的小問題,在 release 分支進行修改提交,測試完畢準備釋出的時候,程式碼會合併到 >master 和 develop,master 分支合併後會打上對應版本標籤 v1.0.0, 合併後刪除自己

Hotfix Branch:

  1. Hotfix 分支是用來做線上的緊急 bug 修復的分支,建議命名為 hotfix-xxx
  2. 當線上某個版本出現了問題,將檢出對應版本的程式碼,建立 Hotfix 分支,問題修復後,合併回 master 和 develop ,然後刪除自己

Git Flow 示意圖:

  1. master 和 develop 字型被加粗代表主要分支
  2. master 分支每合併一個分支,無論是 hotfix 還是 release ,都會打一個版本標籤
  3. feature 分支從 develop 開始,最終合併回 develop
  4. hoxfixes 從 master 檢出建立,最後合併回 develop 和 master

GitHub Flow :

概述:

  1. 是大型程式設計師交友社群 GitHub 制定並使用的工作流模型
  2. 因為 Git Flow 對於大部分開發人員和團隊來說,稍微有些複雜,而且沒有 GUI 圖形頁面,只能命令列操作, 所以為了更好的解決這些問題,GitHub Flow 應運而生了

特點:

  1. GitHub Flow 推薦做法是隻有一個主分支 master
  2. 團隊成員們的分支程式碼通過 pull Request 來合併到 master 上

模型說明:

  1. 只有一個長期分支 master ,而且 master 分支上的程式碼,永遠是可釋出狀態,一般 master 會設定 protected 分支保護
  2. 只有有許可權的人才能推送程式碼到 master 分支
  3. 如果有新功能開發,可以從 master 分支上檢出新分支
  4. 在本地分支提交程式碼,並且保證按時向遠端倉庫推送
  5. 當你需要反饋或者幫助,或者你想合併分支時,可以發起一個 pull request。
  6. 當 review 或者討論通過後,程式碼會合併到目標分支
  7. 一旦合併到 master 分支,應該立即釋出

合併請求特點:

  1. 可以很好控制分支合併許可權
  2. 分支不是你想合併就合併,需要對方同意
  3. 程式碼 Review

issue tracking 問題追蹤

開發中,會用到很多第三方庫,然後使用過程中,出現了問題,是不是第一個反應是去這個第三方庫的 GitHub 倉庫去搜索一下 issue
,看沒有人遇到過,專案維護者修復了沒有,一般未解決的 issue 是 open 狀態,已解決的會被標記為 closed。這就是 issue
tracking

GitLab Flow

概述:

GitLab 既支援 Git Flow 的分支策略,也有 GitHub Flow 的 Pull Request( Merge Request
) 和 issue tracking

存在問題:

  1. 版本的延遲釋出(例如 iOS 應用稽核到通過中間,可能也要在 master 上推送程式碼)
  2. 不同環境的部署 (例如:測試環境,預發環境,正式環境)
  3. 不同版本釋出與修復 (只有一個 master 分支真的不夠用)
  4. GitLab 推薦用生產分支來解決上述問題
  5. 對於"持續釋出"的專案,它建議在master分支以外,再建立不同的環境分支

上游優先原則:

什麼是上游優先:

  1. Gitlab flow 的最大原則叫做"上游優先"(upsteam first)
  2. 即只存在一個主分支master,它是所有其他分支的"上游"。只有上游分支採納的程式碼變化,才能應用到其他分支。

舉例:

  1. "開發環境"的分支是master,"預發環境"的分支是pre-production,"生產環境"的分支是production。
  2. 開發分支是預發分支的"上游",預發分支又是生產分支的"上游"。程式碼的變化,必須由"上游"向"下游"發展。production。
  3. 比如,生產環境出現了bug,這時就要新建一個功能分支,先把它合併到master,
  4. 確認沒有問題,再提交到pre-production,這一步也沒有問題,才進入production

版本釋出:

  1. 對於"版本釋出"的專案,建議的做法是每一個穩定版本,都要從master分支拉出一個分支
  2. 比如2-3-stable、2-4-stable等等。
  3. 以後,只有修補bug,才允許將程式碼合併到這些分支
  4. 並且此時要更新小版本號

合併請求

建立團隊:


填寫資訊

邀請成員

分支許可權與合併請求

在指定專案上建立分支:

預設主分支是受保護的
當一個分支是一個受保護的分支時,必須要發起合併請求後操作

設定分支許可權
設定儲存分支入口

展開分支儲存按鈕

忽略檔案

在專案開發中,我們使用git託管專案時往往會忽略一些不必要的檔案或資料夾

步驟:在版本庫根目錄建立.gitignore,修改檔案,新增忽略正則
規則:

?:代表任意的一個字元
*:代表任意數目的字元 {!ab}:必須不是此型別 {ab,bb,cx}:代表ab,bb,cx中任一型別即可
[abc]:代表a,b,c中任一字元即可
[ ^abc]:代表必須不是a,b,c中任一字元

示例:

注意事項:

  1. 新增忽略之後,已經提交到版本庫中的檔案是無法忽略的,只能clone到本地,刪除後,再進行忽略
  2. gitignore只能忽略那些原來沒有被track的檔案,如果某些檔案已經被納入了版本管理中,則修改.gitignore是無效的。