Git 是一個很強大的分布式版本管理工具,它不但適用于管理大型開源軟件的源代碼(如:linux kernel),管理私人的文檔和源代碼也有很多優(yōu)勢(如:wsi-lgame-pro)
Git 的更多介紹,請參考我的上一篇博客:Git 版本管理工具
一、 Git 命令初識
在正式介紹Git命令之前,先介紹一下Git 的基本命令和操作,對Git命令有一個總體的認識
示例:從Git 版本庫的初始化,通常有兩種方式:
1)git clone:這是一種較為簡單的初始化方式,當(dāng)你已經(jīng)有一個遠程的Git版本庫,只需要在本地克隆一份
例如:git clone git://github.com/someone/some_project.git some_project
上面的命令就是將'git://github.com/someone/some_project.git'這個URL地址的遠程版本庫,完全克隆到本地some_project目錄下
2)git init 和 git remote:這種方式稍微復(fù)雜一些,當(dāng)你本地創(chuàng)建了一個工作目錄,你可以進入這個目錄,使用'git init'命令進行初始化;Git以后就會對該目錄下的文件進行版本控制,這時候如果你需要將它放到遠程服務(wù)器上,可以在遠程服務(wù)器上創(chuàng)建一個目錄,并把可訪問的URL記錄下來,此時你就可以利用'git remote add'命令來增加一個遠程服務(wù)器端,
例如:git remote add origin git://github.com/someone/another_project.git
上面的命令就會增加URL地址為'git: //github.com/someone/another_project.git',名稱為origin的遠程服務(wù)器,以后提交代碼的時候只需要使用 origin別名即可
檢出倉庫: $ git clone git://github.com/jquery/jquery.git
查看遠程倉庫:$ git remote -v
添加遠程倉庫:$ git remote add [name] [url]
刪除遠程倉庫:$ git remote rm [name]
修改遠程倉庫:$ git remote set-url --push [name] [newUrl]
拉取遠程倉庫:$ git pull [remoteName] [localBranchName]
推送遠程倉庫:$ git push [remoteName] [localBranchName]
$git push origin test:master // 提交本地test分支作為遠程的master分支
$git push origin test:test // 提交本地test分支作為遠程的test分支2)分支(branch)操作相關(guān)命令
查看本地分支:$ git branch
查看遠程分支:$ git branch -r
創(chuàng)建本地分支:$ git branch [name] ----注意新分支創(chuàng)建后不會自動切換為當(dāng)前分支
切換分支:$ git checkout [name]
創(chuàng)建新分支并立即切換到新分支:$ git checkout -b [name]
刪除分支:$ git branch -d [name] ---- -d選項只能刪除已經(jīng)參與了合并的分支,對于未有合并的分支是無法刪除的。如果想強制刪除一個分支,可以使用-D選項
合并分支:$ git merge [name] ----將名稱為[name]的分支與當(dāng)前分支合并
創(chuàng)建遠程分支(本地分支push到遠程):$ git push origin [name]
刪除遠程分支:$ git push origin :heads/[name] 或 $ gitpush origin :[name]
$git symbolic-ref HEAD refs/heads/[name]
$rm .git/index
$git clean -fdx3)版本(tag)操作相關(guān)命令
查看版本:$ git tag
創(chuàng)建版本:$ git tag [name]
刪除版本:$ git tag -d [name]
查看遠程版本:$ git tag -r
創(chuàng)建遠程版本(本地版本push到遠程):$ git push origin [name]
刪除遠程版本:$ git push origin :refs/tags/[name]
合并遠程倉庫的tag到本地:$ git pull origin --tags
上傳本地tag到遠程倉庫:$ git push origin --tags
創(chuàng)建帶注釋的tag:$ git tag -a [name] -m 'yourMessage'
4) 子模塊(submodule)相關(guān)操作命令
添加子模塊:$ git submodule add [url] [path]
如:$git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
初始化子模塊:$ git submodule init ----只在首次檢出倉庫時運行一次就行
更新子模塊:$ git submodule update ----每次更新或切換分支后都需要運行一下
刪除子模塊:(分4步走哦)
1) $ git rm --cached [path]
2) 編輯“.gitmodules”文件,將子模塊的相關(guān)配置節(jié)點刪除掉
3) 編輯“ .git/config”文件,將子模塊的相關(guān)配置節(jié)點刪除掉
4) 手動刪除子模塊殘留的目錄
5)忽略一些文件、文件夾不提交
在倉庫根目錄下創(chuàng)建名稱為“.gitignore”的文件,寫入不需要的文件夾名或文件,每個元素占一行即可,如
target
bin
*.db
三、 Git 命令詳解
現(xiàn)在我們有了本地和遠程的版本庫,讓我們來試著用用Git的基本命令:
git pull:從其他的版本庫(既可以是遠程的也可以是本地的)將代碼更新到本地,例如:'git pull origin master'就是將origin這個版本庫的代碼更新到本地的master主枝,該功能類似于SVN的update
git add:是將當(dāng)前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執(zhí)行的一步,例如'git add app/model/user.rb'就會增加app/model/user.rb文件到Git的索引中,該功能類似于SVN的add
git rm:從當(dāng)前的工作空間中和索引中刪除文件,例如'git rm app/model/user.rb',該功能類似于SVN的rm、del
git commit:提交當(dāng)前工作空間的修改內(nèi)容,類似于SVN的commit命令,例如'git commit -m story #3, add user model',提交的時候必須用-m來輸入一條提交信息,該功能類似于SVN的commit
git push:將本地commit的代碼更新到遠程版本庫中,例如'git push origin'就會將本地的代碼更新到名為orgin的遠程版本庫中
git log:查看歷史日志,該功能類似于SVN的log
git revert:還原一個版本的修改,必須提供一個具體的Git版本號,例如'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20',Git的版本號都是生成的一個哈希值
上面的命令幾乎都是每個版本控制工具所公有的,下面就開始嘗試一下Git獨有的一些命令:
git branch:對分支的增、刪、查等操作,例如'git branch new_branch'會從當(dāng)前的工作版本創(chuàng)建一個叫做new_branch的新分支,'git branch -D new_branch'就會強制刪除叫做new_branch的分支,'git branch'就會列出本地所有的分支
git checkout:Git的checkout有兩個作用,其一是在不同的branch之間進行切換,例如'git checkout new_branch'就會切換到new_branch的分支上去;另一個功能是還原代碼的作用,例如'git checkout app/model/user.rb'就會將user.rb文件從上一個已提交的版本中更新回來,未提交的內(nèi)容全部會回滾
git rebase:用下面兩幅圖解釋會比較清楚一些,rebase命令執(zhí)行后,實際上是將分支點從C移到了G,這樣分支也就具有了從C到G的功能
git reset:將當(dāng)前的工作目錄完全回滾到指定的版本號,假設(shè)如下圖,我們有A-G五次提交的版本,其中C的版本號是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執(zhí)行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么結(jié)果就只剩下了A-C三個提交的版本
git stash:將當(dāng)前未提交的工作存入Git工作棧中,時機成熟的時候再應(yīng)用回來,這里暫時提一下這個命令的用法,后面在技巧篇會重點講解
git config:利用這個命令可以新增、更改Git的各種設(shè)置,例如'git config branch.master.remote origin'就將master的遠程版本庫設(shè)置為別名叫做origin版本庫,后面在技巧篇會利用這個命令個性化設(shè)置你的Git,為你打造獨一無二的 Git
git tag:可以將某個具體的版本打上一個標(biāo)簽,這樣你就不需要記憶復(fù)雜的版本號哈希值了,例如你可以使用'git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20'來標(biāo)記這個被你還原的版本,那么以后你想查看該版本時,就可以使用 revert_version標(biāo)簽名,而不是哈希值了
Git 之所以能夠提供方便的本地分支等特性,是與它的文件存儲機制有關(guān)的。Git存儲版本控制信息時使用它自己定義的一套文件系統(tǒng)存儲機制,在代碼根目錄下有一個.git文件夾,會有如下這樣的目錄結(jié)構(gòu):
有幾個比較重要的文件和目錄需要解釋一下:HEAD文件存放根節(jié)點的信息,其實目錄結(jié)構(gòu)就表示一個樹型結(jié)構(gòu),Git采用這種樹形結(jié)構(gòu)來存儲版本信息,那么HEAD就表示根;refs目錄存儲了你在當(dāng)前版本控制目錄下的各種不同引用(引用指的是你本地和遠程所用到的各個樹分支的信息),它有heads、remotes、stash、tags四個子目錄,分別存儲對不同的根、遠程版本庫、Git棧和標(biāo)簽的四種引用,你可以通過命令'git show-ref'更清晰地查看引用信息;logs目錄根據(jù)不同的引用存儲了日志信息。因此,Git只需要代碼根目錄下的這一個.git目錄就可以記錄完整的版本控制信息,而不是像SVN那樣根目錄和子目錄下都有.svn目錄。那么下面就來看一下Git與SVN的區(qū)別吧
四、 Git 與SVN 比較
SVN(Subversion)是當(dāng)前使用最多的版本控制工具。與它相比較,Git 最大的優(yōu)勢在于兩點:易于本地增加分支和分布式的特性。
下面兩幅圖可以形象的展示Git與SVN的不同之處:
------------
1)本地增加分支
圖中Git本地和服務(wù)器端結(jié)構(gòu)都很靈活,所有版本都存儲在一個目錄中,你只需要進行分支的切換即可達到在某個分支工作的效果
而SVN則完全不同,如果你需要在本地試驗一些自己的代碼,只能本地維護多個不同的拷貝,每個拷貝對應(yīng)一個SVN服務(wù)器地址
舉一個實際的例子:
使用SVN作為版本控制工具,當(dāng)正在試圖增強一個模塊,工作做到一半,由于會改變原模塊的行為導(dǎo)致代碼服務(wù)器上許多測試的失敗,所以并沒有提交代碼。
這時候假如現(xiàn)在有一個很緊急的Bug需要處理, 必須在兩個小時內(nèi)完成。我只好將本地的所有修改diff,并輸出成為一個patch文件,然后回滾有關(guān)當(dāng)前任務(wù)的所有代碼,再開始修改Bug的任務(wù),等到修改好后,在將patch應(yīng)用回來。前前后后要完成多個繁瑣的步驟,這還不計中間代碼發(fā)生沖突所要進行的工作量。
可是如果使用Git, 我們只需要開一個分支或者轉(zhuǎn)回到主分支上,就可以隨時開始Bug修改的任務(wù),完成之后,只要切換到原來的分支就可以優(yōu)雅的繼續(xù)以前的任務(wù)。只要你愿意,每一個新的任務(wù)都可以開一個分支,完成后,再將它合并到主分支上,輕松而優(yōu)雅。
2)分布式提交
Git 可以本地提交代碼,所以在上面的圖中,Git有利于將一個大任務(wù)分解,進行本地的多次提交
而SVN只能在本地進行大量的一次性更改,導(dǎo)致將來合并到主干上造成巨大的風(fēng)險
3)日志查看
Git 的代碼日志是在本地的,可以隨時查看
SVN的日志在服務(wù)器上的,每次查看日志需要先從服務(wù)器上下載下來
例如:代碼服務(wù)器在美國,當(dāng)每次查看幾年前所做的工作時,日志下載可能需要十分鐘,這不能不說是一個痛苦。但是如果遷移到Git上,利用Git日志在本地的特性,查看某個具體任務(wù)的所有代碼歷史,每次只需要幾秒鐘,大大方便了工作,提高了效率。
當(dāng)然分布式并不是說用了Git就不需要一個代碼中心服務(wù)器,如果你工作在一個團隊里,還是需要一個服務(wù)器來保存所有的代碼的。
五、 總結(jié)
上面簡單介紹了Git 的基本概念、一些常用命令和原理,大家也可以嘗試動手,在Google Code 或 GitHub 上創(chuàng)建一個自己的開源項目
Git 創(chuàng)建與使用示例:
在Google Code 上,我創(chuàng)建了Git 項目:linux-kernel-source
在GitHub上,我引用的Git 項目:hiphop-php
在osChina上,我分享的項目:gcc-4.5.2
聯(lián)系客服