版本控制(Version Control System)html
l 記錄文件的全部歷史變化java
l 錯誤恢復到某個歷史版本git
l 多人協做開發編輯同一個文件github
名稱web |
模型數據庫 |
併發模式編程 |
歷史模式vim |
變動範圍安全 |
網絡協議bash |
原子提交性 |
CVS |
Client-Server |
Merge |
Changeset |
File |
Pserver,ssh |
No |
SVN |
Client-Server |
3-way merge, recursive merge, octopus merge |
Changeset and Snapshot |
Tree |
custom (svn), custom (svn) over ssh, HTTP and SSL (usingWebDAV) |
Yes |
Git |
Distributed |
Merge or lock |
Snapshot |
Tree |
custom, custom over ssh, rsync, HTTP/HTTPS, email, bundles |
Yes |
* 版本庫模型(Repository model):描述了多個源碼版本庫副本間的關係,有C/S(客戶端/服務器)模式和分佈式兩種模式。在客戶端/服務器模式下,每一用戶經過客戶端訪問位於服務器的主版本庫,每一客戶機只需保存它所關注的文件副本,對當前工做副本(working copy)的更改只有在提交到服務器以後,其它用戶才能看到對應文件的修改。而在分佈式模式下,這些源碼版本庫副本間是對等的實體,用戶的機器除了保存他們的工做副本外,還擁有本地版本庫的歷史信息。
* 併發模式(Concurrency model):描述了當同時對同一工做副本/文件進行更改或編輯時,如何管理這種衝突以免產生無心義的數據,有排它鎖和合並模式。在排它鎖模式下,只有發出請求並得到當前文件排它鎖的用戶才能對對該文件進行更改。而在合併模式下,用戶能夠隨意編輯或更改文件,但可能隨時會被通知存在衝突(兩個或多個用戶同時編輯同一文件),因而版本控制工具或用戶須要合併更改以解決這種衝突。所以,幾乎全部的分佈式版本控制軟件採用合併方式解決併發衝突。
* 歷史模式(History model):描述瞭如何在版本庫中存貯文件的更改信息,有快照和改變集兩種模式。在快照模式下,版本庫會分別存儲更改發生先後的工做副本;而在改變集模式下,版本庫除了保存更改發生前的工做副本外,只保存更改發生後的改變信息。
* 變動範圍(Scope of change):描述了版本編號是針對單個文件仍是整個目錄樹。
* 網絡協議(Network protocols):描述了多個版本庫間進行同步時採用的網絡協議。
* 原子提交性(Atomic commit):描述了在提交更改時,可否保證全部更改要麼所有提交或合併,要麼不會發生任何改變。
簡而言之,各有優缺點,git要配合hub,能夠避免分佈式損壞。svn有權限控制,避免全被clone走。git適合純代碼,svn適合綜合性文檔管理,結合起來就完美。顯然最大的不一樣在於git是分佈式的。
Linus在1991年建立了開源的Linux,今後,Linux系統不斷髮展,已經成爲最大的服務器系統軟件了。Linus雖然建立了Linux的核心,但Linux的壯大是靠全世界熱心的志願者參與的,這麼多人在世界各地爲Linux編寫代碼,那Linux的代碼是如何管理的呢?
事實是,在2002年之前,世界各地的志願者把源代碼文件經過diff的方式發給Linus,而後由Linus本人經過手工方式合併代碼!你也許會想,爲何Linus不把Linux代碼放到版本控制系統裏呢?不是有CVS、SVN這些免費的版本控制系統嗎?由於Linus堅決地反對CVS和SVN,這些集中式的版本控制系統不但速度慢,並且必須聯網才能使用。有一些商用的版本控制系統,雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。不過,到了2002年,Linux系統已經發展了十年了,代碼庫之大讓Linus很難繼續經過手工方式管理了,社區的弟兄們也對這種方式表達了強烈不滿,因而Linus選擇了一個商業的版本控制系統BitKeeper,BitKeeper的東家BitMover公司出於人道主義精神,受權Linux社區無償使用這個版本控制系統。
安定團結的大好局面在2005年就被打破了,緣由是Linux社區牛人彙集,難免沾染了一些梁山好漢的江湖習氣。開發Samba的Andrew試圖破解BitKeeper的協議(這麼幹的其實也不僅他一個),被BitMover公司發現了(監控工做作得不錯!),因而BitMover公司怒了,要收回Linux社區的無償使用權。Linus能夠向BitMover公司道個歉,保證之後嚴格管教弟兄們,嗯,這是不可能的。實際狀況是這樣的:Linus花了兩週時間本身用C寫了一個分佈式版本控制系統,這就是Git!一個月以內,Linux系統的源碼已經由Git管理了!牛是怎麼定義的呢?你們能夠體會一下。
Git迅速成爲最流行的分佈式版本控制系統,尤爲是2008年,GitHub網站上線了,它爲開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。歷史就是這麼偶然,若是不是當年BitMover公司威脅Linux社區,可能如今咱們就沒有免費而超級好用的Git了。
l 工做區:用來保存項目的元數據和對象數據庫的地方。 這是 Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這裏的數據。
l 暫存區:保存了下次將提交的文件列表信息,通常在 Git 倉庫目錄中。有時候也被稱做「索引」,不過通常說法仍是叫暫存區域。
l 版本庫:也叫本地版本庫,之因此說git 快,大部分提交都是對本地倉庫而言的,不依賴網絡,最後一次會推送的到遠程倉庫。
l 遠程倉庫:能夠看作是github,它是一個遠程倉庫,它提供web服務供你們方便下載、查看、提交、存儲。
新建文件狀態爲untracked,add命令執行後狀態變爲staged,已存在的文件狀態爲unmodified,修改文件內容,文件狀態變爲modified,commit提交,文件狀態編程unmodifed。
l 克隆倉庫 clone 克隆
l 對工做目錄中文件新增、修改、刪除操做
l 暫存文件,將文件的快照放入暫存區 add 新增
l 把暫存區的內容提交到本地倉庫 commit 提交
l 把本地倉庫的內容提交到遠程倉庫 push 推送
l 從遠程倉庫下載最新內容 pull 拉取
每一個人必須有本身的帳號,先官網註冊帳號:https://github.com
用戶名: nutony,密碼:Tony123
Git-2.12.0-64-bit.exe,一路next,安裝完桌面右鍵菜單有下面兩項,安裝完成。選擇Git Bash,進入git客戶端。
Windows開始菜單:
提交文件時,就知道這個文件是誰提交的。出了問題,就知道誰幹的!
Administrator@tonythink MINGW64 ~/Desktop
$ cd d: #進入d盤
Administrator@tonythink MINGW64 /d
$ cd java
$ cd env
$ mkdir git_repository #建立目錄
$ cd git_repository #進入目錄
登陸:https://github.com 在git上新建一個倉庫
倉庫名爲stu,擁有者爲:nutony。
建立成功
Administrator@tonythink MINGW64 ~/Desktop
$ cd d: #進入d盤
Administrator@tonythink MINGW64 /d
$ cd java
$ cd env
$ cd git_repository #進入目錄
首次須要把遠程倉庫克隆到本地倉庫(D:\javaenv\git_repository)
$ git clone https://github.com/nutony/stu.git
本地倉庫目錄中就多了stu目錄
進入子倉庫,手動建立文件,文件內容不能爲空。
$ cd stu #建立本地倉庫
$ git init #建立本地倉庫
Administrator@tonythink MINGW64 /d/javaenv/git_repository (master)
當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,不要手動修改這個目錄裏面的文件,否則改亂了,就把Git倉庫給破壞了。若是你沒有看到.git目錄,是由於默認這個目錄是隱藏的,要顯示修改其顯示隱藏文件便可,通常無需修改。
$ git add . #添加當前目錄下文件
$ git commit -m "jttest" #提交,設置備註
能夠克隆倉庫也能夠關聯本地倉庫
運行 git remote add [shortname] [url]
git remote add stu git://github.com/nutony/stu
$ git push origin master #推送到遠程倉庫master默認分支,第一次須要登陸,比較慢,彈出登陸框輸入用戶名和密碼。
刷新網頁變成目錄的頁面,能夠看到文件也已經上傳
點擊文件能夠查看其內容
每日早上開始工做前拉取最新團隊其餘人提交的內容,每日下班前提交可用的內容
$ git checkout . #進入某個倉庫檢出當前倉庫全部文件
$ git checkout hello.txt #檢出遠程倉庫最後的版本覆蓋本地文件
$ cd stu #進入到要管理的目錄中
$ git pull #從服務器拉取最新內容
$ git add . #添加當前目錄下文件
$ git commit -m "jttest" #提交,設置備註
$ git push origin master #推送到遠程倉庫
建立hi.txt
$ git add hi.txt #增長文件到暫存區
$ git add ./* #批量暫存當前目錄下全部內容
$ git status #查看文件狀態
$ git commit -m "test" #提交,提交文件到本地倉庫
[master (root-commit) e522732] test
1 file changed, 1 insertion(+)
create mode 100644 hi.txt
$ git status #查看文件狀態
$ git log
commit e522732d94c440fdd750368ce937ac1c40dbd2ed #本次提交惟一標識,對於版本回退很是有用
Author: nutony <52399178@qq.com>
Date: Fri Jun 2 09:39:31 2017 +0800
test
$ rm *.jpg #刪除全部jpg結尾,刪除本地文件
$ ll
$ git add .
$ git commit -m 'rm'
$ git push origin master
修改hi.txt文件內容,而後和倉庫中已經提交的hi.txt比較
$ git diff hi.txt
diff --git a/hi.txt b/hi.txt
index 32f95c0..d7d0f3f 100644
--- a/hi.txt
+++ b/hi.txt
@@ -1 +1 @@
-hi
\ No newline at end of file
+<B1>Ƚϵ<B1>ǰ<CE>ļ<FE><BA>Ͳֿ<E2><CE>ļ<FE> #中文亂碼
\ No newline at end of file
Administrator@tonythink MINGW64 /d/javaenv/git_repository (master)
$ git diff hi.txt
diff --git a/hi.txt b/hi.txt
index 32f95c0..2b80830 100644
--- a/hi.txt
+++ b/hi.txt
@@ -1 +1 @@
-hi
\ No newline at end of file
+<U+FEFF>比較當前文件和倉庫文件 #文件格式改成UTF-8便可
\ No newline at end of file
Git和其餘版本控制系統如SVN的一個不一樣之處就是有暫存區的概念。
git的文件狀態,文件新建完狀態爲untracked
點擊進入倉庫,選擇Settings配置,移到頁面最下方,點擊刪除按鈕,需確認。輸入倉庫名稱,而後刪除便可。
發現提交的內容錯了,能夠進行回滾操做。
在%HOME%目錄中,通常爲C:\users\Administrator,也能夠是你本身建立的系統用戶名目錄,反正都在C:\users\中。文件名爲.git-credentials,因爲在Window中不容許直接建立以"."開頭的文件,因此須要藉助git bash進行,打開git bash客戶端,進行%HOME%目錄,而後用touch建立文件 .git-credentials, 用vim編輯此文件。右鍵打開git bash客戶端
這樣之後push推送時只只需第一次填寫用戶名密碼,後期就能夠直接推送
什麼是git?
> git是一款開源的分佈式版本控制工具 > 在世界上全部的分佈式版本控制工具中,git是最快、最簡單、最流行的
git的起源?
> 做者是Linux之父:Linus Benedict Torvalds > 當初開發git僅僅是爲了輔助Linux內核的開發(管理源代碼)
git的現狀?
> 在國外已經很是普及,國內並未普及(在慢慢普及) > 愈來愈多的開源項目已經轉移到git
> CVS - 開啓版本控制之門 - 1990年誕生,「遠古時代」的主流源代碼管理工具 > SVN - 全稱是Subversion,集中式版本控制之王者 - 是CVS的接班人,速度比CVS快,功能比CVS多且強大 - 在國內軟件企業中使用最爲廣泛(70%-90%) > ClearCase - 收費的集中式版本控制工具,安裝比Windows還大,運行比蝸牛還慢 - 能用ClearCase的通常是世界500強,他們有個共同的特色是財大氣粗或者人傻錢多 > VSS - 微軟的集中式版本控制工具,集成在Visual Studio中
全部的代碼都集中在一塊, 統一進行管理
在每一個客戶端都有一份完整的代碼倉庫, 能夠在每一個客戶端自行管理
> 速度 在不少狀況下,git的速度遠遠比SVN快 > 結構 SVN是集中式管理,git是分佈式管理 > 其餘 SVN使用分支比較笨拙,git能夠輕鬆擁有無限個分支 SVN必須聯網才能正常工做,git支持本地版本控制工做 舊版本的SVN會在每個目錄置放一個.svn,git只會在根目錄擁有一個.git
- svn checkout —— git clone svn 只下載代碼, git 會連同代碼倉庫一塊兒下載下來 - svn commit —— git commit svn 是提交到服務器,git 中是提交到本地倉庫,須要使用push才能提交到服務器 - svn update - git pull 都是從服務器下載最新被修改的代碼
分佈式和集中式最大的區別在於:在分佈式下,本地有個代碼倉庫,開發者能夠在本地提交; 而集中式版本控制, 只有在服務器纔有一個代碼倉庫, 只能在服務器進行統一管理
概念理解
- 工做區 > 與.git文件夾同級的其餘文件夾或者子文件夾 - 版本控制庫 > 暫緩區 > 分支(Git不像SVN那樣有主幹和分支的概念. 僅僅存在分支,其中master分支爲默認被建立的分支,相似於SVN中的主幹) 切換分支:經過控制HEAD指針指向不一樣的分支,就能夠切換*
操做原則: 全部新添加/刪除/修改的文件 必須先添加到暫緩區,而後才能提交到HEAD指向的當前分支中
單人開發只須要一個本地庫
緣由:不須要與他人共享代碼,只負責管理本身代碼便可;例如提交代碼,刪除代碼,版本控制等等
多人開發時須要一個共享版本庫
共享版本庫的形式: 本地共享庫:文件夾/U盤/硬盤 遠程共享庫:本身搭建git服務器/ 託管到第三方平臺(例如github, oschina)
使用環境 不管是單人開發仍是多人開發,客戶端均可以使用命令行或者圖形界面使用git
> SourceTree - 下載地址:http://www.sourcetreeapp.com/download/ > GitHub - 下載地址:https://mac.github.com - 不過它是專門爲GitHub網站而設計的 > Xcode - 雖然集成較好,可是隻能作一些經常使用的簡單操做,複雜操做還要使用命令行
> git help [子命令] > 和學習SVN指令是同樣的,只不過git是經過使用指南的形式展現給用戶看(不能編輯的vim編輯器),使用q退出vim編輯器,按空格進入下一頁,ctrl + B 回到上一頁; /關鍵字 進行搜索
> 緣由: 管理本地代碼,修改上傳,版本回退 > 命令: git init
> 告訴git你是誰? 緣由: 追蹤修改記錄 命令: git config user.name 「shunzi」 > 告訴git怎樣聯繫你? 緣由: 多人合做開發時, 溝通交流 命令: git config user.email "shunzi@qq.com" > 查看配置信息(.git -> config打開) 命令: git config -l
> 建立文件並提交 命令: touch main.c git add . git commit -m 「註釋」 > 修改文件並提交 命令: git add . git commit -m 「註釋」 > 刪除文件並提交 命令: git rm person.h git commit -m 「註釋」 > 日誌查看 命令: git log git reflog > 版本回退 命令: git reset —hard HEAD 重置到當前版本 git reset —hard HEAD^^ 重置到上上個版本 git reset ——hard HEAD2 重置到往上2個版本 git reset —hard 七位版本號 重置到指定版本::
文件狀態(git status)
> 顏色含義 紅色: 表明被添加或者修改的文件沒有被添加到暫緩區 綠色: 表明文件在暫緩區,等待提交 > 版本號的含義 版本號是一個由SHA1生成的40位哈希值 這樣作的目的是保證版本號的惟一
vim編輯器的使用
命令模式:等待編輯命令輸入;全部輸入的內容都被當作命令來執行 插入模式:輸入的全部內容都被顯示,並被當作文件內容處理 命令行模式:執行待定命令(保存文件並退出vim : wq ; 強制退出不保存: q! )
日誌查看配置
命令以下: git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)\<%an\>%Creset' --abbrev-commit"
配置別名
git config alias.st 「status」 git config alias.ci 「commit -m」
--global的做用
能夠進行全局配置,全部的版本庫共享此配置 查看全局配置(桌面前往->我的->.gitconfig ** 我的電腦上建議使用全局配置**
團隊開發必須有一個共享庫,這樣成員之間才能夠進行協做開發
> 本地共享庫(只能在本地面對面操做) - 電腦文件夾/U盤/移動硬盤 > 遠程共享庫(可經過網絡遠程操做) - 本身搭建Git服務器(**不建議**) - 在Github上託管項目(** 建議**) Github網址(https://github.com); 公開項目免費, 私有項目收費 - 在OSChina上託管項目(** 推薦**) OSChina網址(https://git.oschina.net) 安全免費,在國內訪問速度快
緣由: 多人合做開發,代碼共享 命令: git init —-bare
命令: git clone 本地代碼倉庫地址
> 建立文件夾manager, niuda 命令: mkdir manager mkdir niuda > 分別進入到兩個文件夾從共享庫clone項目到本地 命令: git clone 本地代碼倉庫地址 git clone 本地代碼倉庫地址 > 演練新增文件同步 命令: touch person.h git add . git commit -m 「建立person.h」 git push git pull > 演練修改文件同步 命令: git add . git commit -m 「註釋」 git push git pull > 演練刪除文件同步 命令: git rm filename git commit -m 「註釋」 git push git pull > 演練衝突解決 命令: git pull > 演練忽略文件 命令: touch .gitignore open .gitignore 加入忽略文件名 git add . git commit -m 「註釋」 .gitignore文件配置規則 http://www.cnblogs.com/haiq/archive/2012/12/26/2833746.html
> 關於忽略文件 在真實開發中,配置.gitignore文件 , 去github裏面搜索gitignore 選擇OC版本的,拷貝到本地倉庫便可,記得添加到本地版本庫 > 常見問題 fetch first 表明當前文件過時,須要從遠程共享庫更新 git pull
命令: git init —-bare
** 注意: 添加忽略文件, 否則Xcode有可能會把不必的文件提交** ** 必須在使用Xcode以前把忽略文件添加進來, 由於Xcode建立工程時, 默認直接把全部文件添加到暫緩區, 加進去以後忽略文件對其就無效了**
當項目被移到本身代碼倉庫中,就能夠根據地址克隆下來進行操做
** 注意: 你能夠針對此框架進行任意修改,可是僅僅做用在你的本地倉庫中的副本,對原做者項目沒有任何影響. 若是想向原做者提建議,能夠直接使用,pull request操做. 提交完成後,原做者能夠在pull request中看到你的提交.至因而否採納,就是原做者的意願
或者直接只用SSH(如下是生成公鑰私鑰方法)
> 部署公鑰容許以只讀的方式訪問項目,主要用於項目在生產服務器的部署上,免去HTTP方式每次操做都要輸入密碼和普通SSH方式擔憂不當心修改項目代碼的麻煩。 > [https://help.github.com/articles/generating-ssh-keys/]
當項目被移到本身代碼倉庫中,就能夠根據地址克隆下來進行操做
** 注意: 你能夠針對此框架進行任意修改,可是僅僅做用在你的本地倉庫中的副本,對原做者項目沒有任何影響. 若是想向原做者提建議,能夠直接使用,pull request操做. 提交完成後,原做者能夠在pull request中看到你的提交.至因而否採納,就是原做者的意願
新人服務器搭建概念緣由?
概念: 搭建一個臨時共享版本庫, 供新人專用 緣由: 防止新人剛到時,搞亂服務器上的項目
新建一個文件夾,newBee,做爲新人服務器
而後source control ->項目master -> configure 項目
> 選擇Remotes 選項 表明當前所連的遠程服務器地址 > 點擊+號 添加 將newBee文件路徑做爲另一個遠程服務器地址 file:// 協議開頭 結尾以/結尾 > Done
經理將最新代碼提交到新人遠程倉庫
圖解
在git中不是經過拷貝代碼來解決備份和開啓分支的 git 直接打標籤, 經過控制head指向,來回到任一版本
創建共享庫
> 建立文件夾shareWeibo > 進入文件夾後,初始化共享庫 git init ——bare
經理克隆項目後開發完1.0版本,打標籤後,上傳共享庫
> 建立manager文件夾 > 進入文件夾後 git clone 共享庫絕對路徑 > 進入工做區,配置姓名,郵箱 git config user.name 「manager」 git config user.email 「manager@qq.com」 > 經理建立文件,並修改部分代碼,提交代碼,上傳到共享庫,完成v1.0版本 touch main.c open main.c:: 打開後寫入abc git add . git commit -m 「完成1.0版本開發」 git push > 經理給此版本打標籤,並將標籤上傳到共享庫 git tag -a v1.0 -m 「標記1.0版本」 git push origin v1.0 > 經理繼續開發2.0版本......並提交 git add . git commit -m 「2.0部分功能」 git push
在以上步驟基礎上作如下操做
牛大克隆項目,根據1.0版本建立分支,修復bug
> 建立niuda文件夾 > 進入文件夾後 git clone 共享庫絕對路徑 > 進入工做區,配置姓名,郵箱 git config user.name 「niuda」 git config user.email 「niuda@qq.com」 > 根據v1.0版本創建新分支v1.0fixbug並切換到此分支 git checkout v1.0 -b v1.0fixbug:: > 修復bug後提交到本地版本庫
注意此處提交到的是HEAD指向的分支-v1.0fixbug
git add . git commit -m 「修復bug」
牛大修復bug後,打標籤v1.1做版本備份,並上傳共享庫
git tag -a v1.1 -m 「1.1版本備份」 git push origin v1.1
牛大上傳整個分支到共享版本庫
git push origin v1.0fixbug
———至此,分支修復bug結束,下面經理要合併分支———
經理從共享庫更新代碼到本地庫
git pull
經理查看當前服務器都有哪些分支
git branch -r
經理切換到master分支後,將v1.0fixbug分支合併過來
git checkout master git merge origin/v1.0fixbug -m 「合併分支」
經理合並完成後提交到共享庫
git add . git commit -m 「合併分支」 git push
合併完成後,能夠刪除共享庫的分支
git branch -r -d origin/v1.0fixbug
查看版本標籤,至此結束!!
git tag