1. 程式人生 > >Git分散式版本管理系統

Git分散式版本管理系統

Git分散式版本管理系統

CVSSVN集中式版本管理系統

原文:

總結整理如下:

*集中式vs分散式

集中式版本控制系統的版本庫是集中存放在中央伺服器的,要先從中央伺服器取得最新的版本,再用自己的電腦幹活,幹完活再推送給中央伺服器。最大缺點就是必須聯網才能工作,若在網際網路上,網速慢時可能提交一個10M的檔案就需要5分鐘。

分散式版本控制系統無“中央伺服器”,每個人的電腦上都是一個完整的版本庫,只需把各自的修改推送給對方,就可以互相看到對方的修改了。和集中式版本控制系統相比,分散式版本控制系統的安全性要高很多,某一個人的電腦壞掉可從其他人那複製。而集中式版本控制系統的中央伺服器要是出了問題,所有人都沒法幹活了。分散式版本控制系統通常也有一臺充當“中央伺服器”的電腦,但這個伺服器的作用僅僅是用來方便“交換”大家的修改,沒有它大家也一樣幹活,只是交換修改不方便而已。

*安裝Git

安裝後開始選單找到Git->Git Bash”,彈出類似命令列視窗就說明Git安裝成功

$ git config --global user.name "Your Name"

$ git config --global user.email "[email protected]"

*建立版本庫repository

版本庫即倉庫,可理解為一個目錄,目錄中的所有檔案都可以被Git管理起來,每個檔案的刪除、修改、刪除,git都能跟蹤,一遍任何時候都可以追蹤歷史或將來某個時刻可以還原。

1. 先建立一個目錄

$ mkdir learngit =>$ cd learngit =>  

$ pwd  //用於顯示當前目錄/Users/michael/learngit

Windows系統避免遇到各種莫名其妙的問題,確保目錄名(包括父目錄)不包含中文。

2. 通過git init 命令把這個目錄變成Git可以管理的倉庫

$ git init // Initialized empty Git repository in /Users/michael/learngit/.git/

ls -ah命令可以看到隱藏的.git目錄,用來跟蹤管理版本庫

3. 把檔案新增到版本庫

版本控制系統只能跟蹤文字檔案的改動,如TXT檔案,網頁,所有的程式程式碼等,告訴每次的改動,而圖片、視訊這些二進位制檔案,雖能由版本控制系統管理,但無法跟蹤檔案的變化,只能把二進位制檔案每次改動串起來,只知道圖片從

100KB改成了120KB,不知道具體改了什麼。MicrosoftWord是二進位制的,版本控制系統無法跟蹤其改動,若要真正使用版本控制系統,就要以純文字方式編寫檔案。文字是有編碼的,若無歷史遺留問題,建議使用UTF-8編碼,所有語言使用同一種編碼,既沒有衝突,又被所有平臺所支援。不要用windows自帶的記事本,用Notepad++,把預設編碼設定為UTF-8 without BOM

建立檔案readme.txt到庫目錄 => $ git add readme.txt =>git commit -m “wrote a readme file” 

*時光穿梭機

git status命令可以讓我們時刻掌握倉庫當前的狀態;

git diffdifference,顯示格式是Unix通用的diff格式,後面可跟檔案,顯示具體修改內容;

git add 修改後還需要add

git log 命令可以由近到遠提供之前commit的資訊(歷史記錄),後面可加--pretty=oneline引數可使輸出資訊每條簡潔為一行。

1. 版本回退

git reset : 回退到上一個版本,eg: git reset --hard HEAD^

git reset --hard 3628164(commit id): 指定回到未來某個版本,僅需寫版本號前幾位即可;

cat 檔案: 可以檢視檔案內容;

git reflog:用來記錄每一次命令

Git的版本回退速度非常快,因為Git在內部有個指向當前版本的HEAD指標

2. 工作區和暫存區(其他版本控制系統無暫存區的概念)

工作區Working Directory:即電腦中的一個目錄

版本庫Repository:工作區中的隱藏目錄.git,版本庫包括暫存區(stage/index),還有Git自動

建立的第一個分支master,以及指向master的一個指標HEAD

3. 管理修改:git跟蹤管理的是修改而非檔案

git diff HEAD -- readme.txt命令可以檢視工作區和版本庫中最新版本的區別

4. 撤銷修改

git checkout -- 檔案:可以丟棄工作區的修改,--很重要,沒有--為切換到另一個分支的命令。

git reset HEAD 檔案:把暫存區的修改撤銷掉(unstage),重新放回工作區

撤銷提交用版本回退

5. 刪除檔案

若從版本庫中刪除該檔案,用命令git rm刪掉,並且git commit

若刪錯了,版本庫裡還在,把誤刪的檔案恢復到最新版本用git checkout

*遠端倉庫

1. 建立SSH Key

ssh-keygen -t rsa -C "[email protected]",回車則會在使用者主目錄下自動建立.ssh目錄,裡面有id_rsa(私鑰,不可洩露)id_rsa.pub(公鑰,可放心告訴別人)兩個檔案。

2. 登陸GitHub=>settings =>SSHandGPGkeys=>newSSHKey(Key中貼上id_rsa.pub檔案內容)

SSH Key用於GitHub通過公鑰識別出你推送的提交確實是你推送的,而非冒充。允許你新增多個Key。假定你有若干電腦,只要把每臺電腦的Key都新增到GitHub,就可以在每臺電腦上往GitHub推送了。

新增遠端庫:本地建立了一個Git倉庫後,在GitHub建立一個Git倉庫,讓這兩個倉庫進行遠端同步,這樣,GitHub上的倉庫既可作為備份,又可讓其他人通過該倉庫來協作,一舉多得。首先在GitHub上建立一個新倉庫,可從這個倉庫克隆出新倉庫,也可把一個本地倉庫與之關聯,然後把本地倉庫的內容推送到GitHub倉庫。

關聯:git remote add origin [email protected]:Jane-ZhangJing/learngit.git

推送:git push -u origin master

把當前分支master推送到遠端,第一次推送master分支時,加上了-u引數,Git不但會把本地的master分支內容推送的遠端新的master分支,還會把本地的master分支和遠端的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。

本地提交了,可用命令git push origin master把本地master分支最新修改推送至GitHub

SSH警告:第一次使用Gitclone或者push命令連線GitHub時,會得到一個警告

從遠端庫克隆:遠端庫=>git clone [email protected]:Jane-ZhangJing/gitskills.git克隆本地庫

*分支管理

分支的作用:既可以儲存自己的程式碼由不影響別人工作。HEAD嚴格來說不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是當前分支。     

1. 建立與合併分支:

git checkout -b dev等同於git branch dev+git checkout dev建立並切換新分支dev

git branch:檢視當前分支。

git merge dev:合併指定分支到當前分支,dev中做更改提交後,回到主分支進行分支合併。

git branch -d dev:合併完成後就可以放心地刪除dev分支了

2. 解決衝突