git學習筆記(一):初識

樓主以前一直使用的是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 分支號 提交到遠程倉庫

  • 705449c9-8241-3a44-9e89-248f634536f0-thumb.png
  • 大小: 10.2 KB
  • 3a951274-5362-3353-b896-a17b42731cc5-thumb.png
  • 大小: 4.4 KB
  • 9c775c1f-e721-3297-b474-42385faf6d08-thumb.png
  • 大小: 19.7 KB
  • e5ceb941-f946-3402-8698-e0b8e69bcd83-thumb.png
  • 大小: 4.7 KB
  • 34c7ccbd-c517-3189-b0fd-53eadcc4bf61-thumb.png
  • 大小: 3.3 KB
  • d4fa489f-89d0-3c83-b5e6-1a0b909b581a-thumb.png
  • 大小: 6.7 KB
  • 3b229a7b-4bcd-37be-8d27-0cab5de82fce-thumb.png
  • 大小: 7.4 KB
  • 732ae227-eb2e-3629-ba23-01cefbed4da6-thumb.png
  • 大小: 5.8 KB
  • 6a39c01a-fd25-36e9-853b-c7915f5e8420-thumb.png
  • 大小: 7.1 KB
  • 47d05284-d2bf-3c81-9aa3-39a6d12f1b67-thumb.png
  • 大小: 14.9 KB
  • e5e1f4b1-5f66-30a5-8f09-597b22fd1276-thumb.png
  • 大小: 29 KB
  • 99b2ba09-66b6-393b-afa9-f0412024836d-thumb.png
  • 大小: 18.3 KB
  • 71be6702-f815-3c0a-a4a6-ad749440377c-thumb.png
  • 大小: 34.9 KB
  • dae1bf5d-bc08-3dd8-b9d9-aec5d1231a89-thumb.png
  • 大小: 20.1 KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章