1. 程式人生 > >GIT使用教程與基本原理

GIT使用教程與基本原理

這個教程之前是發在社群網站上,現在把它轉到自己部落格上:)

說明:該教程全部圖片都來自於《pro git》。以下所有的操作,除非特別宣告,都是基於Linux終端來進行的。如果你發現這篇文章有錯誤,或者其他問題,歡迎與我聯絡:[email protected]

1、什麼是GIT

Git是一個強調速度的分散式版本控制軟體和原始碼管理系統(SCMsource code management)。Git最初是由Linus Torvalds為核心開發而設計的管理軟體。自從Git推出以來,已經被很多開源專案所採納。每一個Git工作目錄是一個帶有完全歷史記錄和版本資訊的倉庫,不依賴於網路和中央伺服器。

Git是一個免費的開源軟體,遵從GNU v2協議。

Git這個詞在英語中的原意是很笨拙,沒用的人。Linus自嘲說:“我是一個任性的笨蛋,所以我把我的所有的專案的名字都和我很相似。第一個是Linux,現在是Git。”Git的幫助文件中描述Git為:笨拙的內容跟蹤者(the stupid content tracker)。(翻譯自WIKI)

2、為什麼要用GIT

  • 更順暢的工作流程,開發過程中,完全可以離線操作
  • 快速,Git分散式架構使得本地倉庫包含所有的歷史版本資訊,你可以在不同的版本之間快速切換
  • 彈性的本地分支,在svn下,你建一個分支需要把原始碼複製到另外一個資料夾,而在Git下,建立分支的代價是非常小的,只需一條命令
  • 倉庫目錄結構簡潔,用Git複製一個專案,只會在專案根目錄建立一個.git的目錄,而其他目錄很乾淨
  • 內容按元資料方式儲存,所有的版本資訊都位於.git目錄下
  • 完整性好,更易於協作開發
  • 使用者群大,現在已經有成千上萬個開源專案採用Git來做專案管理,github上更是有無數個程式碼倉庫

3、GIT安裝與配置

a) 安裝

1.從原始碼安裝

在安裝之前,你必須保證以下幾個依賴包已經安裝在你的系統上:curl, zlib, openssl, expat, libiconv。如果你的系統是Ubuntu,你可以這樣安裝:

apt-get install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

當所有的依賴項已經解決,就可以從http://git-scm.com/download上下載Git的原始碼,然後編譯安裝,具體命令如下:

tar -zxf git-1.*.*.*.tar.gz

cd git-1.*.*

make prefix=/usr/local all

sudo make prefix=/usr/local install

2.在Linux上安裝

如果你的系統是Linux或者Fedora,你可以通過以下命令直接安裝Git

yum install git-core (fedora)

apt-get install git-core (ubuntu)

3.在Windows上安裝

儘管Git是發源於Linux,但現在Windows上也有能夠正常使用Git,只不過不支援中文,在Windows下所有的中文都顯示問號,另外還有一些功能上的BUG。所以建議還是在Linux上去使用Git,如果你不得不工作在Windows上,你可以到http://msysgit.github.com/上下載msysgit的最新版,安裝過程和其他Windows程式差不多,基本上點下一步就OK了。Msysgit預設會安裝git bashgit GUI這兩個程式,一般用git bash就可以了,它支援常用的命令。如果對Linux命令列不熟,你也可以用用git GUI,但功能有限制。

b) 第一次使用GIT

在你安裝好Git之後,你需要修改一些配置,才能正常使用Git

Git通過“git config”命令來配置Git,這個命令有2個選項:--system, --global, 加上預設選項,分別對應Git3級配置檔案。第一個是/etc/gitconfig檔案,和--system對應,這是全域性配置檔案,修改這個檔案,將會影響系統上所有的使用者,所有的倉庫。第二個是你家目錄下的/.gitconfig檔案,與--global對應,修改它會對你當前使用者的所有倉庫產生影響。第三個是你倉庫中的.git/.gitconfig檔案,這是“git config”預設修改的配置檔案,它只會對你當前倉庫產生影響。

在第一次使用Git時,你需要告訴你的協同開發者,你是誰以及你的郵箱,在你提交的時候,Git需要這兩個資訊。具體通過以下命令設定:

git config --global user.name “Test OSS”

當然你也可以不用--global選項,但這意味這你在每一個倉庫中都要這樣設定。

同時,你也可以指定你的編輯器,你的Diff工具:

git config --global core.editor vim

git config --global merge.tool vimdiff

你還可以通過”git config --list”命令來檢視你的設定。

當你把Git設定好之後,如果你要和從Git伺服器上獲得倉庫,或者向Git伺服器提交你的程式碼(比如github),你可能需要生成你自己的ssh金鑰對。Git支援4種與伺服器端通訊的協議:githttpsshhttps。其中git只是一個只讀協議,也就是說你只可以從伺服器端獲取倉庫,但是你不能提交你自己的程式碼。而httphttps用的很少,大部分都只支援ssh協議和Git協議。

當你通過ssh協議與遠端伺服器進行通訊的時候,你可以通過以下命令生成ssh金鑰對:

ssh-keygen -t rsa

如果你沒有指定金鑰名稱和存放路徑的話,它預設把兩個不對稱金鑰放在你的家目錄下的.ssh目錄下,金鑰檔案預設名稱為id_rsaid_rsa.pub,前者是私鑰,後者是公鑰。中間可能會要你設定訪問金鑰密碼,這個可以設,可以不設,但為了安全考慮,還是建議你設一個訪問密碼。否則,意味著任何持有你金鑰的人都可以使用該金鑰。

然後把你的公鑰發給Git倉庫管理員,然後你就可以通過ssh協議來訪問伺服器端,期間程式會自動進行金鑰對匹配,如果你設了訪問密碼,你可能需要輸入密碼。

這些設定完之後,你可以通過獲得任何一個公開的程式碼倉庫來檢測你的git是否工作正常。比如下面這個:

git clone git://git2.kernel.org/pub/scm/git/git.git

4、GIT倉庫

Git做為一個資源管理和跟蹤系統,如果想要把自己的檔案託管在Git上,那麼首先你得讓Git知道你需要管理的檔案在哪。比如說現在我有一個專案,它在test資料夾裡,我想讓Git管理這個專案,這個時候你需進入到這個目錄,然後執行“git init”命令。這個時候Git就會在該目錄下生成一個.git的隱藏目錄,Git用來進行版本控制和內容跟蹤的所有檔案都在該資料夾下。

處於git跟蹤下的檔案只具有三種狀態:

  • Modified(working directory):被修改過的檔案
  • Staged(staging area):通過git add新增到暫存區域的檔案
  • Committed(git directory):通過git commit提交到倉庫的檔案

所以,一般的git工作流程可能是這樣:修改過某些檔案,然後把這些檔案新增都暫緩區,再提交到倉庫中形成一個版本或快照,最後提交到git伺服器上。而在中間,可能伴隨著分支管理,分支切換,撤消與合併。

可能有些人會覺得很奇怪,為什麼git會有暫存區域這個概念,直接提交到倉庫中不就ok了。其實這是git為了做版本控制用的,試想如果沒有暫存區域,每修改一個檔案,就會形成一個版本,太過頻繁,不易於管理。暫存區域其實就是下一個版本的檔案清單,你可以自由控制該往倉庫中提交什麼檔案,這也可以避免在一個版本中包含一些中間檔案,比如編譯後的檔案。





5、GIT基本流程

1.初始化倉庫

初始化倉庫有兩種情況,一種是直接在一個空目錄裡建立一個專案,這時候你可以這樣幹:

git init

另一種是從其他機器複製一個倉庫,比如這樣:

git clone git://git2.kernel.org/pub/scm/git/git.git (遠端倉庫)

git clone https://github.com/jquery/jquery.git (遠端倉庫)

git clone [email protected]:wengpingbo/MicroBlog.git (遠端倉庫)

git clone /home/oss/test.git (本地倉庫)

第一次從伺服器上覆制一個倉庫,可能比較慢,因為git要把所有的歷史記錄和版本全部複製下來,這也算git的一個弊端吧!

複製完後,就會在當前目錄下生成一個工作目錄,名字以倉庫名字命名。如果你不想指定目錄,那就在上面的命令後加一個目錄就ok了。比如我想把test倉庫放到oss倉庫中:git clone /home/oss/test.git oss

之後,你就可以開始你的工作啦!

2.新增檔案

在編輯了幾個文件之後,你可能突然想起來,好像檔案還沒有讓git跟蹤。Git並不會實時的跟蹤你的檔案,只在你明確讓它記錄你的檔案時,它才會把指定的檔案的當前狀態記錄到倉庫中去,然後又撒手不管了。我想這就是說git笨的原因吧。這個時候,你需要手動新增你的檔案當暫存區域:

git add filename1 filename2

如果你懶得一個一個加,你可以試試這個:

git add -A

它會把當前目錄下所有的檔案都新增到暫存區域。

3.新增一個版本

在新增完檔案後,你可能覺得應該建立一個commit了。

git commit

怎麼樣?是不是有點不對勁,好像這個命令並沒有按你想象的那樣跳出一個提交成功的提示,而是直接跑到了你在配置中指定的編輯器中了。仔細看一下,原來是讓你給這個版本做一些備註,隨便寫點什麼,然後儲存退出就ok了。如果你不想這麼麻煩,可以這麼幹:

git commit -m ‘initial version’

可能你覺得之前講的太羅嗦了,提交一個commit還這麼麻煩,其實有一個捷徑可以使你跳過新增檔案這個過程:

git commit -a -m ‘initial version’

大功告成,這個命令會把之前所有的已經新增的檔案都加入到這個版本中。

可能你又有疑問了,之前新增的檔案不是自動會加入到下一個版本中嗎,問什麼還加這個-a引數?

其實git add命令只是把指定檔案的當前狀態新增到暫存區域,並不代表一個檔案一旦新增,就會一直存在每個版本中。如果你新增一個檔案後對這個又進行了修改,在你commit時候,只會commit這個檔案新增時的狀態,不會把之後的修改也commit進去,除非你再次新增。

4.推送變更

在你commit完之後,你可能想把自己的程式碼提交到github或者其他git伺服器上,與他人交流共享,這時候就需要和遠端伺服器打交道了。

如果你是在本地建立起的倉庫,預設情況下是沒有任何伺服器地址的,如果你是從其他伺服器複製過來的倉庫,這個伺服器地址會自動新增到你的倉庫中,你可以這樣檢視:

git remote -v

如果只輸入”git remote”,就只會列出伺服器端的別名,不會列出地址來。

一個倉庫可以有多個伺服器地址,這就意味著,你可以從不同的人手中複製同一個倉庫,但這並不會打亂你自己的分支,哪怕雙方的分支名字都一樣。假如你現在在和另外兩個人做同一個專案中的同一個分支,你發現A的一個模組正是你想要的,你想把他的程式碼合併到你現在的版本中,這時候你可以這樣做:

git remote add code_a git://url/test.git  //新增對方的地址,code_a是別名

git fetch code_a  //複製對方的倉庫到本地,但不合並,git pull會自動合併

git merge code_a/master //把對方master分支合併到自己當前版本下

合併完之後,你可能想提交你的程式碼到其他的伺服器上,這時候你可以先把要提交的伺服器地址新增進來,然後這樣做:

git push origin master

上面的命令就是把自己master的分支提交到名字為origin的伺服器上

5.建立並管理分支

在做專案的時候,你可能會想寫一些擴充套件性的功能,或者做一些小實驗,但是你又不想影響你現在的專案。這時候,你可以建立一個分支,然後在這個分支裡寫東西,當覺得不好的時候,你可以把這個分支刪除掉,對你之前的主分支沒有任何影響。或者你覺得這個新特性超出了自己的預想,可以合併到主分支裡,這時候你只要把工作轉回主分支,然後合併分支,最後刪除分支,然後就跟那個分支沒建立一樣。具體操作如下:

git branch test  //建立一個test分支

git checkout test  //轉到test分支

edit something...commit something...

git checkout master  //轉到master分支

git merge test  //合併test分支

git checkout -b test2  //建立test2分支,並轉到test2分支

git branch -d test //刪除test分支

git branch  //列出分支列表

git branch -v  //列出分支列表和當前commit

Git merge的實質是把兩個版本合在一起,然後在當前分支建立一個新的commit,如果你在兩個分支的同一個檔案的同一個地方都做了修改,這時候merge就會失敗,git就不會自動建立一個新的commit,而是直接停住。你需要手動修改這些衝突的檔案,選擇這兩個分支中的一個版本,或者自己重寫這個部分,然後手動新增這些檔案到暫存區域,再commit一下就ok了。要檢視哪些檔案衝突了,可以用”git status”檢視。

6.撤消改動

是人就會犯錯。當你執行某個命令之後,突然發現,自己寫錯了,或者漏了一個檔案,這時候怎麼辦?

如果你提交得太早,忘了新增某些檔案,你可以這樣做:

git commit -m ‘add something ’

git add file1

git commit --amend

最後一個命令會把你當前暫存區域最為上一次的commit。如果你commit以後,馬上amend,這時候git會直接跳到編輯commit備註裡面,這樣你可以修改你上次commit的備註。

如果你添加了不該新增的檔案,你可以這樣挽回:

git add . //把所有的檔案都新增進去

git reset HEAD readme  //readme檔案從暫存區域去除

如果你發現你編輯錯了一個檔案,你想把它恢復到上一個版本的狀態,這時候你可以這樣:

git checkout -- filename1 //只撤消這一個檔案

如果你覺得這個版本糟糕透了,想完全回滾到上一個版本,你可以幹如下事情:

git reset --hard HEAD^

HEAD是指向當前版本,^指當前版本的父版本,這個操作無法撤消。你可以把--hard換成--soft,這隻會回退commit資訊。還有一個--mixed預設選項,大家可以參考官方文件,檢視這3個選項的具體區別。

6、GIT常用命令

Git add

Git clone

Git commit

Git push

Git checkout

Git reset

Git pull

Git status

Git branch

//advanced

Git tag

Git log

Git merge

7、學習GIT相關資料

相關推薦

Git使用教程基本原理和Sourcetree基本使用探微

什麼是GIT Git是一個強調速度的分散式版本控制軟體和原始碼管理系統(SCM,source code management)。Git最初是由Linus Torvalds為核心開發而設計的管理軟體。自從Git推出以來,已經被很多開源專案所採納。每一個Git工作目錄是一個

GIT使用教程基本原理

這個教程之前是發在社群網站上,現在把它轉到自己部落格上:) 說明:該教程全部圖片都來自於《pro git》。以下所有的操作,除非特別宣告,都是基於Linux終端來進行的。如果你發現這篇文章有錯誤,或者其他問題,歡迎與我聯絡:[email protected] 1

Linux實戰教學筆記01:計算機硬體組成基本原理

標籤(空格分隔): Linux實戰教學筆記 第1章 如何學習Linu 要想學好任何一門學問,不僅要眼睛看,耳朵聽,還要動手記,勤思考,多交流甚至嘗試著去教會別人。 第2章 伺服器 2.1 運維的基本職責: 網站的資料不能丟 網站7*24小時執行

GIT概述基本命令

一 GIT體系概述 GIT是企業開發過程中必不可少的版本管理系統。 還有另外一個比較熱門的同樣開源免費的版本管理工具SVN,比起GIT,SVN唯一的優勢也就是操作簡單了,其他方面都是被碾壓的狀態。 1、儲存方式 GIT把內容按元資料方式儲存類似k/v資料庫,而SVN是按檔案(新版

git安裝基本命令

一、前言   GibHub的名字源於Git,Git是一個分散式版本控制系統,讓程式設計師團隊能夠協作開發專案,Git幫助大家管理為專案所做的工作,避免一個人所做的修改影響其他人所做的修改。你在專案中實現一個新功能的時候,Git將跟蹤你對每個檔案所做的修改。確定程式碼可行後,你將提交所做的修改,而Git將記錄專

數字影象處理(一)概論基本原理

概論 數字影象處理是指將影象訊號轉換成數字訊號並利用計算機對其進行處理的過程。而人眼觀察外界世界是先通過人眼將看到的內容傳入大腦來進行處理。二者雖然看上去不同,但其實際過程十分相似。人的眼球可以比作一架活的照相機。照相機有鏡頭、光圈、暗箱、底片和調節裝置。人眼的結構和照相

資料庫連線池的作用基本原理

1. 基本原理:在內部物件池中,維護一定數量的資料庫連線,並對外暴露資料庫連線的獲取和返回方法。 如外部使用者可通過getConnection方法獲取資料庫連線,使用完畢後再通過releaseConnection方法將連線返回,注意此時的連線並沒有關閉,而是由連線池管理器回

深度學習:反向傳播基本原理

我們要證明得是這四個公式 有了這個四個公式,我們得反響傳播就可以遞推得到。 BP1公式: 這個是輸出層誤差方程,這個方程好像沒啥好說的 BP2公式 從這個公式我們可以通過高階層的誤差,

二、Git入門基本使用(2)

tty 個人 進制 mar reset rip directory remote tor 6、給文件重命名的簡便方法 使用: git move 命令可以給暫存區中的文件重命名 $ git mv first.txt first.md $ git status On bran

三、Git入門基本使用(3)

hang roc rebase change cti http 直接 out watermark 11、分離頭指針情況下的註意事項 所謂分離頭指針,即在git切換到某一commit時,沒有綁定在分支或者tag上,此時如果在該commit下進行了文件修改,並且提交c

四、Git入門基本使用(4)

沒有 object mod second osi type mark apply save 16、把連續的多個commit整理成1個 commit ce587039661c88fd508035fd103a012e33c057ac (HEAD -> temp) Auth

哈希(Hash)加密(Encrypt)的基本原理、區別及工程應用

class 區別 自己 裏的 lpad returns .net 角度 table 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論

防盜鏈的基本原理實現

rec eal limit ole 站點 new exceptio stub text 1. 我的實現防盜鏈的做法,也是參考該位前輩的文章。基本原理就是就是一句話:通過判斷request請求頭的refer是否來源於本站。(當然請求頭是來自於客戶端的,是可偽造的,暫不在本文

【轉】哈希(Hash)加密(Encrypt)的基本原理、區別及工程應用

phy 理論 靈活運用 十分 實際應用 廣泛 tle 多網站 net 0、摘要 今天看到吉日嘎拉的一篇關於管理軟件中信息加密和安全的文章,感覺非常有實際意義。文中作者從實踐經驗出發,討論了信息管理軟件中如何通過哈希和加密進行數據保護。但是從文章評論中也可以

交換機的基本原理配置

mac地址 console 以太網幀 securecrt 楊書凡 交換機工作在數據鏈路層,負責網絡相鄰節點之間的數據通信,並進行流量控制,主要通過幀在對等層間數據傳輸。在物理線路上提供可靠的數據傳輸,對網絡層而言為一條無差錯的線路。 MAC地址 計算機聯網的必備硬件是網卡,每

路由器的基本原理配置命令(靜態路由和默認路由)

路由技術 路由表 route命令 路由環路 楊書凡 路由器工作在OSI參考模型的網絡層,它的重要作用是為數據包選擇最佳路徑,最終送達目的地。那麽路由器是怎樣選擇路徑的呢?如果主機A要和主機B通信,就需要一種方法判斷源主機和目標主機所經過的最佳路徑,從而進行數據轉發,這就是路由技術。

微信公眾平臺開發教程(二) 基本原理及消息接口

username 普通用戶 縮放 地理位置 cfb 位置 註意 獲得 基本 一、基本原理 在開始做之前,大家可能對這個很感興趣,但是又比較茫然。是不是很復雜?很難學啊? 其實恰恰相反,很簡單。為了打消大家的顧慮,先簡單介紹了微信公眾平臺的基本原理。 微信服務器就相當於一個轉

Git 教程(三):倉庫分支

ide 不但 clas version span 右上角 director discard pre 遠程倉庫 到目前為止,我們已經掌握了如何在Git倉庫裏對一個文件進行時光穿梭,你再也不用擔心文件備份或者丟失的問題了。 可是有用過集中式版本控制系統SVN的童鞋會站出來說,這

【網絡爬蟲入門02】HTTP客戶端庫Requests的基本原理基礎應用

多應用 多服務器 技術學 用戶 iis unicode licensed content sed 【網絡爬蟲入門02】HTTP客戶端庫Requests的基本原理與基礎應用 廣東職業技術學院 歐浩源 1、引言 實現網絡爬蟲的第一步就是要建立網絡連接並向服務器或網頁等

docker第一天:docker的基本原理安裝

原理 docker安裝 Docker官網:www.docker.com 一、docker是虛擬機嗎?不是,很多人在剛開始接觸docker的時候往往會進入一個誤區,其實docker≠VM 圖(一)在兩者的原理圖中不難看出,虛擬機運行多個應用時,如圖(一)所示:Serv