樓主以前一直使用的是SVN,沒接觸過git,但最近項目有用到,還是整理下吧~
1、什麼是git?
Git是一款免費、開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。Git是一個開源的分佈式版本控制系統,可以有效、高速的處理從很小到非常大的項目版本管理。
比較常見的版本管理工具比如SVN,比較不同的是SVN屬於集中式的版本控制系統,而git則屬於分佈式版本控制系統。集中式版本控制系統必須聯網才能工作,即必須連接上“中央服務器”,每個人開發的版本的提交到這臺“中央服務器”;而分佈式版本控制系統則不是,每個節點有自己的本地倉庫。
簡單來說,git和SVN的區別如下:
這兩個工具主要的區別在於歷史版本維護的位置:
Git本地倉庫包含代碼庫還有歷史庫,在本地的環境開發就可以記錄歷史
而SVN的歷史庫存在於中央倉庫,每次對比與提交代碼都必須連接到中央倉庫才能進行
這樣的好處在於:
1)、自己可以在脫機環境查看開發的版本歷史
2)、多人開發時如果充當中央倉庫的Git倉庫掛了,任何一個開發者的倉庫都可以作爲中央倉庫進行服務
(不過開發者倉庫一般不直接充當中央庫,但你可以隨時創建一個新的中央庫然後同步就立刻恢復了中央庫)
git的“中央倉庫”跟每個人的倉庫是一摸一樣的,僅僅用於方便交換修改。
2、安裝git
安裝完畢以後,在桌面右鍵Git Bash就可以進入git的操作界面,是Linux風格的。
我們需要做以下初始化的工作。也可以叫做“自報家門”:
git config --global user.name "your name" 告訴git你的用戶名
git config --global user.email "your email" 告訴git你的郵箱
(注意git config命令的--global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。)
3、git中的幾個重要概念
(PS:圖是盜的)
工作目錄:即存放本地代碼的目錄,比如eclipse的workspace,就是我們執行git命令所在的目錄;
暫存區:可以理解成一個"提交任務".Git暫存區是Git最成功的設計之一,暫存區是一個介於工作區和版本庫的中間狀態.當執行提交的時候,實際上是將暫存區的內容提交到版本庫中.
本地倉庫:我們將需要進行版本控制的文件目錄叫做一個倉庫(repository),每個倉庫可以簡單理解成一個目錄,這個目錄裏面的所有文件都通過Git來實現版本管理,Git都能跟蹤並記錄在該目錄中發生的所有更新。這個倉庫是存在在每個開發人員的本地的;
遠程倉庫:這個很好理解,位於“中央服務器”,是我們做好工作後最終推送版本的倉庫。
4、創建版本庫(repository)
1)創建一個git的版本庫目錄,如在F盤新建一個HelloGit的目錄;
2)在該目錄下,運行:git init 會生成一個.git的隱藏目錄
該隱藏目錄就類似SVN中的.svn目錄。此後該目錄下所有的文件都能被git管理,我們用的所有命令也都是在這個目錄下了~
3)測試:在該目錄下建一個文本文件,如README.txt
4)把新建的文件納入版本庫管理:git add README.txt
5)嘗試提交README.txt並加註釋:git commit -m "你自己的註釋內容"——提交到本地倉庫
注:git add可以運行多次加多個文件,(也可以用git add .),然後再一次性git commit
5、文件的增、改、刪和git status的緊密關係
說白了,我們用版本控制系統無非是針對文件的“增、改、刪”來打轉!而且對於git而言,這些視作“修改”,git管理的是修改。
這個命令絕對是git中最實用,使用最頻繁的命令。運用它我們可以查看目前的版本狀態。下面我們從文件操作的角度來查看不同時刻運行改命令的效果,可以代入我們平常對代碼的操作來理解~
1)增:新建了一個文件以後,用git status命令,可以看到如下顯示結果:
注意輸出是"Untracked files",顧名思義是“未被跟蹤的文件”,而且文件名是“紅色”的。根據上面講到的“暫存區”概念,我們再用命令git add hello.txt 把這個"Untracked file"加入到暫存區,再用git status來查看:
此時文件名變成綠色的,接下來我們再從暫存區中提交它:git commit -m "註釋內容" hello.txt,注意此時提交的是由暫存區->本地倉庫,還沒到遠程倉庫。
再運行git status命令,可以看到:
可以看到“nothing to commit, working directory clean”的提示,這表明已經提交成功了。
小結下以上在本地庫新建一個文件到提交到本地倉庫的流程:工作目錄new一個文件->add到暫存區->commit到本地倉庫。
2)改:修改一個文件
我們不妨對hello.txt文件進行修改,然後用git status命令查看狀態:modified: hello.txt(注意此時文件被標上紅色了):
這裏再插播一個命令:git diff——用於查看文件在工作區 和暫存區的具體區別:
把修改後的文件加入到暫存區後,運行git status可以看到:
同時,用git diff可以看到工作區和暫存區沒什麼差了。。
但是,再插播一個命令:git diff --cached——用於查看暫存區和本地倉庫的區別,運行該命令,可以看到:
然後我們再commit,再用git status和git diff、git diff --cached看看:
可見修改已被提交到本地倉庫中,暫存區和本地倉庫當中也沒差了。
3)刪:刪除一個文件
刪除本地一個文件以後,我們同樣走工作區->add到暫存區->commit的流程:
用git status可以看到被刪除文件的不同時刻的狀態。
(關於刪除的恢復等會在後面的部分講到~)
小結:本部分從三種常見的操作來認識git status命令的強大作用。以及涉及到了git diff和git diff --cached命令,如下:
用git commmit -m "註釋內容"將暫存區的文件提交到當前分支~,再用git status來查看。此時暫存區就沒有文件了。
git diff #是工作區(work dict)和暫存區(stage)的比較,在修改後未git add操作時,這個會有內容,而git diff --cached沒內容
git diff --cached #是暫存區(stage)和分支(master)的比較,
git diff HEAD 文件名 #是工作區和版本庫(本地倉庫)中的比較。
在修改並git add後,git diff沒內容但是,git diff --cached會有內容~~~,只有當git add ->git commit操作之後,git diff --cached纔沒內容!
6、版本回退
寫代碼的時候,你常常會提交後發現是一個失誤,或者說誤刪等等操作。這就需要回到“上一個版本”,本部分就是爲了探討版本的回退問題。
首先,我們肯定會對一個文件進行多次修改提交,如何看到自己提交的歷史呢?這就需要我們用到git log或git log --pretty=oneline(簡化模式)來看,如:
注意到每個commit後面會跟一個字符串,這個字符串就是用來標識該次提交的,可以理解爲commit id。commit id是版本回退的依據和核心。
在git中,我們用HEAD來表示當前版本,HEAD^表示上一個版本,HEAD^^則表示上上一個版本(當然不能無限延伸下去,最主要還是靠commit id啦~)
1)想要回到上一個版本:git reset --hard HEAD^
2)想要回到之前某一個版本:git reset --hard 311dd6b9(只需commit id的前幾位);
3)假如後悔回退了版本,想要回到“未來”:git reflog 查看之前所有的歷史提交,再用命令git reset commitid
注:版本的回退都是針對“提交而言”,所以要注意以下場景:
修改了2個文件,但只提交了一個其中1個文件,另1個並沒有提交,那麼用git reset --hard HEAD^後,2個文件都會回到之前的狀態,雖說另一個文件並沒有被提交!簡言之,reset是回到指定的提交狀態,此次不管文件的修改提交與否,都會回到“上一次”(或者說指定某一次)時的提交狀態!聽起來超無辜的,因爲那些修改後沒被提交的文件的修改也作廢了。
說到這,不得不再次注意,commit是把“暫存區”的文件提交到“本地倉庫”!假如你對一個文件修改了2次,但只有其中一次被add了,如:第一次修改 -> git add -> 第二次修改 -> git commit
用git diff HEAD 文件名可以看到第二次修改並沒有被提交到版本庫當中。
只需記住:git commit永遠是針對“上一次”的add對象而言的,so,我們可以這樣:
第一次修改 -> git add -> 第二次修改 -> git add ->git commit 或是
第一次修改 -> 第二次修改 -> git add . ->git commit (加.表示所有被修改的文件!)
7、修改撤銷
前面有說,git管理的是“修改”——增、刪、改
1)修改的撤銷
我們常常會有這些情形:
情景一:修改了一個本地文件,還沒來得及add到緩存區,但是想撤銷,這好辦啊:這樣可以直接手動恢復到修改保存之前的狀態或使用:git checkout -- filename
情景二:修改了也add到暫存區了,不用擔心你還沒提交到版本庫呢!第一步:用git reset HEAD filename即可把提交到暫存區的修改“撤銷”,然後再用情景一的處理辦法處理;
情景三:加入到暫存區並提交到版本庫了,沒關係,參考版本回退部分即可~
2)增加的撤銷
這種情況比較少見,不過也不是沒有,針對已經添加到版本庫裏面的文件,用git rm filename即可把版本庫中的改文件刪掉,此時工作區的文件也會被刪除,這個過程是不可逆的。
3)刪除的撤銷
針對誤刪而言,因爲此時本地中被刪除了,但是版本庫(或暫存區)還幫我們保存着,用git checkout -- filename即可恢復誤刪的文件~
8、工作區和暫存區?
形象理解:貨架就像工作區,暫存區就像購物車,(沒到付款的時候你都不確定購物車裏的東西全部都是要的,每拿一件商品就付一次款,那才麻煩大了)。而本地倉庫就像收銀臺!將心儀商品放入購物車相當於add,結賬的過程相當於commit!
工作區:能看到的工作目錄,如自己創建的learngit目錄被git init命令執行過的。
版本庫:工作區裏面的隱藏目錄.git,就像SVN的隱藏目錄.svn一樣
暫存區:Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。
前面講了我們把文件往Git版本庫裏添加的時候,是分兩步執行的:
第一步是用git add把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支。
因爲我們創建Git版本庫時,Git自動爲我們創建了唯一一個master分支,所以,現在,git commit就是往master分支上提交更改。
你可以簡單理解爲,需要提交的文件修改通通放到暫存區,然後,一次性提交暫存區的所有修改。
============================常用命令========================================
git clone git@<ip>:<project_name> 從ip上克隆項目到本地庫
git checkout 分支號 選擇某個分支號,並基於它來操作 --克隆完以後再切換分支,才能被import到開發工具當中
git branch 查看當前分支
git branch -al 查所有分支
git pull origin 分支號 從某個分支號,先 git fetch 遠端的 branch,然後與本地的 branch 做 merge
git status 查看狀態
git add. 查看所有被修改或刪除文件的信息添加到索引庫(暫存區),做快照
git commit -m "註釋" 提交併添加註釋(可以指定想要提交的某個文件,沒指定的話代表需要提交所有暫存區裏面的文件)
git push origin 分支號 提交到遠程倉庫