Git是一種分散式版本控制工具,現階段比較流行的版本控制工具主要分為:集中式版本控制工具盒分散式版本控制工具。
集中式版本控制工具:SVN和CVS為代表
集中式版本控制系統(每次都得從SVN伺服器資料中心去拿資料):
分散式版本控制系統:
在Windows上安裝Git工具:
msysgit是Windows版的Git,從http://msysgit.github.io/下載,然後按預設選項安裝即可。
安裝完成後,在開始選單裡找到"Git"->"Git Bash",蹦出一個類似命令列視窗的東西,就說明Git安裝成功!
安裝完成後,還需要最後一步設定,在命令列輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意git config命令的--global引數,用了這個引數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的使用者名稱和Email地址。
建立版本庫:
什麼是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裡面的所有檔案都可以被Git管理起來,每個檔案的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以"還原"。
首先,我們需要建立一個空目錄在合適的目錄下(為了避免出現一些識別問題,在Windows下面最好使用英文的檔名命名,別使用中文字元):
然後,通過git init初始化這個目錄,讓這個目錄成為Git可以管理的倉庫(初始化完成後,你可以發現該資料夾下會出現一個.git的資料夾):
為了下面的講價更加方便,所以我們用一個.txt的檔案來作為演示的例子。
我們建立一個檔案 "Git2Test1.txt",這個檔案一定建立在初始化後的資料夾或者該資料夾的子資料夾下(Git2),
新增檔案到版本庫:
如果我們想把這個檔案"Git2Test1.txt"成功的新增到一個Git倉庫中,我們只需要兩步:
-
git add Git2Test1.txt (先把檔案通過命令 add新增到倉庫,可反覆多次使用,新增多個檔案)
-
Git commit -m "new1" (然後通過命令 commit 提交到倉庫,
簡單解釋一下git commit命令,-m後面輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從歷史記錄裡方便地找到改動記錄。
嫌麻煩不想輸入-m "xxx"行不行?確實有辦法可以這麼幹,但是強烈不建議你這麼幹,因為輸入說明對自己對別人閱讀都很重要。實在不想輸入說明的童鞋請自行Google,我不告訴你這個引數。
)
檔案版本回退:
在檔案Git2Test1.txt中新增一行內容,通過 git status檢視當前檔案的狀態,通過 git diff file可以看到檔案有什麼變化,檢視修改後檔案的變化
在執行第一步git add之後,在執行第二步git commit之前,我們再執行git status看看當前倉庫的狀態:
在執行完第二步git commit之後,我們再執行git status看看當前倉庫的狀態:
通過 git log 可以檢視檔案在倉庫中有幾個版本(2338c....eeaa9b代表的是commit id的版本號,在git中用 HEAD表示當前的版本,上一個版本就是HEAD^ 上上個版本就是HEAD^^,如果是上100個版本可以用 HEAD~100):
通過 git reset --hard HEAD^命令回到之前的版本,
如果我又想回到new2, 可以通過 git reset --hard commit id (前幾位數)這個版本:
要是我們不知道 commit id號了,又想回到某個版本怎麼辦呢? 可以通過git reflog 檢視log的歷史版本
工作區和暫存區
到這大家一定會有一定的疑惑關於版本回退和HEAD這塊,如果我們想弄清楚這塊,那我們就需要了解一個新的概念:工作區和暫存區
工作區(Working Directory):就是你在電腦裡能看到的目錄,比如我的Git2資料夾就是一個工作區:
版本庫(Repository):工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。
分支和HEAD的概念我們以後再講。
前面講了我們把檔案往Git版本庫裡新增的時候,是分兩步執行的:
第一步是用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
你可以簡單理解為,需要提交的檔案修改通通放到暫存區,然後,一次性提交暫存區的所有修改。
俗話說,實踐出真知。現在,我們再練習一遍,先對readme.txt做個修改,比如加上一行內容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
然後,在工作區新增一個LICENSE文字檔案(內容隨便寫)。
先用git status檢視一下狀態:
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: readme.txt
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# LICENSE
no changes added to commit (use "git add" and/or "git commit -a")
Git非常清楚地告訴我們,readme.txt被修改了,而LICENSE還從來沒有被新增過,所以它的狀態是Untracked。
現在,使用兩次命令git add,把readme.txt和LICENSE都新增後,用git status再檢視一下:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: LICENSE
# modified: readme.txt
#
現在,暫存區的狀態就變成這樣了:
所以,git add命令實際上就是把要提交的所有修改放到暫存區(Stage),然後,執行git commit就可以一次性把暫存區的所有修改提交到分支。
$ git commit -m "understand how stage works"
[master 27c9860] understand how stage works
2 files changed, 675 insertions(+)
create mode 100644 LICENSE
一旦提交後,如果你又沒有對工作區做任何修改,那麼工作區就是"乾淨"的:
$ git status
# On branch master
nothing to commit (working directory clean)
現在版本庫變成了這樣,暫存區就沒有任何內容了:
場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠端庫。
場景1:
場景2:
Git 檔案的刪除
如果被刪除的檔案已經被commit,我們只是從工作區間中將檔案刪除 (rm的命令,我們還能通過git checkout 的命令將檔案恢復到最新的版本)
如果被刪除的檔案已經被commit,我們從git區間去刪除檔案,(git rm file,被刪除的檔案將不能恢復)
Git建立遠端庫(關聯到GitHub)
第1步:建立SSH Key。在使用者主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個檔案,如果已經有了,可直接跳到下一步。如果沒有,開啟Shell(Windows下開啟Git Bash),建立SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把郵件地址換成你自己的郵件地址,然後一路回車,使用預設值即可,由於這個Key也不是用於軍事目的,所以也無需設定密碼。
如果一切順利的話,可以在使用者主目錄裡找到.ssh目錄,裡面有id_rsa和id_rsa.pub兩個檔案,這兩個就是SSH Key的祕鑰對,id_rsa是私鑰,不能洩露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
第2步:登陸GitHub,開啟"Account settings","SSH Keys"頁面:
然後,點"Add SSH Key",填上任意Title,在Key文字框裡貼上id_rsa.pub檔案的內容
要關聯一個遠端庫,使用命令git remote add origin git@server-name:path/repo-name.git;
關聯後,使用命令git push -u origin master第一次推送master分支的所有內容;
此後,每次本地提交後,只要有必要,就可以使用命令git push origin master推送最新修改;
分散式版本系統的最大好處之一是在本地工作完全不需要考慮遠端庫的存在,也就是有沒有聯網都可以正常工作,而SVN在沒有聯網的時候是拒絕幹活的!當有網路的時候,再把本地提交推送一下就完成了同步,真是太方便了!
從遠端倉庫克隆到本地倉庫
要克隆一個倉庫,首先必須知道倉庫的地址,然後使用git clone命令克隆。
Git支援多種協議,包括https,但通過ssh支援的原生git協議速度最快。
Git 分支的基本使用:
檢視分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
工作區是乾淨的,剛才的工作現場存到哪去了?用git stash list命令看看
修復bug時,我們會通過建立新的bug分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。