集腋成裘-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控制程式碼
把檔案納入到版本控制大致分三步:
- 進入資料夾進行初始化
- 新增要管理的檔案
- 生成版本
- 進入待管理資料夾
cd /檔案路徑
- 初始化
git init
- 檢視管理目錄下的檔案狀態
git status
- 管理指定檔案(紅變綠)
git add 檔名 git add .
-
生成版本
git commit -m '版本備註資訊'
-
檔案配置(如果是首次commit命令,需要通過以下命令配置跟人資訊)
git config --global user.email "[email protected]" git config --global user.name "Yango"
- 檢視日誌
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需要修復,
- 檢視分支
git branch
- 建立分支
git branch dev
- 切換分支
git checkout dev
- 同樣道理從master分支上切出一個bug分支,並在bug分支上修改相應的bug,並進行commit提交
- 合併分支(可能會有衝突)
1:切換到mater分支並檢查 git checkout master git branch 2:把bug分支merge到主幹上 git merge bug_01
- 刪除分支
-
git branch -d 分支名
-
- 繼續在dev上分支開發,開發完成後提交
- 產生處理(此時再回到master分支進行合併dev分支,由於共同修改了index.html檔案,所以會發生衝突)
- 手動處理後並再次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