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