vs中使用git


vs中使用git

一、概念

Git是一個強調速度的分布式版本控制軟件和源代碼管理系統(SCMsource code management)。Git最初是由Linus Torvalds為內核開發而設計的管理軟件。自從Git推出以來,已經被很多開源項目所采納。每一個Git工作目錄是一個帶有完全歷史記錄和版本信息的倉庫,不依賴於網絡和中央服務器。

Github

GitHub是一個平台,一個網站,提供給用戶創建git倉儲空間,保存(托管)用戶的一些數據文檔或者代碼等。概括來說,Github只是一個提供存儲空間的服務器,用來存儲git倉庫類似的網站還有很多,比如碼雲等等

 

二、為什么要用Git

  • 更順暢的工作流程,開發過程中,完全可以離線操作
  • 快速,Git分布式架構使得本地倉庫包含所有的歷史版本信息,你可以在不同的版本之間快速切換
  • 彈性的本地分支,在svn下,你建一個分支需要把源代碼復制到另外一個文件夾,而在Git下,創建分支的代價是非常小的,只需一條命令
  • 倉庫目錄結構簡潔,用Git復制一個項目,只會在項目根目錄創建一個.git的目錄,而其他目錄很干凈
  • 內容按元數據方式存儲,所有的版本信息都位於.git目錄下
  • 完整性好,更易於協作開發
  • 用戶群大,現在已經有成千上萬個開源項目采用Git來做項目管理,github上更是有無數個代碼倉庫

三、gitsvn的區別

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新建一個指針devdev=masterdev指向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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM