小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Git筆記

 思考的軌跡 2012-02-16

Git筆記-基礎

2條評論?

Git是什么?

Git是一個分布式版本控制系統(tǒng)(Distributed Version Control System,簡稱 DVCS)。

Git與svn有什么關系?

對于大多數(shù)人而言,或許對svn更為熟悉,svn屬于集中化的版本控制系統(tǒng)( Centralized Version Control Systems,簡稱 CVCS ),在CVCS中會有一個對版本進行集中管理的服務器,協(xié)同工作的人都通過客戶端連接到該服務器,檢出最新文件或提交更新。CVCS在協(xié)同開發(fā)中有兩個比較主要的缺點:

  1. 如遇服務器宕機,整個協(xié)同工作無法進行,因為此時無法進行代碼更新提交,當然也不能checkout最新代碼
  2. 如果服務器數(shù)據(jù)丟失,整個版本數(shù)據(jù)也將丟失,除非刻意為版本管理服務器備份

對于這兩個主要問題,DVCS都有比較好的解決方案:

首先,DVCS可以方便地在本地進行版本管理,就如同在你本地有一個版本管理服務器一樣。你可以選擇在合適的時候將本地版本推送到統(tǒng)一的版本管理服務器。

其次,DVCS每次都會提取整個代碼倉庫的完整鏡像,即相當于對整個代碼倉庫進行了一次備份。這樣即使版本管理服務器出現(xiàn)意外,也可以輕松地采用任一本地倉庫恢復。結合本地版本管理功能,在遠程版本管理服務器出現(xiàn)故障的情況下,你依然可以放心的進行工作,當遠程服務器恢復工作時,再提交你的本地版本。

直接記錄快照,而非差異比較

Git只關心文件數(shù)據(jù)的整體是否發(fā)生變化,而大多數(shù)其他系統(tǒng)則關心文件內容的具體差異,并記錄這些差異。git則是更像一個微型文件系統(tǒng),保存更新文件的快照,并為之創(chuàng)建一個索引。

CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內容

CVS,Subversion,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內容

Git 保存每次更新時的文件快照

Git 保存每次更新時的文件快照

如何開始?

你需要安裝一個Git客戶端來開始使用Git,你可以使用msysgit作為你windows上的git客戶端,msysgit包含一個命令行工具Git Bash和一個gui工具Git GUI。對于習慣TortoiseSVN的同學來說,或許Git GUI太簡陋了,沒關系,安裝完msysgit后你依然可以安裝TortoiseGit,實現(xiàn)svn到git的平滑過渡。TortoiseGit不單獨介紹,本文主要介紹通過Git Bash使用git進行版本管理,在你熟悉Git Bash后相信你對TortoiseGit也會有更深入的掌握。

安裝好msysgit后,運行Git Bash,在開始所有工作之前我們需要先做一些配置,現(xiàn)在我們只需做一些基礎配置,詳細的配置后面再講:

# 用戶名
$ git config --global user.name 'omiga'
# email
$ git config --global user.email 'omiga@sample.com'
# 文本編輯器,默認vim
$ git config --global core.editor vim
# 差異分析工具
$ git config --global merge.tool vimdiff

因為每次提交git都會記錄committer信息,完成上述配置后,通過cd命令進入到任意文件目錄,然后使用git init命名即可初始化一個git版本庫。

$ cd /d/ohmygod
$ git init

這樣ohmygod目錄下的任何改動都處于git版本庫的管理下了。在該目錄下創(chuàng)建一個README文件,再運行git status命令,將會看到git提示README文件處于為“Untracked files”列表中,并給出了“(use git add <file>… to include in what will be committed)”的建議。此時可以使用git add README命名將README文件加入到暫存區(qū)。

$ git add README

此時再執(zhí)行git status,會看到“new file: README”的提示信息。繼續(xù)執(zhí)行git commit -m “create README”

$ git commit -m "create README"

這樣README文件就被提交到了本地版本庫,完成了一個文件從創(chuàng)建到提交的完整過程:

  1. git status – 查看git版本庫的狀態(tài)(這一步不是必須的,但是個好習慣)
  2. git add <file> – 將文件提交到暫存區(qū)(通常是在通過git status命令后,可以很清楚地看到文件的變更信息,決定哪些文件需要提交到暫存區(qū))
  3. git commit – 提交更改(只有處于暫存區(qū)的文件會被提交),直接使用git commit命令會調用提交說明窗口。

文件的三種狀態(tài)

處于git跟蹤下的文件具有三種狀態(tài):

  • 已修改(modified) 已修改過的文件
  • 已暫存(staged) 通過git add命令添加到暫存區(qū)域的文件
  • 已提交(committed) 通過git commit命令提交過的文件
工作目錄,暫存區(qū)域,以及本地倉庫

工作目錄,暫存區(qū)域,以及本地倉庫

查看幫助

$ git help <verb>
$ git <verb> --help
$ man git-<verb> # windows下不可用

如查看init命令的幫助信息:

$ git help init
$ git init --help

Git基本操作

創(chuàng)建Git版本庫

初始化Git版本庫

git init命名將在當前目錄新建一個版本庫

克隆Git版本庫

從你的git版本服務器上clone版本庫到本地開展工作,或者從github上clone一個開源項目的代碼庫,這時候你就需要git clone命令:

# git clone url [newname]
# 克隆到當前目錄
$ git clone https://github.com/octocat/Spoon-Knife.git
# 在當前目錄新建目錄knife 將Spoon-Knife克隆到knife目錄
$ git clone https://github.com/octocat/Spoon-Knife.git knife

不管是git init還是git clone都會在你的本地創(chuàng)建一個包含.git目錄的git版本庫

提交更新

通過git init命名或git clone命令都可以在本地創(chuàng)建一個git版本庫,版本庫創(chuàng)建成功后便可以在本地進行暫存文件,提交更新等操作了。

在git中可以使用git status查看文件的更改信息,但這個信息比較概要。如果想獲取更為詳細的更改信息,可以使用git diff命令:

# 查看未暫存文件的變化(與最近一次的暫存/提交比較)
$ git diff
# 查看已暫存文件的變化(與最近一次提交比較)
$ git diff --cached

清楚文件更改信息之后,便可使用git commit對暫存區(qū)文件進行提交操作。

如果想提交未暫存文件,可以使用git commit -a命令:

$ git commit -a -m 'all changes'

刪除文件

刪除Git版本庫中的某個文件

可以使用git rm <file>:

$ git rm myfile

當然其實你也可以直接在文件目錄中手動刪除,這兩者的區(qū)別在于:使用git rm命令相當于手動刪除后使用add命令將更改添加到暫存區(qū)域。

刪除暫存區(qū)的某個文件

$ git reset HEAD <file>

回退版本

如果想撤銷某(幾)次提交,回退到某個版本,可以使用git reset [--mode] <commit>:

$ git reset [--(mixed|soft|hard)] cec8506
  • –mixed 默認模式,回退到某次提交后的未暫存狀態(tài)
  • –soft 回退到某次提交后的暫存狀態(tài)
  • –hard 回退到某次提交完整狀態(tài),舍棄提交后的所有修改

文件重命名

git不會跟蹤在文件目錄中手動的文件重命名操作,如果手動重命名了某個文件,git會認為這是一次delete-create操作。但是,你可以使用git mv命令完成重命名(文件目錄亦使用該命令):

$ git mv oldfile newfile

查看提交歷史

這是git中使用平率非常高的一個操作,git中查看提交歷史的功能也非常強大,提供各種篩選和輸出格式定制功能。

最簡單的,運行git log命令,你將看到一個詳細的提交日志:

git-log

git-log

信息內容都很好理解,重點說說第一行commit后這個40個字符的字符串,這是該次提交的對應的SHA-1值,在git中,會對提交(commit)、文件(blob)、目錄(tree)、標簽(tag)生成一個唯一的SHA-1值,git就是基于此來得知文件或目錄的改動,因為這四類對象計算得到的SHA-1值都是唯一的,同時你也可以直接使用SHA-1值來指代相應的對象。比如:

$ git show bdd3996

git log還有很多命令選項來定制歷史記錄

選項 說明
-(n) 僅顯示最近的 n 條提交
–since,–after 僅顯示指定時間之后的提交
–until,–before 僅顯示指定時間之前的提交
–author 僅顯示指定作者相關的提交
–committer 僅顯示指定提交者相關的提交
–reverse 按時間倒序顯示
-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 使用其他格式顯示歷史提交信息??捎玫倪x項包括 oneline,short,full,fuller 和 format(后跟指定格式)

可以通過對上述選項進行組合定制出更為個性化的日志信息,比如:

$ git log --committer 'god' --shortstat --pretty=oneline

該命令將以單行模式顯示由god提交的統(tǒng)計信息。

$ git log -p -5

顯示最近5次提交的,并顯示其差異

除此之外,git log –graph也很好玩。我git log –graph了一下git項目的日志,非常壯觀。

git graph log

git graph log

–pretty=format

單獨介紹下–pretty=format選項。使用format和占位符可以定制出更為個性化的顯示格式。

選項 說明
%H 提交對象(commit)的完整哈希字串
%h 提交對象的簡短哈希字串
%T 樹對象(tree)的完整哈希字串
%t 樹對象的簡短哈希字串
%P 父對象(parent)的完整哈希字串
%p 父對象的簡短哈希字串
%an 作者(author)的名字
%ae 作者的電子郵件地址
%ad 作者修訂日期(可以用 -date= 選項定制格式)
%ar 作者修訂日期,按多久以前的方式顯示
%cn 提交者(committer)的名字
%ce 提交者的電子郵件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式顯示
%s 提交說明
$ git log --pretty=format:'%h by %ce at %cd'

該命令將以“簡短SHA-1 by 提交者 at 提交時間”的格式顯示日志

圖形化日志界面gitk

gitk命名會啟用圖形化的日志界面

gitk

gitk

撤銷操作

前面已經介紹過使用git reset來撤銷暫存區(qū)的文件,以及回退整個版本。但如果只想恢復某個文件,則需要使用checkout — <file>命名:

$ git checkout -- README

它只有在修改文件還沒有暫存的情況下,使用最近的提交版本進行恢復。如果文件已經暫存,則需要先使用git reset HEAD <file>從暫存區(qū)刪除文件,再使用該命令。

修改最后一次提交

git commit –amend命名允許你對最后一次提交信息重新編輯。相當于重新進行一次提交,覆蓋掉上一次提交。

遠程版本庫的使用

盡管git在本地也可以方便地進行版本管理,但是多人協(xié)作,或者是多地操作時,總需要使用到遠程倉庫來進行版本維護。在前面創(chuàng)建版本庫的內容中其實使用clone命名就已經是在與遠程版本庫進行交互了,clone遠程庫后便會自動創(chuàng)建一個名為origin的遠程庫,可以使用git remote -v命名查看遠程庫的詳細信息。

$ git remote -v

而在實際工作中,我們可能需要頻繁地與某一個或幾個遠程庫交互,那么更好的辦法是使用一個別名把遠程庫保存起來。git添加遠程庫的方法很簡單:

# $ git remote add <name> <remote-url>
$ git remote add pro-git https://github.com/progit/progit.git

這樣便將https://github.com/progit/progit.git這個遠程git版本庫添加并命名為pro-git,后續(xù)你只需要使用pro-git便可以指代progit的遠程庫。

push

當你完成本地工作,并將改動提交到本地版本庫后,你便可以使用push將本地提交推送到遠程倉庫了:

# $ git push <remote-name> <branch-name>
$ git push pro-git master

默認會使用origin和master作為遠程倉庫和本地分支的名稱。

當然你也可以將本地分支推送到遠程倉庫作為一個分支:

# $ git push <remote-name> <local-branch>:<remote-branch>
$ git push pro-git master:git-branch

當<local-branch>為空時,會嘗試刪除遠程分支:

$ git push pro-git :git-branch

上述命令會刪除遠程倉庫中的”git-branch”分支

fetch與pull

fetch與pull命令都會將一個遠程倉庫抓取到本地,不同的是fetch僅僅是將遠程倉庫抓取到本地,以供進行后續(xù)操作;pull除了將遠程倉庫抓取到本地,還會試圖與本地當前分支進行合并。

他們與clone不同的是,clone會copy一份版本倉庫到本地,如果本地已存在版本倉庫,則會被clone后的倉庫替換。而fetch和pull都需要在已有本地倉庫的條件下操作,不能作為創(chuàng)建本地倉庫的方法,即是必須先git init或是git clone后才能使用fetch和pull。

刪除遠程倉庫

$ git remote -d <remote-name>

準確一點說,這只是刪除遠程倉庫在本地的別名,而不是真正刪除遠程服務器上的git倉庫。

重命名遠程倉庫

$ git remote rename oldname newname

Git別名

雖然git中很多命名都簡單易記,但每次都手動輸入這些命令確實會浪費不少時間,而且也有那么些命令選項非常冗長,這時就可以使用別名來簡化命令的輸入了。

別名屬于配置項內容,所以需要使用git config命令,如可以為“checkout -b”命令配置別名“cob”

$ git config --global alias.cob 'checkout -b'

為“commit -a -m”配置別名“cam”:

$ git config --global alias.cam 'commit -a -m'

為單行圖像化顯示log命令“l(fā)og –pretty=oneline –graph”配置別名“l(fā)ol”:

$ git config --global alias.lol 'log --pretty=oneline --graph'

至此,git基礎篇結束。你已經可以使用git進行日常的代碼管理維護,下一篇進階篇將著重介紹分支,git配置,git原理以及github等內容。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多