vs中使用git
一、概念
Git是一個強調速度的分布式版本控制軟件和源代碼管理系統(SCM,source code management)。Git最初是由Linus Torvalds為內核開發而設計的管理軟件。自從Git推出以來,已經被很多開源項目所采納。每一個Git工作目錄是一個帶有完全歷史記錄和版本信息的倉庫,不依賴於網絡和中央服務器。
Github
GitHub是一個平台,一個網站,提供給用戶創建git倉儲空間,保存(托管)用戶的一些數據文檔或者代碼等。概括來說,Github只是一個提供存儲空間的服務器,用來存儲git倉庫。類似的網站還有很多,比如碼雲等等
二、為什么要用Git
- 更順暢的工作流程,開發過程中,完全可以離線操作
- 快速,Git分布式架構使得本地倉庫包含所有的歷史版本信息,你可以在不同的版本之間快速切換
- 彈性的本地分支,在svn下,你建一個分支需要把源代碼復制到另外一個文件夾,而在Git下,創建分支的代價是非常小的,只需一條命令
- 倉庫目錄結構簡潔,用Git復制一個項目,只會在項目根目錄創建一個.git的目錄,而其他目錄很干凈
- 內容按元數據方式存儲,所有的版本信息都位於.git目錄下
- 完整性好,更易於協作開發
- 用戶群大,現在已經有成千上萬個開源項目采用Git來做項目管理,github上更是有無數個代碼倉庫
三、git與svn的區別
git是分布式版本控制系統,擁有兩個倉庫,一個是本地倉庫,一個是遠程倉庫。代碼提交是提交到本地的(如此速度就快),當然生成補丁(patch)然后推送(push)到遠程服務器上是需要聯網的;SVN是集中式版本控制系統,只有一個遠程倉儲,代碼提交都是提交到遠程服務器上,是需要一直聯網的(如此速度就慢)
SVN這樣的集中式版本控制系統,它的完整代碼倉庫(代碼倉庫不僅僅只包含了代碼,還包含各個歷史版本的信息等)在中心服務器上,一旦這個中心服務器掛了,也就是完整的代碼倉庫掛了,雖然你本地可能之前有從中心服務器上取得過代碼,但是那些歷史版本信息都沒有了,而且你也無法再提交代碼。
git不同,git沒有中心服務器的概念,每一個git客戶端(git節點)都含有一個完整的代碼倉庫(前提是你之前從遠程git倉庫fetch過代碼),所以那些歷史版本信息都在你本機上,假如哪一個git節點掛掉了,隨意從其他git節點clone一個代碼倉庫過來就ok了, 那些原來的代碼、版本信息之類的都還是完整的(當然如果你在這個掛掉的git節點上新增的代碼是沒有掉了的)。
綜上,git的每一個節點(第一次從遠程git倉庫取得代碼后,該git節點就是一個完整的代碼倉庫)相當於SVN的中心服務器,都包含完整的代碼倉庫
四、vs中使用git
在vs中已經幫我們安裝了git,我們只需要在“項目”--“團隊資源管理器”中打開即可使用
git的一些常用術語:
克隆(clone):從遠程服務器上克隆完整的git倉庫(包括代碼和版本信息)到自己的機器上
提交:將自己修改的代碼提交到本地的倉庫
拉取(同步):從遠程倉庫拉取新的代碼到本地倉庫(拉取的時候必須先進行提交)
推送(push):將修改的代碼推送到遠程倉庫
沖突:沖突產生是因為git無法將修改的內容進行自動合並時就會產生沖突,這時就需要我們手動進行合並沖突
流程:
首先在服務器上(github,碼雲)上新建項目,在vs中進行克隆之后,會在本地指定的文件夾中生成.git的隱藏文件,Git用來進行版本控制和內容跟蹤的所有文件都在該文件夾下。我們只需要將代碼放到包含.git的文件夾下提交並推送即可,這樣就推送到了遠程倉庫。修改代碼之后也是進行提交推送即可。如果遠程倉庫有新的更新,我們只需要拉取。
注意
在git中文件有三種狀態:已修改,已暫存,已提交
已提交表示該文件已經被安全地保存在本地數據庫中了;已修改表示修改了某個文件,但還沒有提交保存;已暫存表示把已修改的文件放在下次提交時要保存的清單中。
理解分支
分支(branch)有什么用呢?假設你准備開發一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由於代碼還沒寫完,不完整的代碼庫會導致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險。
現在有了分支,就不用怕了。你創建了一個屬於你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發完畢后,再一次性合並到原來的分支上,這樣,既安全,又不影響別人工作
分支內部原理
1、如下圖所示,版本的每一次提交(commit),git都將它們根據提交的時間點串聯成一條線。剛開始是只有一條時間線,即master分支,HEAD指向的是當前分支的當前版本。
2、當創建了新分支,比如dev分支,git新建一個指針dev,dev=master,dev指向master指向的版本,然后切換到dev分支 ,把HEAD指針指向dev,如下圖。
3.在dev分支上編碼開發時,都是在dev上進行指針移動,比如在dev分支上commit一次,dev指針往前移動一步,但是master指針沒有變,如下:
4、當我們完成了dev分支上的工作,要進行分支合並,把dev分支的內容合並到master分支上。其內部的原理,其實就是先把HEAD指針指向master,再把master指針指向現在的dev指針指向的內容。如下圖。
5、當合並分支的時候出現沖突(confict),比如在dev分支上commit了一個文件file1,同時在master分支上也提交了該文件file1,修改的地方不同(比如都修改了同一個語句),那么合並的時候就有可能出現沖突,如下圖所示
。
這時候執行,git會默認執行合並,但是要手動解決下沖突並提交,現在git分支的結構如下圖
參考文檔:
http://blog.csdn.net/chenj_freedom/article/details/50543152
http://blog.csdn.net/wengpingbo/article/details/8985132
http://www.nowamagic.net/academy/detail/48160210