軟件項目開發過程當中,團隊間共享的代碼,文檔等可能被別人或本身不當心覆蓋或遺失、也不知道是誰,由於什麼緣由改了這段代碼、也沒辦法很好的復原前幾天的修改,因而版本控制系統(VCS-Version Control System)誕生。java
有了版本控制系統,咱們能夠瀏覽全部開發的歷史紀錄,掌握團隊的開發進度,並且做任何修改都再也不懼怕,由於你能夠輕易的復原回以前正常的版本。咱們也能夠透過度支和標籤的功能來進行軟件發行的不一樣版本,例如穩定版本、維護版本和開發中版本。近幾年版本控制系統的應用趨勢,如圖所示:git
版本控制系統(VCS,Version Control System)能夠劃分爲集中式和分佈式兩大類。集中式顧名思義,是用單一的服務器來集中管理保存項目的全部文件。項目團隊的成員經過客戶端鏈接到這臺服務器,下載或提交文件。如圖所示:github
集中式客戶端一旦沒法鏈接服務器,那麼版本控制功能將沒法使用(例如比較歷史版本差別;查看某個歷史版本內容等)。集中式的VCS傑出表明是SVN.windows
分佈式的特色是每一個客戶端除了能夠鏈接到一個集中的服務器外,客戶端自己能夠是一個完整的版本控制倉庫,項目團隊成員能夠在本身的電腦上對文件進行版本管理。如圖所示:安全
與集中式版本控制系統相比,分佈式版本控制系統的安全性要高不少,由於每一個人電腦裏都有完整的版本庫,某一我的的電腦壞掉了沒關係,隨便從其餘人那裏複製一個就能夠了。而集中式版本控制系統的中央服務器要是出了問題,全部人都無法幹活了。分佈式的VCS傑出表明是git。服務器
Git是一個開源的分佈式版本控制系統,做者是傳奇人物Linus,著名的開源操做系統Linux做者。liuns花了兩週時間本身用C寫出了一個Git。如今Linux系統的源碼都是由Git進行管理。Git現已經是VCS領域的江湖霸主。分佈式
Windows和Mac系統, 能夠直接從 http://git-scm.com/downloads 網址下載並運行安裝程序。對於Windows用戶可以使用 "Git Bash" 命令行工具(Git安裝時自帶)使用Git,Mac系統能夠直接實用終端窗口"Terminal"。工具
配置用戶和密碼學習
$ git config --global user.name "your-name" $ git config --global user.email "your-email@youremail.com"
檢查配置信息fetch
$ git config --list user.email=xxxxxx@xxxxxx.com user.name=xxxxxx
Git提供了一組簡單、獨特、獨立的命令,這些命令的執行須要首先啓動windows或mac系統的Git終端(window 下能夠可以使用 "Git Bash"),其語法結構爲:
$ git <command> <arguments>
Git 經常使用命令有:
init, clone, config: 用於啓動Git進行項目管理。 add, mv, rm: 用於暫時記錄或存儲文件的變動. commit, rebase, reset, tag: status, log, diff, grep, show: show status checkout, branch, merge, push, fetch, pull
Git 幫助手冊:(可快速獲取命令的使用幫助)
$ git help <command> // or $ git <command> --help
Git 操做手冊官方文檔 http://git-scm.com/docs.
這裏有兩種方式啓動Git管理項目:
這裏咱們先重新項目開始,進行入門學習:
首先建立一個git工做目錄,命名爲githello,而後在目錄中建立一個一個Hello.java,其代碼爲:
public class Hello { public static void main(String[] args) { System.out.println("Hello, world from GIT!"); } }
建議,在Hello.java所在目錄一樣再建立一個README.md
文件,經過此文件對你的項目進行描述,例如在文件中添加以下內容:
This is the README file for the Hello-world project.
基於Git實現項目管理時,首先在項目所在的根目錄(例如githello)執行"git init",過程以下:
git init // Change directory to the project directory //$ cd /path-to/hello-git // Initialize Git repo for this project $ git init Initialized empty Git repository in /path-to/hello-git/.git/ $ ls -al drwxr-xr-x 1 xxxxx xxxxx 4096 Sep 14 14:58 .git -rw-r--r-- 1 xxxxx xxxxx 426 Sep 14 14:40 Hello.java -rw-r--r-- 1 xxxxx xxxxx 66 Sep 14 14:33 README.md
其中,git init 指令執行結束,git本地庫的根目錄中會出啊關鍵一個".git"目錄(默認此目錄爲隱藏狀態)。
Git 存儲模型,如圖所示:
當咱們執行了git init 指令之後,本地庫實際上是空的的。您須要顯式地將文件存入倉庫。
// Add README.md file $ git add README.md $ git status On branch master Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: README.md Untracked files: (use "git add <file>..." to include in what will be committed) Hello.java // You can use wildcard * in the filename // Add all Java source files into Git repo $ git add *.java // You can also include multiple files in the "git add" // E.g., // git add Hello.java README.md $ git status On branch master Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: Hello.java new file: README.md
1)命令「git add<file>..」接受一個或多個可能帶有通配符模式的文件名或路徑名。您還可使用「git add.」添加當前目錄(以及全部子目錄)中的全部文件。
2)當一個新的文件被執行了「add」操做之後,它將存儲到git的暫存區(還並無commit到本地庫)。
Git 使用兩道工序提交文件的變動:
1)"git add <file>" 將文件存儲到暫存區。
2)"git commit" 將文件的全部變動由暫存取提交到本地庫。
假如咱們要將git暫存區文件的變動信息提交到本體庫,須要實用"git commit"指令,例如:
$ git commit -m "First commit" [master (root-commit) 6e49a29] first commit 2 files changed, 1 insertion(+) create mode 100644 Hello.java create mode 100644 README.md
接下來還能夠查看Git狀態:
$ git status
顯示Git提交日誌信息:
Git每次都會記錄提交的元數據,其中包括日誌消息、時間戳、做者的用戶名和電子郵件等)。咱們可使用"git log"指令顯示提交的數據。也可使用"git log --stat"查看文件的統計(statistics)信息。
$ git log
git log --stat
在Git中,有一種特殊的文件,其文件全名就是 .gitignore,,主要功能是基於規則屏蔽某些文件,使得這些文件不被追蹤(tracked),天然push後也不會上傳到github等平臺。這個時候咱們只須要在須要執行push操做的目錄下建立.gitignore文件,而後定義其規則便可,例如:
# .gitignore # Java class files *.class # Executable files *.exe # temp sub-directory (ended with a directory separator) temp/
如今,執行「git status」命令來檢查未跟蹤(untracked)的文件。
$ git status
On branch master Untracked files: (use "git add <file>..." to include in what will be committed) .gitignore nothing added to commit but untracked files present (use "git add" to track)
一般(Typically),咱們也會跟蹤或提交.gitignore文件,例如:
$ git add .gitignore $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: .gitignore $ git commit -m "Added .gitignore" [master 711ef4f] Added .gitignore 1 file changed, 14 insertions(+) create mode 100644 .gitignore $ git status On branch master nothing to commit, working directory clean
咱們使用Git進行項目管理時,一般會將項目提交到遠程倉庫,其具體步驟以下:
第一步:建立遠程倉庫(例如Gitee)-本身建立。
第二步:設置遠程倉庫名和url映射。
經過 via "git remote add <remote-name> <remote-url>"指令完成,設置名字爲 "origin"的遠程倉庫綁定。
例如:
$ git remote add origin https://gitee.com/JasonCN2008/gittest.git
以列表方式呈現遠程倉庫名:
$ git remote -v
第三步:推送(Push)和提交(commit)本庫內容到遠程倉庫。
將本地庫內容推送到遠程庫(執行過程須要輸入遠程倉庫帳號和密碼),其語法爲git push -u <remote-name> <local-branch-name>,例如:
$ git push origin master
實踐過程演示:
修改Hello.java文件內容,例如:
public class Hello { public static void main(String[] args) { System.out.println("Hello, world from GIT!"); System.out.println("Push and Commit !"); } }
執行Git操做
$ git status // Stage file changes $ git add *.java $ git status // Commit all staged file changes $ git commit -m "Third commit" [master 744307e] Third commit 1 file changed, 1 insertion(+) // Push the commits on local master branch to remote $ git push origin master
執行 "git clone <remote-url>
" 初始化一個本地庫,並將remote-url遠程庫中資源拷貝到本地庫工做目錄。例如,首先切換到git工做目錄,而後執行:
$ git clone https://gitee.com/JasonCN2008/gittest.git githello-clone
Clone 結束之後,切換到githello-clone目錄,執行ls -a指令查看目錄中資源。
本小節主要是對Git的基本指令操做進行了分析和實踐,咱們如今再將這些這令總結一下:
// Edit (Create, Modified, Rename, Delete) files。 // Stage file changes, which produces "Staged" file changes $ git add <file> // for new and modified files $ git rm <file> // for deleted files $ git mv <old-file-name> <new-file-name> // for renamed file // Commit (ALL staged file changes) $ git commit -m "message" // Push $ git push <remote-name> <local-branch-name>