摘要:沒有一個(gè)全局的版本號(hào),而有目前為止這是跟相比缺少的最大的一個(gè)特征。這能確保代碼內(nèi)容的完整性,確保在遇到磁盤故障和網(wǎng)絡(luò)問題時(shí)降低對(duì)版本庫的破壞。合并沖突多人對(duì)同一文件的工作副本進(jìn)行更改,并將這些更改提交到倉庫。
Git
是一種分布式版本控制系統(tǒng),它可以不受網(wǎng)絡(luò)連接的限制,加上其它眾多優(yōu)點(diǎn),目前已經(jīng)成為程序開發(fā)人員做項(xiàng)目版本管理時(shí)的首選,非開發(fā)人員也可以用 Git
來做自己的文檔版本管理工具。
Git
不僅僅是個(gè)版本控制系統(tǒng),它也是個(gè)內(nèi)容管理系統(tǒng)(CMS
),工作管理系統(tǒng)等。
如果你是一個(gè)具有使用 SVN
背景的人,你需要做一定的思想轉(zhuǎn)換,來適應(yīng) Git
提供的一些概念和特征。
Git
與 SVN
區(qū)別點(diǎn):
Git
是分布式的,SVN
不是:這是 Git
和其它非分布式的版本控制系統(tǒng),例如 SVN
,CVS
等,最核心的區(qū)別。Git
把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ),而 SVN
是按文件:所有的資源控制系統(tǒng)都是把文件的元信息隱藏在一個(gè)類似 .svn
、.cvs
等的文件夾里。Git
分支和 SVN
的分支不同:分支在 SVN
中一點(diǎn)都不特別,其實(shí)它就是版本庫中的另外一個(gè)目錄。Git
沒有一個(gè)全局的版本號(hào),而 SVN
有:目前為止這是跟 SVN
相比 Git
缺少的最大的一個(gè)特征。Git
的內(nèi)容完整性要優(yōu)于 SVN
:Git
的內(nèi)容存儲(chǔ)使用的是 SHA-1
哈希算法。這能確保代碼內(nèi)容的完整性,確保在遇到磁盤故障和網(wǎng)絡(luò)問題時(shí)降低對(duì)版本庫的破壞。版本控制(Revision control
)是一種在開發(fā)的過程中用于管理我們對(duì)文件、目錄或工程等內(nèi)容的修改歷史,方便查看更改歷史記錄,備份以便恢復(fù)以前的版本的軟件工程技術(shù)。一句話就是用于管理多人協(xié)同開發(fā)項(xiàng)目的技術(shù)。
工作區(qū):就是你在電腦里能看到的目錄。
版本庫:工作區(qū)有一個(gè)隱藏目錄 .git
,這個(gè)不算工作區(qū),而是 Git
的版本庫。
暫存區(qū):本地版本庫里存了很多東西,其中最重要的就是稱為 stage
(或者叫index)的暫存區(qū)。
下面這個(gè)圖展示了工作區(qū)、版本庫中的暫存區(qū)和版本庫之間的關(guān)系:
分支是為了將修改記錄的整個(gè)流程分開存儲(chǔ),讓分開的分支不受其它分支的影響,所以在同一個(gè)數(shù)據(jù)庫里可以同時(shí)進(jìn)行多個(gè)不同的修改。
是 Git 為我們自動(dòng)創(chuàng)建的第一個(gè)分支,也叫主分支,其它分支開發(fā)完成后都要合并到 master
將某分支上的更改聯(lián)接到此主干或同為主干的另一個(gè)分支。
多人對(duì)同一文件的工作副本進(jìn)行更改,并將這些更改提交到倉庫。
標(biāo)簽是用于標(biāo)記特定的點(diǎn)或提交的歷史,通常會(huì)用來標(biāo)記發(fā)布版本的名稱或版本號(hào)(如:publish/0.0.1
),雖然標(biāo)簽看起來有點(diǎn)像分支,但打上標(biāo)簽的提交是固定的,不能隨意的改動(dòng)。
頭是一個(gè)象征性的參考,最常用以指向當(dāng)前選擇的分支。
.git
目錄下的 index
文件, 暫存區(qū)會(huì)記錄 git add
添加文件的相關(guān)信息(文件名、大小、timestamp
...),不保存文件實(shí)體, 通過 id
指向每個(gè)文件實(shí)體。可以使用 git status
查看暫存區(qū)的狀態(tài)。暫存區(qū)標(biāo)記了你當(dāng)前工作區(qū)中,哪些內(nèi)容是被 Git
管理的;git add
先提交到暫存區(qū),被 Git
管理。git commit
后同步 index
的目錄樹到本地倉庫,方便從下一步通過 git push
同步本地倉庫與遠(yuǎn)程倉庫的同步。遠(yuǎn)程倉庫的內(nèi)容可能被分布在多個(gè)地點(diǎn)的處于協(xié)作關(guān)系的本地倉庫修改,因此它可能與本地倉庫同步,也可能不同步,但是它的內(nèi)容是最舊的。
版本控制就是對(duì)文件的版本控制:首先要知道文件當(dāng)前在什么狀態(tài),然后才能對(duì)文件進(jìn)行修改、提交等操作,不然可能會(huì)提交了現(xiàn)在還不想提交的文件。
Untracked
: 未跟蹤, 此文件在文件夾中, 但并沒有加入到 Git
庫, 不參與版本控制.通過 git add
狀態(tài)變?yōu)?Staged
;Unmodify
: 文件已經(jīng)入庫, 未修改, 即版本庫中的文件快照內(nèi)容與文件夾中完全一致. 這種類型的文件有兩種去處, 如果它被修改, 而變?yōu)?Modified.
如果使用 git rm
移出版本庫, 則成為 Untracked
文件;Modified
: 文件已修改, 僅僅是修改, 并沒有進(jìn)行其他的操作. 這個(gè)文件也有兩個(gè)去處,通過 git add
可進(jìn)入暫存 staged
狀態(tài), 使用 git checkout
則丟棄修改過, 返回到 unmodify
狀態(tài), 這個(gè) git checkout
即從庫中取出文件, 覆蓋當(dāng)前修改;Staged
: 暫存狀態(tài).執(zhí)行 git commit
則將修改同步到庫中, 這時(shí)庫中的文件和本地文件又變?yōu)橐恢? 文件為 Unmodify
狀態(tài). 執(zhí)行 git reset HEAD filename
取消暫存, 文件狀態(tài)為 Modified
。
git status # 添加指定文件到暫存區(qū);git add (dir) # 添加當(dāng)前目錄的所有文件到暫存區(qū)。
git rm --cached # 直接從暫存區(qū)刪除文件,工作區(qū)不做出改變git checkout . # 用贊尋去全部或指定文件替換工作區(qū)的文件,這個(gè)操作很危險(xiǎn),會(huì)清楚工作區(qū)中未添加到暫存區(qū)的改動(dòng)。git clean # 一般會(huì)加上參數(shù) -df,-d 表示包含目錄,-f 表示強(qiáng)制清除;
git status # 只能查看對(duì)哪些文件做了改動(dòng),如果要看改動(dòng)了什么,可以用;git diff (files) # 查看文件修改后的差異
此外,還有以下兩個(gè)常用命令:
git diff --cached # 比較暫存區(qū)的文件與之前已經(jīng)提交過的文件git diff HEAD~n # 比較 repo 與工作空間中的文件差異
該文件已經(jīng)存在倉庫中,工作區(qū)已經(jīng)對(duì)其進(jìn)行修改過了,如果想撤銷修改,可以使用 checkout
。
檢出命令git checkout 是 git 最常用的命令之一,同時(shí)也是一個(gè)很危險(xiǎn)的命令,因?yàn)檎垓v命令會(huì)重寫工作區(qū)。
通過
add
只是將文件或者目錄添加到index
即暫存區(qū),使用commit
可以實(shí)現(xiàn)將暫存區(qū)的文件提交到本地倉庫。
git commit -m [message] # 提交暫存區(qū)到倉庫區(qū)git commit [file1] [file2] ... -m [message] # 提交暫存區(qū)的指定文件到倉庫區(qū)git commit -a # 提交工作區(qū)自上次 commit 之后的變化,直接到倉庫區(qū),跳過了 add,對(duì)新文件無效git commit -v # 提交時(shí)顯示所有 diff 信息
git reset HEAD [filename] # 將暫存區(qū)指定文件移出到工作區(qū)
放棄工作區(qū)和暫存區(qū)的改動(dòng),同時(shí) HEAD
指針指向前一個(gè) commit
對(duì)象:
git log #查看提交日志, git reset --hard HELD~1 #撤銷了上一次的提交,這里的上一次提交日志就不存在了。cat [filename] #查看文件內(nèi)內(nèi)容git revert #把指定的提交修改回滾,并同時(shí)生成一個(gè)新的提交
git log #查看所有提交日志;git log [filename] #查看某文件提交日志;history #查看在 bash 下輸入過的指令;git reflog #查看倉庫中所有分支的所有更新記錄,包括已經(jīng)撤銷的更新。
Git
配置文件有三個(gè)級(jí)別,分別是系統(tǒng)級(jí)別、全局級(jí)別以及倉庫級(jí)別。下面的表格展示了各個(gè)級(jí)別的配置的具體信息:
配置級(jí)別 | 文件位置 | 配置命令 | 優(yōu)先級(jí)別 |
---|---|---|---|
系統(tǒng) | Git 安裝目錄/etc/gitconfig | git config --system | 低 |
全局 | 用戶文件夾.gitconfig | git config --global | 中 |
倉庫 | 倉庫文件夾.git/config | git config --local | 高 |
Git
用戶名和郵箱進(jìn)行配置
git config --global user.name "xxxx" :設(shè)置所有倉庫提交的用戶名git config --global user.email "[email protected]":設(shè)置所有倉庫提交的郵箱
git config --global --list;git config --global --get user.name;git config --global --get user.email;
系統(tǒng)和當(dāng)前項(xiàng)目的命令同上,僅需將
global
改為system
/local
即可。
創(chuàng)建本地倉庫的方法有兩種:一種是創(chuàng)建全新的倉庫,另一種是克隆遠(yuǎn)程倉庫。
Git
倉庫只需使它初始化:git init
;執(zhí)行后可以看到,僅僅在項(xiàng)目目錄多出了一個(gè).git
目錄;
Git
倉庫使用如下命令,可以把創(chuàng)建目錄與倉庫一起完成:
git init [project-name] # 新建一個(gè)目錄,將其初始化為 Git 代碼庫
clone
而不是 checkout
,語法格式為:
git clone (url)
例如:我們要從克隆的遠(yuǎn)程倉庫托管在 Github
上,首先,我們先前往 Github
上拷貝地址如:
https://github.com/vanDusty/Java-Note,然后執(zhí)行:
git clone https://github.com/vanDusty/Java-Note```克隆遠(yuǎn)程倉庫到當(dāng)前目錄。### 5.3 Git 倉庫目錄結(jié)構(gòu)- 初始化倉庫使用 `git init` 命令,初始目錄(`.git`)結(jié)構(gòu):```xml.git├── branches├── config├── description├── HEAD├── hooks│ ├── applypatch-msg.sample│ ├── commit-msg.sample│ ├── post-update.sample│ ├── pre-applypatch.sample│ ├── pre-commit.sample│ ├── prepare-commit-msg.sample│ ├── pre-push.sample│ ├── pre-rebase.sample│ └── update.sample├── info│ └── exclude├── objects│ ├── info│ └── pack└── refs ├── heads └── tags 9 directories, 13 files
dev-branch
,并 push
后的目錄結(jié)構(gòu):
.git/├── branches├── COMMIT_EDITMSG├── config├── description├── HEAD├── hooks│ ├── applypatch-msg.sample│ ├── commit-msg.sample│ ├── post-update.sample│ ├── pre-applypatch.sample│ ├── pre-commit.sample│ ├── prepare-commit-msg.sample│ ├── pre-push.sample│ ├── pre-rebase.sample│ └── update.sample├── index├── info│ └── exclude├── logs│ ├── HEAD│ └── refs│ ├── heads│ │ ├── dev-branch│ │ └── master│ └── remotes│ └── origin│ └── master├── objects│ ├── 2d│ │ └── d2c71b69c837a7459f4bd9c9f7db6520731d06│ ├── 5c│ │ └── 7b8eda18a75e13d27c31e65a54b0abd7948510│ ├── 77│ │ └── cad3aecf7c2754231095598119979d62a1e1da│ ├── info│ └── pack└── refs ├── heads │ ├── dev-branch │ └── master ├── remotes │ └── origin │ └── master └── tags 19 directories, 25 files
branches
目錄一種不常用的存儲(chǔ)速記方式,用于指定 git fetch
,git pull
和 git push
的 URL
,目前已基本不用。
COMMIT_EDITMSG
文件commit
編輯信息,僅記錄最近一次提交的 commit
編輯信息。
config
文件存儲(chǔ)當(dāng)前倉庫的配置信息
description
文件用于在 GitWeb
中展示項(xiàng)目的描述信息。
HEAD
文件存儲(chǔ) HEAD 指針,指向當(dāng)前分支,即:記錄當(dāng)前活動(dòng)分支。
hooks
目錄目錄下存儲(chǔ)了許多鉤子文件(一些腳本),這些文件是各種 Git
命令使用的自定義腳本,可以在 Git
特定階段自動(dòng)執(zhí)行。
index
文件暫存區(qū)(stage
),二進(jìn)制文件。
info
目錄存儲(chǔ)庫的其他信息將記錄在此目錄中。
logs
目錄保存所有更新的引用記錄。
objects
目錄簡(jiǎn)單理解就是:objects
目錄是 Git
的數(shù)據(jù)庫,存儲(chǔ)所有數(shù)據(jù)內(nèi)容。
refs
目錄(1)heads
目錄
目錄有以各個(gè)本地分支名命名的文件,保存對(duì)應(yīng)分支最新提交的 ID
,是通過 SHA1
算法計(jì)算的一個(gè)字符串。
(2)remotes
目錄
目錄有以各個(gè)遠(yuǎn)程分支名命名的文件,保存對(duì)應(yīng)分支最新提交的 ID
,和 heads
目錄一個(gè)原理。
(3)tags
目錄
存儲(chǔ)在開發(fā)過程中打的標(biāo)簽,里面的文件以標(biāo)簽名命令,文件內(nèi)容為對(duì)應(yīng)的 ID
。
Git 是分布式版本控制系統(tǒng),同一個(gè)
Git
倉庫,可以分布到不同的機(jī)器上,即發(fā)布到不同的遠(yuǎn)程倉庫上。
對(duì),就是那個(gè)“全世界最大同性交友網(wǎng)站”。https://github.com
絕大多數(shù)好的開源項(xiàng)目都來自 GitHub,但是 GitHub 只能新建公開的 Git 倉庫,私有倉庫要收費(fèi),有時(shí)候訪問比較卡,如果你做的是一個(gè)開源項(xiàng)目,可以首選 GitHub。
提到 GitHub 就會(huì)自然的想到 Gitlab,Gitlab 支持無限的公有項(xiàng)目和私有項(xiàng)目。https://about.gitlab.com
Bitbucket免費(fèi)支持 5 個(gè)開發(fā)成員的團(tuán)隊(duì)創(chuàng)建無限私有代碼托管庫。https://bitbucket.org
前面說的都是國(guó)外的,下面來說幾個(gè)國(guó)內(nèi)的。碼云,個(gè)人開發(fā)者可免費(fèi)創(chuàng)建 1000 個(gè)項(xiàng)目(不限公有、私有),提供最多 5G 的免費(fèi)代碼存儲(chǔ)空間。http://git.oschina.net,
談到 Coding.net,首先必須提的是速度快,同樣一個(gè)賬號(hào)最多可以創(chuàng)建 1000 個(gè)項(xiàng)目(5 個(gè)私有),也支持任務(wù)的創(chuàng)建等。https://coding.net
申請(qǐng)到了 Git
遠(yuǎn)程倉庫的帳號(hào)并創(chuàng)建了一個(gè)空的遠(yuǎn)程倉庫現(xiàn)在我們就可以結(jié)合本地的倉庫與遠(yuǎn)程倉庫一起協(xié)同工作了,多人協(xié)同開發(fā),這也是我們工作時(shí)的情形,這里我們?nèi)渴褂妹钔瓿桑▽?shí)際開發(fā)中很多開發(fā)工具例如:IDEA
等,無需命令操作)。
遠(yuǎn)程操作的第一步,通常是從遠(yuǎn)程主機(jī)克隆一個(gè)版本庫,這時(shí)就要用到 git clone
命令,例如:
git clone https://github.com/vanDusty/Java-Note
該命令會(huì)在本地主機(jī)生成一個(gè)目錄,與遠(yuǎn)程主機(jī)的版本庫同名。如果要指定不同的目錄名,可以將目錄名作為 git clone
命令的第二個(gè)參數(shù)。
git clone <版本庫的網(wǎng)址> <本地目錄名>
git clone 支持多種協(xié)議
除了HTTP(s)
以外,還支持SSH
、Git
、本地文件協(xié)議等。通常來說,Git
協(xié)議下載速度最快,SSH
協(xié)議用于需要用戶認(rèn)證的場(chǎng)合。各種協(xié)議優(yōu)劣的詳細(xì)討論請(qǐng)參考官方文檔。
git remote
為了便于管理,Git
要求每個(gè)遠(yuǎn)程主機(jī)都必須指定一個(gè)主機(jī)名。git remote
命令就用于管理主機(jī)名。
不帶選項(xiàng)的時(shí)候, git remote
命令列出所有遠(yuǎn)程主機(jī)名。
git remote -v #參看遠(yuǎn)程主機(jī)的網(wǎng)址。
結(jié)果表示,當(dāng)前只有一臺(tái)遠(yuǎn)程主機(jī),叫做 origin
,以及它的網(wǎng)址。
origin [email protected]:jquery/jquery.git (fetch)origin [email protected]:jquery/jquery.git (push)
克隆版本庫的時(shí)候,所使用的遠(yuǎn)程主機(jī)自動(dòng)被 Git
命名為 origin
。如果想用其他的主機(jī)名,需要用 git clone
命令的 -o
選項(xiàng)指定:
git clone -o dusty https://github.com/vanDusty/Java-Note
上面命令表示,克隆的時(shí)候,指定遠(yuǎn)程主機(jī)叫做 dusty
更多命令如下:
$ git remote show <主機(jī)名> #查看該主機(jī)的詳細(xì)信息$ git remote add <主機(jī)名> <網(wǎng)址> #添加遠(yuǎn)程主機(jī)$ git remote rm <主機(jī)名> #刪除遠(yuǎn)程主機(jī)$ git remoterename<原主機(jī)名> <新主機(jī)名> #遠(yuǎn)程主機(jī)的改名
git fetch
一旦遠(yuǎn)程主機(jī)的版本庫有了更新,需要將這些更新取回本地,這時(shí)就要用到該命令。
git fetch #將某個(gè)遠(yuǎn)程主機(jī)的更新,全部取回本地。git fetch <遠(yuǎn)程主機(jī)名> <分支名> #取回指定主機(jī)名的指定分支
所取回的更新,在本地主機(jī)上要用"遠(yuǎn)程主機(jī)名/分支名"的形式讀取。比如 origin
主機(jī)的 master
,就要用 origin/master
讀取。
git checkout -b newBrach origin/master #在 origin/master 的基礎(chǔ)上,創(chuàng)建一個(gè)新分支。
也可以使用 git merge
命令或者 git rebase
命令,在本地分支上合并遠(yuǎn)程分支。
git merge origin/master #或者$ git rebase origin/master
git pull
git pull
命令的作用是,取回遠(yuǎn)程主機(jī)某個(gè)分支的更新,再與本地的指定分支合并。它的完整格式稍稍有點(diǎn)復(fù)雜。
git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
示例:取回 origin
主機(jī)的 master
分支,與本地的 develop
分支合并:
git pull origin master:develop
如果遠(yuǎn)程分支( master
)要與當(dāng)前分支合并,則冒號(hào)后面的部分可以省略。可以簡(jiǎn)寫為:
git pull origin master
上面命令表示,取回 origin/master
分支,再與當(dāng)前分支合并。實(shí)質(zhì)上,這等同于先做 git fetch
,再做 git merge
。
git fetch origingit merge master/develop
git fetch
和 git pull
的區(qū)別
git fetch:相當(dāng)于是從遠(yuǎn)程獲取最新版本到本地,不會(huì)自動(dòng)合并。git pull:相當(dāng)于是從遠(yuǎn)程獲取最新版本并merge到本地
偷個(gè)懶,發(fā)現(xiàn)一個(gè)很全的【Git常用命令參考手冊(cè)】
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/123995.html
摘要:是現(xiàn)在廣泛流行的代從開始學(xué)習(xí)系列之向提交代碼掘金讀完本文大概需要分鐘。為了進(jìn)行高效的垃圾回收,虛擬機(jī)把堆內(nèi)存劃分成新生代老年代和永久代中無永久代,使用實(shí)現(xiàn)三塊區(qū)域。 React Native 開源項(xiàng)目 - 仿美團(tuán)客戶端 (Android、iOS 雙適配) - Android - 掘金推薦 React Native 學(xué)習(xí)好項(xiàng)目,仿照美團(tuán)客戶端... 極簡(jiǎn) GitHub 上手教程 - 工具...
平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
平日學(xué)習(xí)接觸過的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
閱讀 3689·2021-11-23 09:51
閱讀 1051·2021-11-19 11:30
閱讀 3376·2019-08-29 14:16
閱讀 3383·2019-08-29 12:12
閱讀 2378·2019-08-26 13:40
閱讀 3491·2019-08-26 12:21
閱讀 3085·2019-08-26 11:55
閱讀 2231·2019-08-26 11:35