一個中文git手冊:http://progit.org/book/zh/
原文:http://blog.csdn.net/sunboy_2050/article/details/7529841
前面兩篇博客 Git 版本管理工具 和 Git 常用命令詳解,分別介紹了Git 基礎知識和命令用法
本文將對Git 命令,做一下全面而系統的簡短總結,整理成簡潔、明了的圖表結構,方便查詢
一、 Git 常用命令速查
git branch 查看本地所有分支
git status 查看當前狀態
git commit 提交
git branch -a 查看所有的分支
git branch -r 查看遠程所有分支
git commit -am "init" 提交並且加注釋
git remote add origin git@192.168.1.119:ndshow
git push origin master 將文件給推到服務器上
git remote show origin 顯示遠程庫origin里的資源
git push origin master:develop
git push origin master:hb-dev 將本地庫與服務器上的庫進行關聯
git checkout --track origin/dev 切換到遠程dev分支
git branch -d master develop 刪除本地庫develop
git checkout -b dev 建立一個新的本地分支dev
git merge origin/dev 將分支dev與當前分支進行合並
git checkout dev 切換到本地dev分支
git remote show 查看遠程庫
git add .
git rm 文件名(包括路徑) 從git中刪除指定文件
git clone git://github.com/schacon/grit.git 從服務器上將代碼給拉下來
git config --list 看所有用戶
git ls-files 看已經被提交的
git rm [file name] 刪除一個文件
git commit -a 提交當前repos的所有的改變
git add [file name] 添加一個文件到git index
git commit -v 當你用-v參數的時候可以看commit的差異
git commit -m "This is the message describing the commit" 添加commit信息
git commit -a -a是代表add,把所有的change加到git index里然后再commit
git commit -a -v 一般提交命令
git log 看你commit的日志
git diff 查看尚未暫存的更新
git rm a.a 移除文件(從暫存區和工作區中刪除)
git rm --cached a.a 移除文件(只從暫存區中刪除)
git commit -m "remove" 移除文件(從Git中刪除)
git rm -f a.a 強行移除修改后文件(從暫存區和工作區中刪除)
git diff --cached 或 $ git diff --staged 查看尚未提交的更新
git stash push 將文件給push到一個臨時空間中
git stash pop 將文件從臨時空間pop下來
---------------------------------------------------------
git remote add origin git@github.com:username/Hello-World.git
git push origin master 將本地項目給提交到服務器中
-----------------------------------------------------------
git pull 本地與服務器端同步
-----------------------------------------------------------------
git push (遠程倉庫名) (分支名) 將本地分支推送到服務器上去。
git push origin serverfix:awesomebranch
------------------------------------------------------------------
git fetch 相當於是從遠程獲取最新版本到本地,不會自動merge
git commit -a -m "log_message" (-a是提交所有改動,-m是加入log信息) 本地修改同步至服務器端 :
git branch branch_0.1 master 從主分支master創建branch_0.1分支
git branch -m branch_0.1 branch_1.0 將branch_0.1重命名為branch_1.0
git checkout branch_1.0/master 切換到branch_1.0/master分支
刪除遠程branch
git push origin :branch_remote_name
git branch -r -d branch_remote_name
-----------------------------------------------------------
初始化版本庫,並提交到遠程服務器端
mkdir WebApp
cd WebApp
git init本地初始化
touch README
git add README添加文件
git commit -m 'first commit'
git remote add origin git@github.com:daixu/WebApp.git 增加一個遠程服務器端
上面的命令會增加URL地址為'git@github.com:daixu/WebApp.git',名稱為origin的遠程服務器庫,以后提交代碼的時候只需要使用 origin別名即可
二、 Git 命令速查表
1、常用的Git命令
命令 |
簡要說明 |
git add |
添加至暫存區 |
git add–interactive |
交互式添加 |
git apply |
應用補丁 |
git am |
應用郵件格式補丁 |
git annotate |
同義詞,等同於 git blame |
git archive |
文件歸檔打包 |
git bisect |
二分查找 |
git blame |
文件逐行追溯 |
git branch |
分支管理 |
git cat-file |
版本庫對象研究工具 |
git checkout |
檢出到工作區、切換或創建分支 |
git cherry-pick |
提交揀選 |
git citool |
圖形化提交,相當於 git gui 命令 |
git clean |
清除工作區未跟蹤文件 |
git clone |
克隆版本庫 |
git commit |
提交 |
git config |
查詢和修改配置 |
git describe |
通過里程碑直觀地顯示提交ID |
git diff |
差異比較 |
git difftool |
調用圖形化差異比較工具 |
git fetch |
獲取遠程版本庫的提交 |
git format-patch |
創建郵件格式的補丁文件。參見 git am 命令 |
git grep |
文件內容搜索定位工具 |
git gui |
基於Tcl/Tk的圖形化工具,側重提交等操作 |
git help |
幫助 |
git init |
版本庫初始化 |
git init-db* |
同義詞,等同於 git init |
git log |
顯示提交日志 |
git merge |
分支合並 |
git mergetool |
圖形化沖突解決 |
git mv |
重命名 |
git pull |
拉回遠程版本庫的提交 |
git push |
推送至遠程版本庫 |
git rebase |
分支變基 |
git rebase–interactive |
交互式分支變基 |
git reflog |
分支等引用變更記錄管理 |
git remote |
遠程版本庫管理 |
git repo-config* |
同義詞,等同於 git config |
git reset |
重置改變分支“游標”指向 |
git rev-parse |
將各種引用表示法轉換為哈希值等 |
git revert |
反轉提交 |
git rm |
刪除文件 |
git show |
顯示各種類型的對象 |
git stage* |
同義詞,等同於 git add |
git stash |
保存和恢復進度 |
git status |
顯示工作區文件狀態 |
git tag |
里程碑管理 |
2、對象庫操作相關命令
命令 |
簡要說明 |
git commit-tree |
從樹對象創建提交 |
git hash-object |
從標准輸入或文件計算哈希值或創建對象 |
git ls-files |
顯示工作區和暫存區文件 |
git ls-tree |
顯示樹對象包含的文件 |
git mktag |
讀取標准輸入創建一個里程碑對象 |
git mktree |
讀取標准輸入創建一個樹對象 |
git read-tree |
讀取樹對象到暫存區 |
git update-index |
工作區內容注冊到暫存區及暫存區管理 |
git unpack-file |
創建臨時文件包含指定 blob 的內容 |
git write-tree |
從暫存區創建一個樹對象 |
3、引用操作相關命令
命令 |
簡要說明 |
git check-ref-format |
檢查引用名稱是否符合規范 |
git for-each-ref |
引用迭代器,用於shell編程 |
git ls-remote |
顯示遠程版本庫的引用 |
git name-rev |
將提交ID顯示為友好名稱 |
git peek-remote* |
過時命令,請使用 git ls-remote |
git rev-list |
顯示版本范圍 |
git show-branch |
顯示分支列表及拓撲關系 |
git show-ref |
顯示本地引用 |
git symbolic-ref |
顯示或者設置符號引用 |
git update-ref |
更新引用的指向 |
git verify-tag |
校驗 GPG 簽名的Tag |
4、版本庫管理相關命令
命令 |
簡要說明 |
git count-objects |
顯示松散對象的數量和磁盤占用 |
git filter-branch |
版本庫重構 |
git fsck |
對象庫完整性檢查 |
git fsck-objects* |
同義詞,等同於 git fsck |
git gc |
版本庫存儲優化 |
git index-pack |
從打包文件創建對應的索引文件 |
git lost-found* |
過時,請使用 git fsck –lost-found 命令 |
git pack-objects |
從標准輸入讀入對象ID,打包到文件 |
git pack-redundant |
查找多余的 pack 文件 |
git pack-refs |
將引用打包到 .git/packed-refs 文件中 |
git prune |
從對象庫刪除過期對象 |
git prune-packed |
將已經打包的松散對象刪除 |
git relink |
為本地版本庫中相同的對象建立硬連接 |
git repack |
將版本庫未打包的松散對象打包 |
git show-index |
讀取包的索引文件,顯示打包文件中的內容 |
git unpack-objects |
從打包文件釋放文件 |
git verify-pack |
校驗對象庫打包文件 |
5、數據傳輸相關命令
命令 |
簡要說明 |
|
git fetch-pack |
執行 git fetch 或 git pull 命令時在本地執行此命令,用於從其他版本庫獲取缺失的對象 |
|
git receive-pack |
執行 git push 命令時在遠程執行的命令,用於接受推送的數據 |
|
git send-pack |
執行 git push 命令時在本地執行的命令,用於向其他版本庫推送數據 |
|
git upload-archive |
執行 git archive –remote 命令基於遠程版本庫創建歸檔時,遠程版本庫執行此命令傳送歸檔 |
|
git upload-pack |
執行 git fetch 或 git pull 命令時在遠程執行此命令,將對象打包、上傳 |
6、郵件相關命令
命令 |
簡要說明 |
git imap-send |
將補丁通過 IMAP 發送 |
git mailinfo |
從郵件導出提交說明和補丁 |
git mailsplit |
將 mbox 或 Maildir 格式郵箱中郵件逐一提取為文件 |
git request-pull |
創建包含提交間差異和執行PULL操作地址的信息 |
git send-email |
發送郵件 |
7、協議相關命令
命令 |
簡要說明 |
git daemon |
實現Git協議 |
git http-backend |
實現HTTP協議的CGI程序,支持智能HTTP協議 |
git instaweb |
即時啟動瀏覽器通過 gitweb 瀏覽當前版本庫 |
git shell |
受限制的shell,提供僅執行Git命令的SSH訪問 |
git update-server-info |
更新啞協議需要的輔助文件 |
git http-fetch |
通過HTTP協議獲取版本庫 |
git http-push |
通過HTTP/DAV協議推送 |
git remote-ext |
由Git命令調用,通過外部命令提供擴展協議支持 |
git remote-fd |
由Git命令調用,使用文件描述符作為協議接口 |
git remote-ftp |
由Git命令調用,提供對FTP協議的支持 |
git remote-ftps |
由Git命令調用,提供對FTPS協議的支持 |
git remote-http |
由Git命令調用,提供對HTTP協議的支持 |
git remote-https |
由Git命令調用,提供對HTTPS協議的支持 |
git remote-testgit |
協議擴展示例腳本 |
8、版本庫轉換和交互相關命令
命令 |
簡要說明 |
git archimport |
導入Arch版本庫到Git |
git bundle |
提交打包和解包,以便在不同版本庫間傳遞 |
git cvsexportcommit |
將Git的一個提交作為一個CVS檢出 |
git cvsimport |
導入CVS版本庫到Git。或者使用 cvs2git |
git cvsserver |
Git的CVS協議模擬器,可供CVS命令訪問Git版本庫 |
git fast-export |
將提交導出為 git-fast-import 格式 |
git fast-import |
其他版本庫遷移至Git的通用工具 |
git svn |
Git 作為前端操作 Subversion |
9、合並相關的輔助命令
命令 |
簡要說明 |
git merge-base |
供其他腳本調用,找到兩個或多個提交最近的共同祖先 |
git merge-file |
針對文件的兩個不同版本執行三向文件合並 |
git merge-index |
對index中的沖突文件調用指定的沖突解決工具 |
git merge-octopus |
合並兩個以上分支。參見 git merge 的octopus合並策略 |
git merge-one-file |
由 git merge-index 調用的標准輔助程序 |
git merge-ours |
合並使用本地版本,拋棄他人版本。參見 git merge 的ours合並策略 |
git merge-recursive |
針對兩個分支的三向合並。參見 git merge 的recursive合並策略 |
git merge-resolve |
針對兩個分支的三向合並。參見 git merge 的resolve合並策略 |
git merge-subtree |
子樹合並。參見 git merge 的 subtree 合並策略 |
git merge-tree |
顯式三向合並結果,不改變暫存區 |
git fmt-merge-msg |
供執行合並操作的腳本調用,用於創建一個合並提交說明 |
git rerere |
重用所記錄的沖突解決方案 |
10、 雜項
命令 |
簡要說明 |
git bisect–helper |
由 git bisect 命令調用,確認二分查找進度 |
git check-attr |
顯示某個文件是否設置了某個屬性 |
git checkout-index |
從暫存區拷貝文件至工作區 |
git cherry |
查找沒有合並到上游的提交 |
git diff-files |
比較暫存區和工作區,相當於 git diff –raw |
git diff-index |
比較暫存區和版本庫,相當於 git diff –cached –raw |
git diff-tree |
比較兩個樹對象,相當於 git diff –raw A B |
git difftool–helper |
由 git difftool 命令調用,默認要使用的差異比較工具 |
git get-tar-commit-id |
從 git archive 創建的 tar 包中提取提交ID |
git gui–askpass |
命令 git gui 的獲取用戶口令輸入界面 |
git notes |
提交評論管理 |
git patch-id |
補丁過濾行號和空白字符后生成補丁唯一ID |
git quiltimport |
將Quilt補丁列表應用到當前分支 |
git replace |
提交替換 |
git shortlog |
對 git log 的匯總輸出,適合於產品發布說明 |
git stripspace |
刪除空行,供其他腳本調用 |
git submodule |
子模組管理 |
git tar-tree |
過時命令,請使用 git archive |
git var |
顯示 Git 環境變量 |
git web–browse |
啟動瀏覽器以查看目錄或文件 |
git whatchanged |
顯示提交歷史及每次提交的改動 |
git-mergetool–lib |
包含於其他腳本中,提供合並/差異比較工具的選擇和執行 |
git-parse-remote |
包含於其他腳本中,提供操作遠程版本庫的函數 |
git-sh-setup |
包含於其他腳本中,提供 shell 編程的函數庫
|
原文:http://hi.baidu.com/wade_hit/item/848869db05e53af4cb0c391b
總結一下ubuntu下github常用的命令,設置部分跳過,假設repository的名字叫hello-world:
1.創建一個新的repository:
先在github上創建並寫好相關名字,描述。
$cd ~/hello-world //到hello-world目錄
$git init //初始化
$git add . //把所有文件加入到索引(不想把所有文件加入,可以用gitignore或add 具體文件)
$git commit //提交到本地倉庫,然后會填寫更新日志( -m “更新日志”也可)
$git remote add origin git@github.com:WadeLeng/hello-world.git //增加到remote
$git push origin master //push到github上
2.更新項目(新加了文件):
$cd ~/hello-world
$git add . //這樣可以自動判斷新加了哪些文件,或者手動加入文件名字
$git commit //提交到本地倉庫
$git push origin master //不是新創建的,不用再add 到remote上了
3.更新項目(沒新加文件,只有刪除或者修改文件):
$cd ~/hello-world
$git commit -a //記錄刪除或修改了哪些文件
$git push origin master //提交到github
4.忽略一些文件,比如*.o等:
$cd ~/hello-world
$vim .gitignore //把文件類型加入到.gitignore中,保存
然后就可以git add . 能自動過濾這種文件
5.clone代碼到本地:
$git clone git@github.com:WadeLeng/hello-world.git
假如本地已經存在了代碼,而倉庫里有更新,把更改的合並到本地的項目:
$git fetch origin //獲取遠程更新
$git merge origin/master //把更新的內容合並到本地分支
6.撤銷
$git reset
7.刪除
$git rm * // 不是用rm
//------------------------------常見錯誤-----------------------------------
1.$ git remote add origin git@github.com:WadeLeng/hello-world.git
錯誤提示:fatal: remote origin already exists.
解決辦法:$ git remote rm origin
然后在執行:$ git remote add origin git@github.com:WadeLeng/hello-world.git 就不會報錯誤了
2. $ git push origin master
錯誤提示:error:failed to push som refs to
解決辦法:$ git pull origin master //先把遠程服務器github上面的文件拉先來,再push 上去。
Git 是一個很強大的分布式版本管理工具,它不但適用於管理大型開源軟件的源代碼(如:linux kernel),管理私人的文檔和源代碼也有很多優勢(如:wsi-lgame-pro)
Git 的更多介紹,請參考我的上一篇博客:Git 版本管理工具
一、 Git 命令初識
在正式介紹Git命令之前,先介紹一下Git 的基本命令和操作,對Git命令有一個總體的認識
示例:從Git 版本庫的初始化,通常有兩種方式:
1)git clone:這是一種較為簡單的初始化方式,當你已經有一個遠程的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:這種方式稍微復雜一些,當你本地創建了一個工作目錄,你可以進入這個目錄,使用'git init'命令進行初始化;Git以后就會對該目錄下的文件進行版本控制,這時候如果你需要將它放到遠程服務器上,可以在遠程服務器上創建一個目錄,並把 可訪問的URL記錄下來,此時你就可以利用'git remote add'命令來增加一個遠程服務器端,
例如:git remote add origin git://github.com/someone/another_project.git
上面的命令就會增加URL地址為'git: //github.com/someone/another_project.git',名稱為origin的遠程服務器,以后提交代碼的時候只需要使用 origin別名即可
Git 是一個很強大的分布式版本管理工具,它不但適用於管理大型開源軟件的源代碼(如:linux kernel),管理私人的文檔和源代碼也有很多優勢(如:wsi-lgame-pro)
Git 的更多介紹,請參考我的上一篇博客:Git 版本管理工具
一、 Git 命令初識
在正式介紹Git命令之前,先介紹一下Git 的基本命令和操作,對Git命令有一個總體的認識
示例:從Git 版本庫的初始化,通常有兩種方式:
1)git clone:這是一種較為簡單的初始化方式,當你已經有一個遠程的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:這種方式稍微復雜一些,當你本地創建了一個工作目錄,你可以進入這個目錄,使用'git init'命令進行初始化;Git以后就會對該目錄下的文件進行版本控制,這時候如果你需要將它放到遠程服務器上,可以在遠程服務器上創建一個目錄,並把 可訪問的URL記錄下來,此時你就可以利用'git remote add'命令來增加一個遠程服務器端,
例如:git remote add origin git://github.com/someone/another_project.git
上面的命令就會增加URL地址為'git: //github.com/someone/another_project.git',名稱為origin的遠程服務器,以后提交代碼的時候只需要使用 origin別名即可
二、 Git 常用命令
1) 遠程倉庫相關命令
檢出倉庫: $ 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]
*如果想把本地的某個分支test提交到遠程倉庫,並作為遠程倉庫的master分支,或者作為另外一個名叫test的分支,如下:
$git push origin test:master // 提交本地test分支作為遠程的master分支
$git push origin test:test // 提交本地test分支作為遠程的test分支
2)分支(branch)操作相關命令
查看本地分支:$ git branch
查看遠程分支:$ git branch -r
創建本地分支:$ git branch [name] ----注意新分支創建后不會自動切換為當前分支
切換分支:$ git checkout [name]
創建新分支並立即切換到新分支:$ git checkout -b [name]
刪除分支:$ git branch -d [name] ---- -d選項只能刪除已經參與了合並的分支,對於未有合並的分支是無法刪除的。如果想強制刪除一個分支,可以使用-D選項
合並分支:$ git merge [name] ----將名稱為[name]的分支與當前分支合並
創建遠程分支(本地分支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 -fdx
3)版本(tag)操作相關命令
查看版本:$ git tag
創建版本:$ git tag [name]
刪除版本:$ git tag -d [name]
查看遠程版本:$ git tag -r
創建遠程版本(本地版本push到遠程):$ git push origin [name]
刪除遠程版本:$ git push origin :refs/tags/[name]
合並遠程倉庫的tag到本地:$ git pull origin --tags
上傳本地tag到遠程倉庫:$ git push origin --tags
創建帶注釋的tag:$ git tag -a [name] -m 'yourMessage'
4) 子模塊(submodule)相關操作命令
添加子模塊:$ 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”文件,將子模塊的相關配置節點刪除掉
3) 編輯“ .git/config”文件,將子模塊的相關配置節點刪除掉
4) 手動刪除子模塊殘留的目錄
5)忽略一些文件、文件夾不提交
在倉庫根目錄下創建名稱為“.gitignore”的文件,寫入不需要的文件夾名或文件,每個元素占一行即可,如
target
bin
*.db
三、 Git 命令詳解
現在我們有了本地和遠程的版本庫,讓我們來試着用用Git的基本命令:
git pull:從其他的版本庫(既可以是遠程的也可以是本地的)將代碼更新到本地,例如:'git pull origin master'就是將origin這個版本庫的代碼更新到本地的master主枝,該功能類似於SVN的update
git add:是 將當前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示記入了版本歷史中,這也是提交之前所需要執行的一步,例如'git add app/model/user.rb'就會增加app/model/user.rb文件到Git的索引中,該功能類似於SVN的add
git rm:從當前的工作空間中和索引中刪除文件,例如'git rm app/model/user.rb',該功能類似於SVN的rm、del
git commit:提交當前工作空間的修改內容,類似於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'會從當前的工作版本創建一個叫做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文件從上一個已提交的版本中更新回來,未提交的內容全部會回滾
git rebase:用下面兩幅圖解釋會比較清楚一些,rebase命令執行后,實際上是將分支點從C移到了G,這樣分支也就具有了從C到G的功能
git reset:將當前的工作目錄完全回滾到指定的版本號,假設如下圖,我們有A-G五次提交的版本,其中C的版本號是 bbaf6fb5060b4875b18ff9ff637ce118256d6f20,我們執行了'git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20'那么結果就只剩下了A-C三個提交的版本
git stash:將當前未提交的工作存入Git工作棧中,時機成熟的時候再應用回來,這里暫時提一下這個命令的用法,后面在技巧篇會重點講解
git config:利用這個命令可以新增、更改Git的各種設置,例如'git config branch.master.remote origin'就將master的遠程版本庫設置為別名叫做origin版本庫,后面在技巧篇會利用這個命令個性化設置你的Git,為你打造獨一無二的 Git
git tag:可以將某個具體的版本打上一個標簽,這樣你就不需要記憶復雜的版本號哈希值了,例如你可以使用'git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20'來標記這個被你還原的版本,那么以后你想查看該版本時,就可以使用 revert_version標簽名,而不是哈希值了
Git 之所以能夠提供方便的本地分支等特性,是與它的文件存儲機制有關的。Git存儲版本控制信息時使用它自己定義的一套文件系統存儲機制,在代碼根目錄下有一個.git文件夾,會有如下這樣的目錄結構:
有 幾個比較重要的文件和目錄需要解釋一下:HEAD文件存放根節點的信息,其實目錄結構就表示一個樹型結構,Git采用這種樹形結構來存儲版本信息,那么 HEAD就表示根;refs目錄存儲了你在當前版本控制目錄下的各種不同引用(引用指的是你本地和遠程所用到的各個樹分支的信息),它有heads、 remotes、stash、tags四個子目錄,分別存儲對不同的根、遠程版本庫、Git棧和標簽的四種引用,你可以通過命令'git show-ref'更清晰地查看引用信息;logs目錄根據不同的引用存儲了日志信息。因此,Git只需要代碼根目錄下的這一個.git目錄就可以記錄完 整的版本控制信息,而不是像SVN那樣根目錄和子目錄下都有.svn目錄。那么下面就來看一下Git與SVN的區別吧
四、 Git 與SVN 比較
SVN(Subversion)是當前使用最多的版本控制工具。與它相比較,Git 最大的優勢在於兩點:易於本地增加分支和分布式的特性。
下面兩幅圖可以形象的展示Git與SVN的不同之處:
------------
1)本地增加分支
圖中Git本地和服務器端結構都很靈活,所有版本都存儲在一個目錄中,你只需要進行分支的切換即可達到在某個分支工作的效果
而SVN則完全不同,如果你需要在本地試驗一些自己的代碼,只能本地維護多個不同的拷貝,每個拷貝對應一個SVN服務器地址
舉一個實際的例子:
使用SVN作為版本控制工具,當正在試圖增強一個模塊,工作做到一半,由於會改變原模塊的行為導致代碼服務器上許多測試的失敗,所以並沒有提交代碼。
這 時候假如現在有一個很緊急的Bug需要處理, 必須在兩個小時內完成。我只好將本地的所有修改diff,並輸出成為一個patch文件,然后回滾有關當前任務的所有代碼,再開始修改Bug的任務,等到 修改好后,在將patch應用回來。前前后后要完成多個繁瑣的步驟,這還不計中間代碼發生沖突所要進行的工作量。
可是如果使用Git, 我們只需要開一個分支或者轉回到主分支上,就可以隨時開始Bug修改的任務,完成之后,只要切換到原來的分支就可以優雅的繼續以前的任務。只要你願意,每一個新的任務都可以開一個分支,完成后,再將它合並到主分支上,輕松而優雅。
2)分布式提交
Git 可以本地提交代碼,所以在上面的圖中,Git有利於將一個大任務分解,進行本地的多次提交
而SVN只能在本地進行大量的一次性更改,導致將來合並到主干上造成巨大的風險
3)日志查看
Git 的代碼日志是在本地的,可以隨時查看
SVN的日志在服務器上的,每次查看日志需要先從服務器上下載下來
例如:代碼服務器在美國,當每次查看幾年前所做的工作時,日志下載可能需要十分鍾,這不能不說是一個痛苦。但是如果遷移到Git上,利用Git日志在本地的特性,查看某個具體任務的所有代碼歷史,每次只需要幾秒鍾,大大方便了工作,提高了效率。
當然分布式並不是說用了Git就不需要一個代碼中心服務器,如果你工作在一個團隊里,還是需要一個服務器來保存所有的代碼的。