一、概述
我們?cè)陂_發(fā)軟件的時(shí)候,常常會(huì)因?yàn)樾枨蟆⒐δ艿奶砑踊虺霈F(xiàn)bug而去修改代碼,隨著修改次數(shù)的增加,開發(fā)人員經(jīng)常會(huì)忘記之前的代碼,所以這個(gè)時(shí)候?qū)Υa進(jìn)行管理是非常必要的;對(duì)代碼管理最有效的辦法就是對(duì)每次修改代碼通過版本來標(biāo)識(shí)。 當(dāng)前出現(xiàn)幾種版本控制工具,其中最常用的有CVS,SVN,git, CVS是有著三十年以上的時(shí)間的考驗(yàn)。CVS是開放源代碼軟件世界的一個(gè)偉大杰作,有人認(rèn)為如今開源成功發(fā)展的幕后功臣之一當(dāng)CVS莫屬。Linux 的創(chuàng)始人 Linus 就把 Linux 的成功,歸因于 CVS。由于CVS功能強(qiáng)大,跨平臺(tái),支持并發(fā)版本控制,而且免費(fèi),所以它在全球中小型軟件企業(yè)中得到了廣泛使用。CVS最大的遺憾就是缺少相應(yīng)的技術(shù)支持,許多問題的解決需要自已尋找資料,甚至是研究源代碼。CVS是一個(gè)典型的服務(wù)器/客戶端軟件,有UNIX版本的CVS 、Linux版本的CVS和WINDOWS版本的CVS。CVS支持遠(yuǎn)程管理,項(xiàng)目組分布開發(fā)時(shí)一般都采用CVS。
SVN:CVS縱然易用,但也有一些與生俱來的缺點(diǎn),比如CVS不支持文件改名,只對(duì)文件控制版本而沒有針對(duì)目錄的管理,等等。之后CVS 的創(chuàng)始人之一在其現(xiàn)任公司的資助下開發(fā)了SubVersion,用以替代CVS。SubVersion 的設(shè)計(jì)目的就是針對(duì)CVS 的一些弱點(diǎn)進(jìn)行改進(jìn)。
Git和 CVS、SVN不同,是一個(gè)分布式的源代碼管理工具。Linux內(nèi)核的代碼就是用Git管理的。它很強(qiáng),也很快,筆者開始從事linux開發(fā),就選用git來管理自己的代碼。
二、安裝git
** **筆者使用的是centos linux;安裝git可通過yum install git命令;ubuntu下開發(fā)的用戶可使用apt-get install git;
或者在https://www.kernel.org/pub/software/scm/git/該網(wǎng)址下選擇最新版本的git,比如git-2.0.0.tar.xz,通過
wget https://www.kernel.org/pub/software/scm/git/git-2.0.0.tar.xz 下載git源碼;
解壓git-2.0.0.tar.xz文件
tar -xvf git-2.0.0.tar.xz
cd git-2.0.0
./configure
make
make install
**三、開始使用git
**
** **安裝完git后,就可以開始使用它了;要想使用git,必須創(chuàng)建一個(gè)git目錄,常見的初始化git目錄有兩種,分別為git init, git --bare init;
git init初始化會(huì)生成一個(gè)工作目錄,該工作目錄負(fù)責(zé)管理項(xiàng)目的資源和項(xiàng)目的版本控制,目錄下有一個(gè).git目錄就是負(fù)責(zé)項(xiàng)目的版本管理,
git --bare init初始化后直接在目錄下生成一些與.git文件夾下同樣的文件,該目錄只負(fù)責(zé)項(xiàng)目的版本控制,而項(xiàng)目的資源可存放在別的機(jī)子上;
1、使用git init命令
首先創(chuàng)建一個(gè)文件夾,在文件夾下git init初始化git庫
mkdir /home/gitpro/test
cd /home/gitpro/test
git init
初始化后會(huì)在該文件夾下面生成.git文件夾,該文件夾就是負(fù)責(zé)git版本管理的;然后在/home/pro目錄下克隆該git目錄,輸入命令如下:
git clone /home/gitpro/test
會(huì)在/home/pro目錄下創(chuàng)建一個(gè)test目錄,并在/home/pro/test中添加一個(gè)test文件,隨便填寫幾個(gè)內(nèi)容:
git test repo
保存內(nèi)容后
git add test
git commit -m 'add a test file'
git push
當(dāng)git push的時(shí)候會(huì)出現(xiàn)錯(cuò)誤:
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
說的是需要我們指定一個(gè)分支,出現(xiàn)該問題的原因是因?yàn)槲覀冊(cè)趧傞_始git init初始化目錄的時(shí)候,該目錄中不會(huì)自動(dòng)創(chuàng)建分支,可查看.git目錄下的HEAD文件,HEAD是指向當(dāng)前的分支,
cat HEAD
發(fā)現(xiàn)內(nèi)容是ref: refs/heads/master,當(dāng)是進(jìn)入.git目錄下的refs/heads下沒有看見master文件,說明確實(shí)是沒有創(chuàng)建分支的原因,解決方法為:
可以在git init的目錄中隨便添加一個(gè)文件,建議添加.gitignore文件,內(nèi)容如下:
*.bak
該文件名是git的過濾規(guī)則文件,git在遇到bak格式的文件會(huì)放棄掉該文件,即便是用戶git add過來;
git add .gitignore
git commit -m 'create master'
之后我們?cè)趓efs/heads下可以發(fā)現(xiàn)master,說明已經(jīng)成功創(chuàng)建分支;注意:因?yàn)橐呀?jīng)在git init的目錄commit下,所以就不需要輸入git push命令,
接下來在/home/pro/test,輸入
git push
又發(fā)現(xiàn)了一個(gè)問題發(fā)現(xiàn)又出現(xiàn)新的問題:
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
會(huì)出現(xiàn)該問題的原因是因?yàn)?,git初始化后,默認(rèn)情況下是不允許遠(yuǎn)程git push操作的,可以修改.git/config,在該文件中添加如下內(nèi)容:
[receive]
denyCurrentBranch = ignore
保存后,在/home/pro/test下git push就可以成功了
其實(shí)在初始化時(shí),沒有創(chuàng)建分支的情況下,還可以在/home/pro/test下輸入
git push origin master
該命令會(huì)git自動(dòng)創(chuàng)建一個(gè)分支,而不需要在/home/gitpro/test下創(chuàng)建一個(gè)文件后commit這么麻煩
2、git --bare init
創(chuàng)建一個(gè)裸版本庫:
mkdir /home/gitpro/bare
cd /home/gitpro/bare
git --bare init
在目錄下生成與git init初始化時(shí)生成.git文件夾下一模一樣的內(nèi)容,接著克隆該裸版本庫:
cd /home/pro
git clone /home/gitpro/bare
在該目錄下隨便創(chuàng)建一個(gè)文件,之后add ,commit到版本庫中,注意這時(shí)git push會(huì)出現(xiàn)沒有分支的錯(cuò)誤,可使用
git push origin master