Git 爲分佈式
版本控制系統,是目前最早進的版本控制
系統。javascript
思考:html
- 版本控制是啥意思?
維基百科:java
版本控制(英語:Version control)是維護工程藍圖的標準做法,能追蹤工程藍圖從誕生一直到定案的過程。此外,版本控制也是一種軟件工程技巧,藉此能在軟件開發的過程當中,確保由不一樣人所編輯的同一程序文件都獲得同步。git
百度百科:程序員
版本控制是指對軟件開發過程當中各類程序代碼、配置文件及說明文檔等文件變動的管理,是軟件配置管理的核心思想之一。github
個人理解:版本控制是一種記錄一個或若干文件內容變化,以便未來查閱特定版本修訂狀況的系統。web
通俗地說就是對一個或若干個文件的內容改動狀況按照特定的版本號進行保存,以便未來瀏覽者快速清晰瞭解文件的改動信息(內容變化信息,內容改動時間,做者等)算法
名稱:Linus Torvalds 林納斯 託瓦茲) 芬蘭人 現受聘于開放源代碼開發實驗(OSDL:Open Source Development Labs, Inc)數據庫
自傳: 《樂者爲王》just for funvim
本地版本控制系統
集中式版本控制系統
分佈式版本控制系統
思考:
怎麼理解分佈式與集中式?(廖雪峯老師給出的理解)
- 集中式:版本庫是集中存放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此要先從中央服務器取得最新的版本,而後開始幹活,幹完活了,再把本身的活推送給中央服務器。中央服務器就比如是一個圖書館,你要改一本書,必須先從圖書館借出來,而後回到家本身改,改完了,再放回圖書館。
- 分佈式:分佈式版本控制系統根本沒有「中央服務器」,每一個人的電腦上都是一個完整的版本庫,這樣,你工做的時候,就不須要聯網了,由於版本庫就在你本身的電腦上。
SVN的優缺點:
Git的優缺點:
SVN與Git的最主要的區別:
SVN與GIT的特性對比:
特性 | SVN | GIT |
---|---|---|
架構模式 | 集中式 | 分佈式 |
安全性 | 較差,按期備份 | 高,開發者本地電腦就是一個完整的版本庫 |
適用性 | 文檔管理, | 代碼管理, |
易用性 | 簡單上手,對新手友好 | 上手困難,學習成本高但效率搞 |
靈活性 | 較低,易發生單點故障,拉取分支 | 高,單機本地操做,多個備份,本地新建分支 |
權限管理 | 擁有嚴格的權限管理 | 尚無嚴格權限管理,有帳號角色劃分 |
GitHub是什麼?
Github與Git的關係?
GitHub能作什麼?
Gitlab是什麼?
+ GitLab 是一個用於倉庫管理系統的開源項目,使用Git做爲代碼管理工具,並在此基礎上搭建起來的web服務(在線代碼倉庫管理軟件)。
Gitlab與GitHub的區別?查看對比
Gitlab能爲咱們作什麼?
國內代碼託管平臺
咱們使用Git來記錄每一次文件內容的變動,版本的更新,清晰地比較出不一樣版本的內容差別;可使用Git在項目的歷史版本自如地進行切換;還可使用Git從當前項目的更改中撤銷一些操做,能夠新建分支,合併分支甚相當聯遠程服務器倉庫等,這一切的背後都是怎麼實現的?瞭解Git的思想以及基本原理這些操做也就略知一二了。
Gi的數據存儲原理
Git對象
Git的底層命令、高層命令
Git經常使用命令共有30多個,可運行git help
查看;但Git總共有130多個命令,能夠經過git help -a
查看,這些命令能夠分爲高層命令和底層命令,底層命令被設計成unix風格,不經常使用
Git的引用(reference或refs)
瀏覽完整的提交歷史,但爲了能遍歷那段歷史從而找到全部相關對象,須要記住最後提交的SHA-1值。咱們須要一個文件來保存 SHA-1 值,並給文件起一個簡單的名字,而後用這個名字指針來替代原始的 SHA-1 值。文件被稱爲「引用(references,或縮寫爲 refs)」,使用git branch (branchname)
這樣的命令時,Git 實際上會運行 update-ref
命令,取得當前所在分支最新提交對應的 SHA-1 值,並將其加入你想要建立的任何新引用中。
HEAD引用
git/refs/heads
目錄下,每個分支對應一個文件遠程引用
refs/remotes
目錄下.git下的文件夾
info 文件夾下的exclude文件包含項目全局忽略匹配模式,與.gitignore文件互補
logs 保存全部更新的引用記錄
objects 文件夾存儲着Git數據庫的全部內容,存儲全部Git的對象
refs 文件夾存儲着全部分支指向各自提交對象的指針;本地分支,遠端分支,標籤等
heads 記錄commit分支的樹根
remotes 記錄從遠程倉庫copy來的commit分支的樹根(只讀)
origin
.git下的文件
高級命令
HEAD
commit
branch
merge 合併指定分支
思考:
git merge 與 git rebase 的區別是?
- rebase會合並該分支與其餘分支的commit history,可能會獲得一個新的commit history
- rebase獲得更簡潔的項目歷史,去掉了merge commi,若是合併出現代碼問題不容易定位,由於re-write了commit history
- merge會建立新的commit,包括每一個分支的commit 詳情
- 每次merge會自動產生一個merge commit,特別是commit比較頻繁時,看到分支很雜亂。
- 想要獲得一個乾淨的,沒有merge commit的線性commit歷史記錄,選擇git rebase
- 想要獲得一個完整的commit歷史記錄,且想避重寫commit歷史記錄的風險,選擇git merge
git reset 與 git rebase的區別?
- git revert會生成一個新的提交來撤銷某次提交,這次提交以前的commit都會被保留,也就是說對於項目的版本歷史來講是往前走的。
- git reset 則是回到某次提交,相似於穿越時空。
gitflow工做流約定使用的分支簡介
首先,完成中央倉庫的初始化,將新項目搭建起框架後的工程代碼或要轉gitflow的項目代碼上傳至git中央倉庫。項目負責人克隆中央倉庫到本地造成master分支,並拉取develop分支(步驟①)推送至服務器。通常的實際場景,開發團隊中只有項目負責人有權限操做master分支,拉取develop分支,並將develop分支的代碼合併到master分支中。
而後,開發團隊中的其餘人克隆中央倉庫的develop分支到本地,造成全體成員統一的惟一的develop分支軌跡。以後,按照需求及成員各自的分工,各個成員能夠從develop分支拉取出各自的featrue分支(步驟②)進行獨立的開發;若涉及到多人合做開發同一分支,拉取的分支要及時推送至服務器,便於各成員共享。
當各成員完成各自的功能開發後,需將完成後的代碼提交到featrue分支,而後合併到develop分支(步驟③)。代碼合併後,featrue分支能夠再也不保留。
功能累積足夠且穩定或到達約定的提測週期時,項目負責人應當從develop分支拉取出release分支(步驟④),打包提交相應的版本給測試人員進行部署測試,測試中提交的bug所有在該release分支完成修改。
測試結束並完成bug修復後,release分支應該合併回develop分支和master分支(步驟⑤),代碼合併後,release分支能夠再也不保留。合併後的master分支,應由項目負責人及時推送到中央倉庫(步驟⑥)。同時全體成員要及時同步本身develop分支。
有上線需求時,直接從master分支打包提交應用版本進行部署。當線上版本出現重大bug,項目負責人需從master分支拉取hotfix分支(步驟⑦),進行線上的緊急修復。
最後,修復後的hotfix分支要合併回develop分支和master分支(步驟⑧)。並推送到中央倉庫(步驟⑨)。
獲取Git倉庫
git init
初始化倉庫git clone
一個倉庫合併其它分支的代碼
撤銷合併merge/rebase
git reset --hard [commit]
工做區、暫存區撤回到制定的commit版本git reset --merge [commit]
或者 git reset --merge HEAD^
撤回到合併前的commit修改某次的commit
git commit -amend -m 'comment'
替換上一次的commitgit rebase -i HEAD~[數字n]
進入vim編輯模式,並顯示最近n條最新的commit記錄撤銷某次的commit
git revert HEAD
產生新一次commit來抵消上一次提交git revert commit_id
撤銷中間某次commitgit revert -m commit_id
撤銷其餘分支合過來的commitgit revert --no-commit commit1..commit5
撤銷commit1(不包括)至commit5之間的連續commit
git revert的參數:--no-edit:執行時不打開默認編輯器,直接使用 Git 自動生成的提交信息。
--no-commit:只抵消暫存區和工做區的文件變化,不產生新的提交。
丟棄某次commit
git reset [last good SHA]
丟棄掉某個提交以後的全部提交,在提交歷史中完全消失git reset --hard [last good SHA]
--hard
參數可讓工做區裏面的文件也回到之前的狀態查看提交歷史記錄
查看文件的改動
git diff
對比工做區與暫存區的同文件, 未添加至暫存區的文件改動git diff --staged/cached
查看添加至暫存區全部文件的內容修改git state
顯示工做目錄和暫存區的狀態暫存文件的改動
git stash
臨時保存和恢復工做區文件的改動撤銷文件的改動
撤銷暫存區的文件
git rm --cache [filename]
網站連接
視頻網站
相關書籍