版本控管系統,就像是 CVS 或 SVN(Subversion)。
為什麼要用 Git 取代 SVN?
不同於 CVS 或 SVN 這類中央控管型的版本控管系統,Git 是分散式版本控管系統。
什麼是分散式版本控管系統?
CVS 或 SVN 只有一個遠端的檔案庫(repository),分散式版本控管系統有兩個檔案庫,本地端與遠端,就像是本機有一個 SVN Server,供本機專用,而這個本機 SVN Server 又可以和遠端多人共用的 SVN Server 進行同步。
兩個檔案庫有什麼好處?
- 與本機檔案庫進行同步,不僅速度快,最重要的是可以離線使用。
- 不會因遠端檔案庫掛點,而導致無法使用版本控管,可以一直使用本地端檔案庫,直到遠端檔案庫修復,再進行同步。
- 可以保有自己的版本,等到大功告成後,才放到遠端檔案庫,不用擔心資料遺失而交付不完整的版本。
- 若遠端檔案庫因為不明原因自爆,可以使用任何一個本地端檔案庫來重建遠端檔案庫(當然是找最新版的那個),因為所有本地端檔案庫都是遠端檔案庫的複本。
- 遠端檔案庫不是必要的,也就是說,只是自己要作版本控管,不需要和他人共用的話,那就只需要本機端檔案庫就可以了;換句話說,不需要任何檔案控管 Server,就可以使用版本控管的功能。
Git 為什麼可以這麼快?
- 不同於 CVS 或 SVN 將每個版本儲存差異,Git 是儲存整個檔案,也就是說,當 SVN 要取出某個版本時,得從第一版一路累加到指定的版本,而 Git 則是直接取出指定的版本檔案,當然,Git 檔案庫會使用較多的磁碟空間。
- 幾乎所有的版本控管操作都是本地端的,只有少數的情況需要呼叫遠端的檔案庫;因為本地端檔案庫是遠端檔案庫的複本,所以除非要修改遠端檔案庫,否則所有的唯讀動作,本地端檔案庫都可以勝任。
安裝 Git
- 到 http://code.google.com/p/msysgit/downloads/list 下載 Git-[x.x.x]-preview[yyyymmdd].exe,目前是 Git-1.8.0-preview20121022.exe。
- 使用預設值安裝,唯有在「Adjusting your PATH environment」選擇「Run Git from the Windows Command Prompt」。
- 完成後就可以在命令提出字元輸入 git 驗證。
Git 初始化設定
> git config --global user.email '...@gmail.com' > git config --global user.name 'Neil Chan'這是必要且為一次性的設定。
Git 檔案的四種狀態(工作區檔案、已標記檔案、本機檔案庫、遠端檔案庫)與三種動作(add、commit、push)
- 狀態一:工作區檔案,就像是 Eclipse 裡看到的檔案
- 動作一:修改工作區的檔案,然後 add 到狀態二
- 狀態二:已標記檔案(stage or index),已建立副本,此時若再修改同一工作區檔案,是不會影響這個標記檔案的
- 動作二:commit 已標記的檔案到狀態三
- 狀態三:Commited 檔案,這裡就是本機檔案庫
- 動作三:push 本機檔案庫到遠端檔案庫
- 狀態四:遠端檔案庫
建立新的本地檔案庫
檔案結構如下:
- aproject.git
- aproject
> mkdir aproject.git > cd aproject.git > git init Initialized empty Git repository in .../aproject.git/.git/產生的檔案結構如下:
- aproject.git
- .git
- aproject
複製遠端檔案庫為本地檔案庫
執行 git clone [url],可以複製整個遠端檔案庫到本機,建立工作區目錄與 .git 目錄。
> git clone https://github.com/jquery/jquery-ui.git Cloning into 'jquery-ui'... remote: Counting objects: 53609, done. remote: Compressing objects: 100% (14755/14755), done. remote: Total 53609 (delta 40800), reused 50419 (delta 38028)Receiving objects: Receiving objects: 100% (53609/53609), 18.62 MiB | 129 KiB/s, done. Resolving deltas: 100% (40800/40800), done.得到以下結果:
- jquery-ui
- .git
- build
- demos
- ...
> git clone https://github.com/jquery/jquery-ui.git jqueryui
...
得到以下結果:- jqueryui
- .git
- build
- demos
- ...
Git 檔案的幾種可能性
- 未追蹤的檔案:未經過 git add 的檔案
- 已追蹤的檔案:經過 git add 的檔案
- 未修改的檔案:commit 之後未修改的檔案,或者 clone 之後未修改的檔案
- 已修改的檔案:已修改但未標記的檔案
- 已標記的檔案:修改且標記的檔案,commit 之後回到「未修改的檔案」
- 忽略的檔案
Git 基本操作(add-commit-push)
可以使用 git status 檢查所有檔案的狀態。
在新建的檔案庫執行 git status 。
> git status # On branch master # # Initial commit # nothing to commit (create/copy files and use "git add" to track)git 有一個相當貼心的功能,就是在每個指令裡提示下一個可以執行的指令,例如上面的 create/copy files and use "git add" to track。
在剛 clone 回來的檔案庫執行 git status 。
> git status # On branch master nothing to commit, working directory cleangit status 只會列出需要處理的檔案,例如未追蹤的檔案、已修改的檔案和已標記檔案,不會列出未修改的檔案與忽略的檔案這類不需要處理的檔案。
手動新增一個檔案 a.txt,再執行一次 git status。
> git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # a.txt nothing added to commit but untracked files present (use "git add" to track)出現一個未追蹤檔案 a.txt,並提示可以用 git add 加入追蹤。
那就用 git add 加入追蹤吧。
> git add a.txt > git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: a.txt #再使用 git status 檢查狀態,可以發現 a.txt 從未追蹤狀態改為已標記狀態(Changes to be committed),也就是等待 commit 中。
如果不小心將不需要的檔案加入追蹤,git 也提示了移除追蹤(unstage)的指令 git rm --cached,也就是再從已標記狀態改為未追蹤狀態。
> git rm --cached a.txt rm 'a.txt' > git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # a.txt nothing added to commit but untracked files present (use "git add" to track)為了玩下去,再將 a.txt 用 git add 加入已追蹤狀態。
這時就可以進入狀態三,使用 git commit 將已標記檔案轉入本機檔案庫。
> git commit -m 'first_commit' [master (root-commit) ff46082] 'first_commit' 0 files changed create mode 100644 a.txt > git status # On branch master nothing to commit, working directory clean嗯,搞定,a.txt 進入本機檔案庫作永久保存了。
接下來就是 push 到遠端檔案庫了。
遠端檔案庫在哪?有兩個選擇,第一、自己建一個,第二、簡單一點,使用網路上免費的檔案庫,例如 Bitbucket,這邊就以 Bitbucket 為例作說明。
要做的事有:
- 註冊
- 新建遠端檔案庫
- push 本地檔案庫到遠端檔案庫
簡單抓圖說明,新建遠端檔案庫。
輸入檔案庫名稱,並確認勾選「This is a private repository」。
完成後,點選「I hava code I want to import」。
執行第二和第三指令。
> git remote add origin https://cw1057@bitbucket.org/cw1057/aproject.git > git push -u origin --all Password for 'https://cw1057@bitbucket.org': Counting objects: 3, done. Writing objects: 100% (3/3), 206 bytes, done. Total 3 (delta 0), reused 0 (delta 0) remote: bb/acl: cw1057 is allowed. accepted payload. To https://cw1057@bitbucket.org/cw1057/aproject.git * [new branch] master -> master Branch master set up to track remote branch master from origin.就這樣,push 到遠端檔案庫就完成了。
可以執行前面提過的 git clone 來驗證。
網址是?可以單點 Bitbucket 網頁右上角的 Clone 按鈕就可以知道。
> git clone https://cw1057@bitbucket.org/cw1057/aproject.git Cloning into 'aproject'... Password for 'https://cw1057@bitbucket.org': remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done.
最後,Git 是誰發明的?
Linus Torvalds,就是發明 Linux 那個人,Git 最早就是用來控管 Linux 的。
有多少人在開發 Linux?
Linux 是多大的系統?
所以放心的用 Git 吧!
回到 Git 學習筆記。
---
---
---
沒有留言:
張貼留言