1. 程式人生 > 實用技巧 >集腋成裘-21-git使用-03進階篇

集腋成裘-21-git使用-03進階篇

前言

集腋成裘-12-git使用-01建立庫集腋成裘-13-git使用-02進階篇從使用層面進行了簡單的介紹,下面從命令形式進行介紹

一、快速入門

1.1 Git與GitHub

  Git是一個開源的分散式版本控制軟體,用以有效、高速的處理從很小到非常大的專案版本管理。Git 最初是由Linus Torvalds設計開發的,用於管理Linux核心開發。Git 是根據GNU通用公共許可證版本2的條款分發的自由/免費軟體,安裝參見:http://git-scm.com/

  GitHub是一個基於Git的遠端檔案託管平臺(同GitCafe、BitBucket和GitLab等)。

  Git本身完全可以做到版本控制,但其所有內容以及版本記錄只能儲存在本機,如果想要將檔案內容以及版本記錄同時儲存在遠端,則需要結合GitHub來使用。使用場景:

  • 無GitHub:在本地 .git 資料夾內維護歷時檔案
  • 有GitHub:在本地 .git 資料夾內維護歷時檔案,同時也將歷時檔案託管在遠端倉庫

其他:

集中式:遠端伺服器儲存所有版本,使用者客戶端有某個版本
分散式:遠端伺服器儲存所有版本,使用者客戶端有所有版本

 一言以蔽之:GitHub是檔案遠端存放的平臺,Git是檔案版本控制的工具

1.2 HelloGit

  安裝過程不再贅述,這裡開始第一行程式碼,即檢查Git是否安裝成功

$ git --version
檢視版本號

1.3 基本概念

我們先來理解下Git 工作區、暫存區和版本庫概念

  • 工作區:就是你在電腦裡能看到的目錄。
  • 暫存區:英文叫stage, 或index。一般存放在 ".git目錄下" 下的index檔案(.git/index)中,所以我們把暫存區有時也叫作索引(index)。
  • 版本庫:工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。

二、Git使用之小P創業史

假設小P準備建立一個《網上書城》的專案,

2.1 初創期:單槍匹馬自己幹

  2.1.1通過git控制程式碼

  把檔案納入到版本控制大致分三步:

  • 進入資料夾進行初始化
  • 新增要管理的檔案
  • 生成版本
  1. 進入待管理資料夾
    cd /檔案路徑
  2. 初始化
    git init
  3. 檢視管理目錄下的檔案狀態
    git status
  4. 管理指定檔案(紅變綠)
    git add 檔名
    git add . 
  5. 生成版本

    git commit -m '版本備註資訊'
  6. 檔案配置(如果是首次commit命令,需要通過以下命令配置跟人資訊)

    git config --global user.email "[email protected]"
    git config --global user.name "Yango"
  7. 檢視日誌
    git log
    git log --graph --pretty=format:"%h %s"

 

2.1.2 完善、拓展新功能

  對歷史功能的完善,如:完善了index.html首頁功能

  拓展新功能,添加了readme系統說明

  此時兩個檔案都會變紅,需要重新新增(gitadd .),並提交(git commit -m '備註')

git add .
git commit -m '備註'

2.1.3新增打折功能,到期後回滾

  世界讀書日,需要新增一個打5折優惠功能,假設需要修改到index頁面和新增一個discount.py檔案。

  過了這天后,價格恢復原價,程式碼回滾  

  回滾流程:一、找到想要回滾的版本號。二、回滾
git add .
git commit -m 'v4版本,世界讀書日,全場五折'
世界讀書日,全場五折
git log檢視日誌,找到想要回滾的版本號
git log
git reset --hard 要回滾的版本號

2.1.4商城&緊急bug修復

  正常開發一個功能(商城功能)是在dev分支上進行的,線上突然有一個緊急bug需要修復,

  

  1. 檢視分支
    git branch
  2. 建立分支
    git branch dev
  3. 切換分支
    git checkout dev
    

      

  4. 同樣道理從master分支上切出一個bug分支,並在bug分支上修改相應的bug,並進行commit提交
  5. 合併分支(可能會有衝突)
    1:切換到mater分支並檢查
    git checkout master
    git branch
    2:把bug分支merge到主幹上
    git merge bug_01 
  6. 刪除分支
    1.  
      git branch -d 分支名
       
  7. 繼續在dev上分支開發,開發完成後提交
    1.   
  8. 產生處理(此時再回到master分支進行合併dev分支,由於共同修改了index.html檔案,所以會發生衝突)
  9. 手動處理後並再次commit提交

  

2.2 GitHub

  2.2.1準備工作

  • 申請賬號
  • 建立雲端倉庫

  2.2.2把程式碼推送到GitHub

  • 1:給遠端倉庫起別名
    git remote add origin https://github.com/1692134188/bookstore.git
    2:向遠端推送程式碼 git push -u origin master

  2.2.3初次在公司新電腦下載程式碼

1:克隆遠端倉庫程式碼(內部已實現git remote add origin 遠端倉庫地址)
git clone 遠端倉庫地址
2:切換分支
git checkout 分支

  2.2.4在公司的dev上面開發程式碼,推送到遠端

1:切換到dev分支
git checkout dev
2:把master分支合併到dev
git merge master
3:修改程式碼
4:提交程式碼
git add .
git commit -m ''
5:推送到遠端
git push origin dev

  2.2.5回到家,獲取遠端程式碼,繼續寫

1:切換到dev分支
git checkout dev
2:從遠端拉取程式碼
git pull origin dev
3:繼續開發

4:提交程式碼
git add .
git commit -m ''
5:推送到遠端
git push origin dev

  。。。。。周而復始,直到有一天,出了差錯,

 2.2.6在公司寫完程式碼沒有及時提交到遠端

1:切換到dev分支
git checkout dev
2:從遠端拉取程式碼
git pull origin dev
3:繼續開發

4:提交程式碼
git add .
git commit -m ''
5:推送到遠端
在公司繼續寫程式碼,但是忘記推送了!!!!!!!!!

 2.2.7回到家,發現公司寫的程式碼沒有提交,但是也只能再開發別的功能了

1:切換到dev分支
git checkout dev
2:從遠端拉取程式碼  啊沒有拉取到內容,倒黴忘記提交了
git pull origin dev  
3:繼續開發

4:提交程式碼
git add .
git commit -m ''
5:推送到遠端
git push origin dev

2.2.8回到公司,拉取程式碼,合併程式碼,如有衝突解決衝突

2.2.9 其他

gitpullorigindev =gitfetchorigindev +gitmergeorigindev

2.3 rebase變基

  使提交記錄更簡潔,不分叉

2.3.1 場景一:多次commit記錄整合

  舉個例子,現在在一個新的future分支建立一個商城線上聊天室功能。假設第一天開發了前端,第二天開發了後臺端40%,三天開發後端70%,第四天開發後臺90%,第五條開發後端100%。

應用場景一:合併多次提交記錄,更簡潔
1:切換到master分支,
$ git checkout master
2:把dev分支合併到master
$ git merge dev
3:從master上切一個新的future分支,用於開發聊天室ChatRoom
git branch ChatRoom
4:回到ChatRoom開始開發
git checkout ChatRoom
5:開發第一天
$ git add .
$ git commit -m 'ChatRoom V1:前端開發完成'
6:開發第二天
$ git add .
$ git commit -m 'ChatRoom V2:後端完成40%'
7:開發第三天
$ git add .
$ git commit -m 'ChatRoom V3:後端完成70%'
8:開發第四天
$ git add .
$ git commit -m 'ChatRoom V4:後端完成90%'
9:開發第五天
$ git add .
$ git commit -m 'ChatRoom V5:後端完成100%'
聊天室提交記錄

我們需要把V2和V5版本統一整合成一次提交記錄:後端開發完成,按照截圖示識修改一些檔案內容

10:開始變基(方式一)
git rebase -i 版本號:表示要合併的起始位置
$ git rebase -i  08131d08ac095679d7bad5517cdc406e2da254a4
11:開始變基(方式二)
git rebase -i HEAD~n n:表示把最近的n次進行合併
git rebase -i HEAD~4

再次檢視日誌記錄

2.3.2 場景二:合併多個分支

從master上切出三個分支featureA和featureB和featureC,分別由三個開發人員開發;
A分支率先開發完成,並提交到master,
此時B分支再想同步master分支,git merge master。此時檢視日誌
如果C分支想同步master分支,git rebase master。此時檢視日誌

1:從master切出3個分支
$ git branch featureA
$ git branch featureB
$ git branch featureC
2:回到A分支上開發,開發完成並提交。推送到遠端
$ git checkout featureA
$ git add .
$ git commit -m 'A分支,版本A-1,A功能開發完成'
$ git push origin featureA

3:合併A分支到master上
$ git checkout master
$ git merge featureA

4:分支B正常開發:提交,推送到遠端
$ git checkout featureB
$ git add .
$ git commit -m '分支 B,版本B-1,開發50%'
$ git add .
$ git commit -m '分支 B,版本B-2,開發80%'
$ git push origin featureB


5:分支C正常開發:提交,推送到遠端
$ git checkout featureC
$ git add .
$ git commit -m '分支 C,版本C-1,開發60%'
$ git push origin featureC
$ git add .
$ git commit -m '分支 C,版本C-2,開發70%'
$ git push origin featureC
準備工作

此時是B分支沒有從master上merge的log日誌

6:分支B採取直接從master上merge
$ git checkout featureB
$ git log
$ git merge master
$ git log

 

此時是B分支沒有從master上rebase的log日誌

7:分支C採取從master上rebase
$ git checkout featureC
$ git log
$ git rebase master
$ git log

2.4 多人開發

  2.4.1建立組織

  

  2.4.2基於組織建立專案

  2.4.3 邀請成員進組織

  2.4.4 給成員分配許可權

  2.4.5 管理員程式碼上傳

  git init

   git add .

  git commit -m "first commit"

  git remote add origin https://github.com/YangoCity/BookStore.git

  git push -u origin master

  2.4.6 開發獲取程式碼