git基础指南
git基礎(chǔ)指南
@(OTHERS)[others, git]
- git基礎(chǔ)指南
- 一基本原理
- 一概述
- 二git文件的三種狀態(tài)
- 二基本操作
- 一取得項目的Git 倉庫
- 1從當(dāng)前目錄初始化
- 從現(xiàn)有倉庫克隆
- 二提交代碼
- 三遠(yuǎn)程倉庫
- 1查看當(dāng)前的遠(yuǎn)程庫
- 2添加遠(yuǎn)程倉庫從遠(yuǎn)程倉庫抓取數(shù)據(jù)
- 3推送數(shù)據(jù)到遠(yuǎn)程倉庫
- 4查看遠(yuǎn)程倉庫信息
- 5遠(yuǎn)程倉庫的刪除和重命名
- 四查看提交歷史
- 一取得項目的Git 倉庫
- 三常用操作
- 一參與開源項目
- 二gitlab項目
- 三將現(xiàn)有代碼上傳
- 三常用分支操作
- 查看所有分支
- 創(chuàng)建本地新的dev分支
- 發(fā)布dev分支
- 在dev分支開發(fā)代碼
- 刪除分支
- 6checkout某一個歷史版本
注:git有很完善的官方文檔,同時有中文版,但版本較舊。
一、基本原理
(一)概述
1、在分布式的版本控制系統(tǒng)中,諸如Git,Mercurial,Bazaar 還有Darcs 等,客戶端并不只提取最新版本的文件快照,而是把原始的代碼倉庫完整地鏡像下來。這么一來,任何一處協(xié)同工作用的服務(wù)器發(fā)生故障,事后都可以用任何一個鏡像出來的本地倉庫恢復(fù)。因為每一次的提取操作,實際上都是一次對代碼倉庫的完整備份。
2、Git 并不保存這些前后變化的差異數(shù)據(jù)。實際上,Git 更像是把變化的文件作快照后,記錄在一個微型的文件系統(tǒng)中。每次提交更新時,它會縱覽一遍所有文件的指紋信息并對文件作一快照,然后保存一個指向這次快照的索引。為提高性能,若文件沒有變化,Git 不會再次保存,而只對上次保存的快照作一連接。
3、在Git 中的絕大多數(shù)操作都只需要訪問本地文件和資源,不用連網(wǎng)。但如果用CVCS 的話,差不多所有操作都需要連接網(wǎng)絡(luò)。因為Git 在本地磁盤上就保存著所有有關(guān)當(dāng)前項目的歷史更新,所以處理起來速度飛快。
(二)git文件的三種狀態(tài)
對于任何一個文件,在Git 內(nèi)都只有三種狀態(tài):已修改(modified),已暫存(staged)和已提交(committed)。已修改表示修改了某個文件,但還沒有提交保存;已暫存表示把已修改的文件放在下次提交時要保存的清單中;已提交表示該文件已經(jīng)被安全地保存在本地數(shù)據(jù)庫中了。
由此我們看到Git 管理項目時,文件流轉(zhuǎn)的三個工作區(qū)域:Git 的本地數(shù)據(jù)目錄,工作
目錄以及暫存區(qū)域。
每個項目都有一個git 目錄,它是Git 用來保存元數(shù)據(jù)和對象數(shù)據(jù)庫的地方。該目錄非
常重要,每次克隆鏡像倉庫的時候,實際拷貝的就是這個目錄里面的數(shù)據(jù)。
從項目中取出某個版本的所有文件和目錄,用以開始后續(xù)工作的叫做工作目錄。這些文件實際上都是從git 目錄中的壓縮對象數(shù)據(jù)庫中提取出來的,接下來就可以在工作目錄中對這些文件進(jìn)行編輯。
所謂的暫存區(qū)域只不過是個簡單的文件,一般都放在git 目錄中。有時候人們會把這個
文件叫做索引文件,不過標(biāo)準(zhǔn)說法還是叫暫存區(qū)域。
基本的Git 工作流程如下所示:
1. 在工作目錄中修改某些文件。(git clone后修改文件)
2. 對這些修改了的文件作快照,并保存到暫存區(qū)域。(git add)
3. 提交更新,將保存在暫存區(qū)域的文件快照轉(zhuǎn)儲到git 目錄中。(git commit)
所以,我們可以從文件所處的位置來判斷狀態(tài):如果是git 目錄中保存著的特定版本文
件,就屬于已提交狀態(tài);如果作了修改并已放入暫存區(qū)域,就屬于已暫存狀態(tài);如果自上次取出后,作了修改但還沒有放到暫存區(qū)域,就是已修改狀態(tài)。
二、基本操作
(一)取得項目的Git 倉庫
有兩種取得Git 項目倉庫的方法。第一種是在現(xiàn)存的目錄下,通過導(dǎo)入所有文件來創(chuàng)建
新的Git 倉庫。第二種是從已有的Git 倉庫克隆出一個新的鏡像倉庫來。
1、從當(dāng)前目錄初始化
要對現(xiàn)有的某個項目開始用Git 管理,只需到此項目所在的目錄,執(zhí)行:
$ git init初始化后,在當(dāng)前目錄下會出現(xiàn)一個名為.git 的目錄,所有Git 需要的數(shù)據(jù)和資源都
存放在這個目錄中。不過目前,僅僅是按照既有的結(jié)構(gòu)框架初始化好了里邊所有的文件和目錄,但我們還沒有開始跟蹤管理項目中的任何一個文件。
如果當(dāng)前目錄下有幾個文件想要納入版本控制,需要先用git add 命令告訴Git 開始對
這些文件進(jìn)行跟蹤,然后提交:
現(xiàn)在,你已經(jīng)得到了一個實際維護(hù)著若干文件的Git 倉庫。
2 從現(xiàn)有倉庫克隆
如果想對某個開源項目出一份力,可以先把該項目的Git 倉庫復(fù)制一份出來,這就需要
用到git clone 命令。如果你熟悉其他的VCS 比如Subversion,你可能已經(jīng)注意到這里
使用的是clone 而不是checkout。這是個非常重要的差別,Git 收取的是項目歷史的所有
數(shù)據(jù)(每一個文件的每一個版本),服務(wù)器上有的數(shù)據(jù)克隆之后本地也都有了。實際上,即便服務(wù)器的磁盤發(fā)生故障,用任何一個克隆出來的客戶端都可以重建服務(wù)器上的倉庫,回到當(dāng)初克隆時的狀態(tài)。
克隆倉庫的命令格式為git clone [url]。比如,要克隆Ruby 語言的Git 代碼倉庫
Grit,可以用下面的命令:
這會在當(dāng)前目錄下創(chuàng)建一個名為“grit” 的目錄,其中內(nèi)含一個.git 的目錄,并從同
步后的倉庫中拉出所有的數(shù)據(jù),取出最新版本的文件拷貝。如果進(jìn)入這個新建的grit 目
錄,你會看到項目中的所有文件已經(jīng)在里邊了,準(zhǔn)備好后續(xù)的開發(fā)和使用。如果希望在克隆的時候,自己定義要新建的項目目錄名稱,可以在上面的命令最后指定:
唯一的差別就是,現(xiàn)在新建的目錄成了mygrit,其他的都和上邊的一樣。
Git 支持許多數(shù)據(jù)傳輸協(xié)議。之前的例子使用的是git:// 協(xié)議,不過你也可以用
http(s):// 或者user@server:/path.git 表示的SSH 傳輸協(xié)議。
(二)提交代碼
1、檢查當(dāng)前狀態(tài)
git status2、跟蹤新文件或者暫存文件
git add .暫存這次更新,需要運行g(shù)it add 命令(這是個多功能命令,根據(jù)目標(biāo)文件的狀態(tài)不同,此命令的效果也不同:可以用它開始跟蹤新文件,或者把已跟蹤的文件放到暫存區(qū),還能用于合并時把有沖突的文件標(biāo)記為已解決狀態(tài)等)。
3、忽略某些文件
創(chuàng)建.gitignore文件
4、查看差異
git diff此命令比較的是工作目錄中當(dāng)前文件和暫存區(qū)域快照之間的差異,也就是修改之后還沒有暫存起來的變化內(nèi)容。
若要看已經(jīng)暫存起來的文件和上次提交時的快照之間的差異,可以用
命令。(Git 1.6.1 及更高版本還允許使用git diff –staged,效果是相同的,但更好記
些。)
5、提交
git commit -m "comment"這個代碼就被提交到本地倉庫了。
6、刪除文件
git rm *.txt(三)遠(yuǎn)程倉庫
1、查看當(dāng)前的遠(yuǎn)程庫
git remote git remote -v一般默認(rèn)的遠(yuǎn)程倉庫命名為origin,默認(rèn)的分支名稱為master。
2、添加遠(yuǎn)程倉庫&從遠(yuǎn)程倉庫抓取數(shù)據(jù)
$ git remote origin $ git remote add pb git://github.com/paulboone/ticgit.git $ git remote -v $ git fetch pb如果是克隆了一個倉庫,此命令會自動將遠(yuǎn)程倉庫歸于origin 名下。所以,git fetch
origin 會抓取從你上次克隆以來別人上傳到此遠(yuǎn)程倉庫中的所有更新(或是上次fetch 以
來別人提交的更新)。有一點很重要,需要記住,fetch 命令只是將遠(yuǎn)端的數(shù)據(jù)拉到本地倉庫,并不自動合并到當(dāng)前工作分支,只有當(dāng)你確實準(zhǔn)備好了,才能手工合并。
如果設(shè)置了某個分支用于跟蹤某個遠(yuǎn)端倉庫的分支(參見下節(jié)及第三章的內(nèi)容),可以使用git pull 命令自動抓取數(shù)據(jù)下來,然后將遠(yuǎn)端分支自動合并到本地倉庫中當(dāng)前分支。在日常工作中我們經(jīng)常這么用,既快且好。實際上,默認(rèn)情況下git clone 命令本質(zhì)上就是自動創(chuàng)建了本地的master 分支用于跟蹤遠(yuǎn)程倉庫中的master 分支(假設(shè)遠(yuǎn)程倉庫確實有master 分支)。所以一般我們運行g(shù)it pull,目的都是要從原始克隆的遠(yuǎn)端倉庫中抓取數(shù)據(jù)后,合并到工作目錄中當(dāng)前分支。
3、推送數(shù)據(jù)到遠(yuǎn)程倉庫
項目進(jìn)行到一個階段,要同別人分享目前的成果,可以將本地倉庫中的數(shù)據(jù)推送到遠(yuǎn)程
倉庫。實現(xiàn)這個任務(wù)的命令很簡單: git push [remote-name] [branch-name]。如果要把本地的master 分支推送到origin 服務(wù)器上(再次說明下,克隆操作會自動使用默認(rèn)的
master 和origin 名字),可以運行下面的命令:
4、查看遠(yuǎn)程倉庫信息
我們可以通過命令git remote show [remote-name] 查看某個遠(yuǎn)程倉庫的詳細(xì)信息,比
如要看所克隆的origin 倉庫,可以運行:
5、遠(yuǎn)程倉庫的刪除和重命名
$ git remote rename pb paul $ git remote rm paul(四)查看提交歷史
1、git log可以查看基本的信息,如
$ git log commit 49d14429375bf9b4be29be603eaa22e6287ce1de Author: jinhong-lu <lu_Jin_hong@163.com> Date: Tue Oct 13 17:33:18 2015 +0800testcommit d79066da60cd1a6721acc0ea3336b4b8a84f85be Author: jinhong-lu <lu_Jin_hong@163.com> Date: Tue Oct 13 14:12:32 2015 +0800new默認(rèn)不用任何參數(shù)的話,git log 會按提交時間列出所有的更新,最近的更新排在最上
面。看到了嗎,每次更新都有一個SHA-1 校驗和、作者的名字和電子郵件地址、提交時
間,最后縮進(jìn)一個段落顯示提交說明。
git log 有許多選項可以幫助你搜尋感興趣的提交,接下來我們介紹些最常用的。
2、git log –p -2
git log 有許多選項可以幫助你搜尋感興趣的提交,接下來我們介紹些最常用的。
我們常用-p 選項展開顯示每次提交的內(nèi)容差異,用-2 則僅顯示最近的兩次更新.
在做代碼審查,或者要快速瀏覽其他協(xié)作者提交的更新都作了哪些改動時,就可以用這個選項。
3、git log –stat,僅顯示簡要的增改行數(shù)統(tǒng)計
4、指定log的格式
git log --pretty=format:"%h - %an, %ar : %s" ca82a6d - Scott Chacon, 11 months ago : changed the verison number 085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code a11bef0 - Scott Chacon, 11 months ago : first commit5、完整選項:
選項說明 -p 按補丁格式顯示每個更新之間的差異。 --stat 顯示每次更新的文件修改統(tǒng)計信息。 --shortstat 只顯示--stat 中最后的行數(shù)修改添加移除統(tǒng)計。 --name-only 僅在提交信息后顯示已修改的文件清單。 --name-status 顯示新增、修改、刪除的文件清單。 --abbrev-commit 僅顯示SHA-1 的前幾個字符,而非所有的40 個字符。 --relative-date 使用較短的相對時間顯示(比如,“2 weeks ago”)。 --graph 顯示ASCII 圖形表示的分支合并歷史。 --pretty 使用其他格式顯示歷史提交信息。可用的選項包括oneline,short,full,fuller 和format(后跟指定格式)。詳見官方文檔。
三、常用操作
(一)參與開源項目
$git clone https://github.com/lujinhong/dao.git $vi pom.xml $git add . $git commit -m "change version" [master 8ed26de] change version1 file changed, 1 insertion(+), 1 deletion(-) $ git push origin master(二)gitlab項目
1、在web頁面上創(chuàng)建一個項目并取得URL
2、git clone后操作如同上面
其實更好的辦法是使用IDE。
(三)將現(xiàn)有代碼上傳
git init git remote add origin ssh://git@192.168.1.1:22/ljhn1829/lujinhong.git git add . git commit -m 'new' git push origin master或者也可以clone以后再將當(dāng)前代碼add進(jìn)來,然后push。
(三)常用分支操作
1. 查看所有分支
git branch --all # 默認(rèn)只有master分支,所以會看到如下兩個分支 # master[本地主分支] origin/master[遠(yuǎn)程主分支] # 新克隆下來的代碼默認(rèn)master和origin/master是關(guān)聯(lián)的,也就是他們的代碼保持同步2. 創(chuàng)建本地新的dev分支
git branch dev # 創(chuàng)建本地分支 git branch # 查看分支 # 這是會看到master和dev,而且master上會有一個星號 # 這個時候dev是一個本地分支,遠(yuǎn)程倉庫不知道它的存在 # 本地分支可以不同步到遠(yuǎn)程倉庫,我們可以在dev開發(fā),然后merge到master,使用master同步代碼,當(dāng)然也可以同步3. 發(fā)布dev分支
發(fā)布dev分支指的是同步dev分支的代碼到遠(yuǎn)程服務(wù)器
git push origin dev:dev # 這樣遠(yuǎn)程倉庫也有一個dev分支了4. 在dev分支開發(fā)代碼
git checkout dev # 切換到dev分支進(jìn)行開發(fā) # 開發(fā)代碼之后,我們有兩個選擇 # 第一個:如果功能開發(fā)完成了,可以合并主分支 git checkout master # 切換到主分支 git merge dev # 把dev分支的更改和master合并 git push # 提交主分支代碼遠(yuǎn)程 git checkout dev # 切換到dev遠(yuǎn)程分支 git push # 提交dev分支到遠(yuǎn)程 # 第二個:如果功能沒有完成,可以直接推送 git push # 提交到dev遠(yuǎn)程分支 # 注意:在分支切換之前最好先commit全部的改變,除非你真的知道自己在做什么5. 刪除分支
git push origin :dev # 刪除遠(yuǎn)程dev分支,危險命令哦 # 下面兩條是刪除本地分支 git checkout master # 切換到master分支 git branch -d dev # 刪除本地dev分支6、checkout某一個歷史版本
git log git checkout -b redis2 a8e55ff906b3917dcd0125f497fa009f49b6c3b2將a8e55ff906b3917dcd0125f497fa009f49b6c3b2這個歷史commit checkout到一個新的branch redis2。
總結(jié)
- 上一篇: storm hook的使用
- 下一篇: spark之4:基础指南(源自官方文档)