版本控制Git基礎及使用詳解


版本控制Git基礎及使用詳解

1、Git簡介

1.1、簡介

Git是一款免費、開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。 Git的讀音為/gɪt/。

Git是一個開源的分佈式版本控制系統,用以有效、高速的處理從很小到非常大的項目版本管理。Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。

Git 是用於 Linux內核開發的版本控制工具。與常用的版本控制工具 CVS, Subversion 等不同,它採用了分佈式版本庫的方式,不必服務器端軟件支持(wingeddevil注:這得分是用什麼樣的服務端,使用http協議或者git協議等不太一樣。並且在push和pull的時候和服務器端還是有交互的。),使源代碼的發佈和交流極其方便。 Git 的速度很快,這對於諸如 Linux kernel 這樣的大項目來說自然很重要。 Git 最為出色的是它的合併跟蹤(merge tracing)能力。

1.2、git的開發過程(圖釋)

版本控制Git基礎及使用詳解

2、Git的安裝、部署

2.1、Ubuntu搭建Git服務器

2.1.1、安裝git

<code>#sudo rpm –qa|grep –i git
#sudo apt-get install git ó#apt-get install git-core
#apt-get install openssh-server openssh-clinet\t//都是安裝好了的,可能版本有點低。
#sudo apt-get update \t\t\t\t\t\t//更新一下安裝
/<code>

git-core是git版本控制核心軟件。安裝openssh-server和openssh-client是由於git需要通過ssh協議來在服務器與客戶端之間傳輸文件。


2.1.2、安裝Python-setuptools、gitosis –用於權限管理

<code>#sudo apt-get install Python-setuptools
初始化服務器git用戶 可以用cat ~/.gitconfig查看
#git config –global user.name “liyulin”
/<code>
版本控制Git基礎及使用詳解

<code>#git config –global user.email “liyulinbill@q q.com”
/<code>

初始化服務器用戶信息後,就可以安裝gitosis了,gitosis主要是用於給用戶授權,設置權限也算是很方便的。

在root目錄下(也可以是其他目錄):

<code>:/root/#mkdir git_osis\t#cd git_osis
/<code>
版本控制Git基礎及使用詳解

<code>#git clone git://eagain.net/gitosis.git\t<=>#git clone https://github.com/res0nat0r/gitosis.git#cd gitosis \t
#sudo python setup.py install
/<code>


2.1.3、創建git管理員賬戶、配置git

#sudo adduser gitadmin

設置項目倉庫存儲點,給予gitadmin個人權限

#cd /home #mkdir gitrepository #chown gitadmin:gitadmin /home/gitrepository/

版本控制Git基礎及使用詳解

#chmod 700 /home/gitrepository/gitosis默認狀態下會將倉庫放在用戶的repositories目錄下,所以要在存儲點建立各個用戶的repository的軟連接。

#sudo ln –s /home/gitrepository /home/gitadmin/repositories

版本控制Git基礎及使用詳解

成為管理員:無論是不是本機都可以通過生成ssh公鑰的方法成為管理員

#ssh-keygen –t rsa

版本控制Git基礎及使用詳解

然後用剛生成公鑰id_rsa.pub來對gitosis進行初始化。

版本控制Git基礎及使用詳解

gitosis主要是通過gitosis-admin.git倉庫來管理一些配置文件的,如用戶權限的管理。這裡需要對其中的一個post-update文件添加可執行的權限。

# sudo chmod 755 /home/gitadmin/repositories/gitosis-admin.git/hooks/post-update


先建一個空倉

版本控制Git基礎及使用詳解


區分一下git init 和 git init –bare:

參考:http://tanglei528.blog.163.com/blog/static/433533992013023112825487/

一般個人使用,用git init,這時候你的工作區也在這裡。你要是想建立一個固定的地址讓大家一起用,就在服務器上用--bare。其實你可以看到,init建立的.git目錄內容和--bare建立的目錄內容是差不多的。

用"git init"初始化的版本庫用戶也可以在該目錄下執行所有git方面的操作。但別的用戶在將更新push上來的時候容易出現衝突。

比如有用戶在該目錄(就稱為遠端倉庫)下執行git操作,且有兩個分支(master 和 b1),當前在master分支下。另一個用戶想把自己在本地倉庫(就稱為本地倉庫)的master分支的更新提交到遠端倉庫的master分支,他就想當然的敲了

git push origin master:master

於是乎出現:

因為遠端倉庫的用戶正在master的分支上操作,而你又要把更新提交到這個master分支上,當然就出錯了。

但如果是往遠端倉庫中空閒的分支上提交還是可以的,比如:

git push origin master:b1 還是可以成功的。

解決辦法就是使用”git init –bare”方法創建一個所謂的裸倉庫,之所以叫裸倉庫是因為這個倉庫只保存git歷史提交的版本信息,而不允許用戶在上面進行各種git操作,如果你硬要操作的話,只會得到下面的錯誤(”This operation must be run in a work tree”)。這個就是最好把遠端倉庫初始化成bare倉庫的原因。

2.3、管理相關權限

在之前/home/gitadmin/目錄下:克隆了gitosis-admin.git倉庫。這個是在客戶端機器上clone下來,然後使用gitosis權限管理。

在gitosis-admin.git倉庫裡面有gitosis.conf的配置文件和一個keydir的目錄。gitosis.conf用於配置用戶的權限信息,

keydir主要用戶存放ssh公鑰文件(一般以“用戶名.pub”命名,gitosis.conf配置文件中需使用相同用戶名),用於認證請求的客戶端機器。

現在讓需要授權的用戶使用前面的方式各自在其自己的機器上生成相應的ssh公鑰文件,管理員把他們分別按用戶名命名好,複製到keydir目錄下。

然後vim gitosis-config文件:

版本控制Git基礎及使用詳解


2.4、Git客戶端安裝配置

從網上下載,點擊安裝

選擇安裝組件

也可以默認選擇;

– 圖標組件(Addition icons) : 選擇是否創建快速啟動欄圖標 或者 是否創建桌面快捷方式;

– 桌面瀏覽(Windows Explorer integration) : 瀏覽源碼的方法, 單獨的上下文瀏覽 只使用bash 或者 只用Git GUI工具; 高級的上下文瀏覽方法 使用git-cheetah plugin插件;

– 關聯配置文件 : 是否關聯git配置文件, 該配置文件主要顯示文本編輯器的樣式;

– 關聯shell腳本文件 : 是否關聯Bash命令行執行的腳本文件;

– 使用TrueType編碼 : 在命令行中是否使用TruthType編碼, 該編碼是微軟和蘋果公司制定的通用編碼;

版本控制Git基礎及使用詳解

設置環境變量

選擇使用什麼樣的命令行工具, 一般情況下我們默認使用Git Bash即可, 默認選擇;

– Git自帶 : 使用Git自帶的Git Bash命令行工具;

– 系統自帶CMD : 使用Windows系統的命令行工具;

– 二者都有 : 上面二者同時配置, 但是注意, 這樣會將windows中的find.exe 和 sort.exe工具覆蓋, 如果不懂這些儘量不要選擇;

版本控制Git基礎及使用詳解

選擇換行格式

– 檢查出windows格式轉換為unix格式 : 將windows格式的換行轉為unix格式的換行在進行提交;

– 檢查出原來格式轉為unix格式 : 不管什麼格式的, 一律轉為unix格式的換行在進行提交;

– 不進行格式轉換 : 不進行轉換, 檢查出什麼, 就提交什麼;


其實就是下載後一直點擊next按鈕就安裝得差不多了。然後我們就可以使用git的自帶命令行工具了。

然後通過bash生成私鑰和公鑰,將公鑰.pub文件上傳給服務器(或者網站),通過rsa認證。之後就可以通過openssh命令行,在bash上進行操作了。具體的命令行操作見三、1、服務器。

2.5、TortoiseGit安裝配置

和Git客戶端安裝差不多,下載一個安裝包,然後一直點next就ok了。

版本控制Git基礎及使用詳解

其實我們從網上下載安裝的TortoiseGit,默認的都是Putty了。但是選擇第一個後續會有很多事,而選擇第二個,則後續配置簡單些。

版本控制Git基礎及使用詳解

設置putty私鑰(選擇的是putty時候)

TortoiseGit 使用擴展名為ppk的密鑰,而不是ssh-keygen生成的rsa密鑰。使用命令ssh-keygen -C "郵箱地址" -t rsa產生的密鑰在TortoiseGit中不能用。而基於git的開發必須要用到rsa密鑰,因此需要用到TortoiseGit的putty key generator工具來生成既適用於git的rsa密鑰也適用於TortoiseGit的ppk密鑰,具體配置步驟如下:

在TortoiseGit的安裝目錄下C:\\Program Files\\TortoiseGit\\bin找到puttygen.exe,就是轉換工具,雙擊如下: 然後點擊Generate

版本控制Git基礎及使用詳解

鼠標在上圖的空白地方來回移動直到進度條完畢,就會自動生一個隨機的key

版本控制Git基礎及使用詳解

如有需要,可以為密鑰設置對應的訪問密碼,就是修改上圖中“Key passphrase”和“Confirm passphrase”的值。

3)將上圖中多行文本框的內容全選、複製,並粘貼到git賬戶的 SSH public key中,這就是適用於git的公鑰。

4)點擊上圖中的“Save private key”按鈕,將生成的key保存為適用於TortoiseGit的私鑰(擴展名為.ppk)。

5)運行TortoiseGit開始菜單中的Pageant程序,程序啟動後將自動停靠在任務欄中,圖標顯示為

版本控制Git基礎及使用詳解

,雙擊該圖標,彈出key管理列表

6)“Add Key”按鈕,將第4步保存的ppk私鑰添加進來,關閉對話框即可


3、Git的使用方法

3.1、服務器(命令行)

3.1.1、版本庫的創建

<code>$mkdir git_src
$cd git_src
$git init/<code>

3.1.2、增加內容

<code>$Gitadd/usr/git/….
$Gitaddliyulin/<code>

添加所有未跟蹤文件用 git add -A, 添加所有未跟蹤文件並且提交用 git commit -a。(注意大小寫)


3.1.3、提交內容

<code>$Git commit
$git status
$git diff
$git commit –a –m “newfile”=>$git add file +$git commit –m “newfile”
/<code>


3.1.4、管理分支

<code>$git branch
/<code>

請注意:master 是默認的分支,這也是為什麼 .git/HEAD 創建的時候就指向 master 的原因,儘管目前它其實並不存在。 git 將假設你會在 master 上開始並展開你以後的工作,除非你自己創建你自己的分支。


3.1.5、創建分支

<code>$git branch liyulin\t$git checkout liyulin
/<code>


更簡單和常用的方法是直接通過 checkout 命令來一次性創建並轉移到新建分支上,命令如下:

$ git checkout -b robin [start_point]

其中 start_point 是一個可選參數,指定新建分支 robin 是基於哪個節點,默認為當前所在分支的節點


3.1.6、刪除分支

<code>$git branch –d branch-name
/<code>

注意如果刪除的分支還沒有被 merge 到其他分支,刪除這樣的分支會導致這個分支上所做的改動丟失,因此 git branch -d 命令會失敗,提示你這樣做會丟失信息。如果你的確想刪除這樣的分支,不怕信息丟失,那麼可以使用 git branch -D 命令,這個命令不會去判斷分支的merge狀態。


3.1.7、查看項目的發展變化和比較差異

<code>$git show-branch\t$git diff\t$git whatchanged
/<code>

Ex.$git diff master liyulin 查看master和liyulin版本的差異情況。


3.1.8、合併分支

<code>$git merge
將liyulin分支上的工作merge到master上
$git checkout master\t$git merge“Message :merge from liyulin”liyulin
<=>$git checkout master\t\t$git pull liyulin
注意:git pull 的本意是用來 merge 遠端版本庫中的某個分支。
合併時若有衝突,會出現衝突提示,這時需要人手動協商、解決衝突。
/<code>


3.1.9、逆轉(Undo)恢復(Redo)

<code>$git reset [--mixed | --soft | --hard] [<commit-ish>]
/<commit-ish>/<code>

--mixed

僅是重置索引的位置,而不改變你的工作樹中的任何東西(即,文件中的所有變化都會被保留,也不標記他們為待提交狀態),並且提示什麼內容還沒有被更新了。這個是默認的選項。

--soft

既不觸動索引的位置,也不改變工作樹中的任何內容,我們只是要求這些內容成為一份好的內容(之後才成為真正的提交內容)。這個選項使你可以將已經提交的東西重新逆轉至“已更新但未提交(Updated but not Check in)”的狀態。就像已經執行過 git update-index 命令,但是還沒有執行 git commit 命令一樣。

--hard

將工作樹中的內容和頭索引都切換至指定的版本位置中,也就是說自 <commit-ish> 之後的所有的跟蹤內容和工作樹中的內容都會全部丟失。因此,這個選項要慎用,除非你已經非常確定你的確不想再看到那些東西了。/<commit-ish>

提取數據

$git checkout –f liyulin.doc

這是個很有用的小技巧,如果你對你現在的工作目錄下的東西已經不耐煩了,隨時可以取出你提交過的東西覆蓋掉當前的文件。

類型標籤—輕標籤、署名標籤


3.1.10、合併工作

<code>$git fetch <remote-repository>
/<remote-repository>/<code>

事實上,遠程合併的無非就是“抓取(fetch)一個遠程的版本庫中的工作到一個臨時的標籤中”,然後再使用 git-merge 命令。根據不同的遠程版本庫所使用的通訊協議的路徑來替代上面的 remoted-repository 就可以了。

<code>Rsyncrsync://remote.machine/patch/to/repo.git/
SSHremote.machine:/path/to/repo.git<=>ssh://remote.machine/patch/to/repo.git/
Git Native git://remote.machine/path/to/repo.git/
Ex. $ git-fetch [email protected]:/path/to/gittutorcn.git (1)其中liyulin為登錄的用戶名,192.168.1.112為服務器的IP地址
/<code>


3.1.11、協同工作

<code>$git clone /home/liyulin/project myrepo
/<code>

這樣就創建了一個保存著 liyulin 的版本庫的鏡像的新目錄 "myrepo"。這個鏡像保存著原始項目的起點和它的發展歷程。

<code>$cd /home/liyulin/myrepo
$git pull /home/liyuande/LYDrepo
/<code>

這樣就將liyuande版本庫中的 "master" 分支的變化引入了。 liyulin 也可以通過在 pull 命令的後面加入參數的方式來引入其他的分支


Liyulin可以先將liyuande的工作導入到新的臨時分支中:

$git fetch /home/liyuande/LYDrepo master:lyd-incoming

這個命令將 liyuande 的 master 分支的導入到名為 lyd-incoming 的分支中(不同於 git-pull 命令,git-fetch 命令只是取得 liyuande 的開發工作的拷貝,而不是合併進來)

若要完全導入則git pull:

<code>$ git-checkout master\t$git pull . lyd-incoming
/<code>

3.1.12、發佈工作

如何準備一個自己的版本庫來供其他人下載呢?你在自己的工作目錄下進行工作,這樣你的版本庫就被作為.git的一個子目錄放在你的工作樹下。你可以讓其他人來遠程的訪問你的版本庫,但是實際上這不是通常的做法。推薦的做法是創建一個公共的版本庫,讓它可供其他人訪問,並且,當你在你的工作目錄下做了很好的改動時,你可以更新到公共的版本庫中。這通常稱為pushing。

首先,你需要在遠程機器上創建一個空的版本庫來存放你的公共版本庫。這個空版本庫以後將通過pushing來保持更新。顯然,這個版本庫之需要在開始的時候創建一次。

git push使用一對命令,git-send-pack在本地機上運行,git-receive-pack在遠程機上運行。這兩個命令通過SSH連接來進行通訊。

你本地的版本庫的git目錄通常是.git,但是你的公共版本庫通常還要加上你的項目名,即.git。讓我們來為my-git創建這樣一個版本庫。首先,登入遠程的機器,創建一個空目錄(如果你選擇HTTP作為發佈方法,這個空目錄需要建在web server的根目錄下面):

<code>$ mkdir my-git.git
/<code>

然後運行git init-db命令將這個目錄加入git版本庫中,這裡,因為這個版本庫的名字不是通常的.git,我們需要稍微改動一下命令:

<code>$ GIT_DIR=my-git.git git-init-db
/<code>

有很多種傳輸方式可以發佈公共版本庫。這裡,要確認這個目錄可以通過你選擇的傳輸方式來被其他人訪問。你也需要確認你有git-receive-pack這個程序在$PATH這個路徑下。

當你直接運行程序的時候,很多sshd的安裝版並沒有將你的shell作為登陸的shell;這就是說,如果你登陸的shell是bash 的話,被讀到的是.bashrc而不是.bash_profile。確認.bashrc設置好了$PATH路徑,這樣你才可以運行git-receive-pack命令。

如果你打算通過HTTP來發布這個版本庫,這是你就應該運行命令chmod +x my-git.git/hooks/post-update。這確認了每次你導入數據到這個版本庫中,git-update-server-info能夠被執行。

然後,你的“公共的版本庫”可以接受你的任何改動了。回到你的本地機上,運行命令:

<code>$ git push :/path/to/my-git.git master
/<code>

該命令將你的公共版本庫和你當前的版本庫中指定名稱的分支頭部同步(這裡是master)。


3.2、*TortoiseGit客戶端使用

創建倉庫

新建一個文件夾,然後右擊,選擇以此文件夾創建倉庫。

彈出下面提示:

版本控制Git基礎及使用詳解

這個“製作純版本庫”的意思就和 git init –bare 是一樣的。就是建立一個裸倉庫。一般是多個開發者公用的倉庫。

說是裸倉庫,其實它裡面是有一些配置文件的。不清楚自己想要什麼的話,就別刪除或者修改裡面的文件。

版本控制Git基礎及使用詳解

身份確認

TortoiseGit => Setting =>打開對話框,選擇左側Git選項,右側有用戶名和郵箱。


版本控制Git基礎及使用詳解


Clone遠程倉庫

記得url不能寫錯了:[email protected]:/home/gitadmin/repositories/~

提交自己機器的公鑰文件:用戶名.pub,自己或者讓管理員修改gitosis.config文件,添加權限。

版本控制Git基礎及使用詳解


參考文獻

2.Ubuntu搭建Git服務器:http://blog.csdn.net/tommy_wxie/article/details/38779667

http://www.open-open.com/lib/view/open1391477731082.html

2.Git 客戶端安裝與配置: http://www.jb51.net/article/55438.htm

2.TortoiseGit安裝配置: http://blog.csdn.net/xiaobin_hlj80/article/details/10953701

密鑰解決方案:

http://www.showerlee.com/archives/1300

http://blog.163.com/wangyg_hf/blog/static/181640374201210753740961/

http://git-scm.com/book/zh/ch4-4.html


分享到:


相關文章: