記錄文件每次的更新,能夠對每一個版本作一個快照,或是記錄補丁文件,適合我的用,如RCS。git
全部的版本數據都保存在服務器上,協同開發者從服務器上同步更新或上傳本身的修改github
全部的版本數據都存在服務器上,用戶的本地只有本身之前所同步的版本,若是不連網的話,用戶就看不到歷史版本,也沒法切換版本驗證問題,或在不一樣分支工做。並且,全部數據都保存在單一的服務器上,有很大的風險這個服務器會損壞,這樣就會丟失全部的數據,固然能夠按期備份。表明產品:SVN、CVS、VSS數據庫
全部版本信息倉庫所有同步到本地的每一個用戶,這樣就能夠在本地查看全部版本歷史,能夠離線在本地提交,只需在連網時push到相應的服務器或其餘用戶那裏。因爲每一個用戶那裏保存的都是全部的版本數據,只要有一個用戶的設備沒有問題就能夠恢復全部的數據,但這增長了本地存儲空間的佔用。安全
Git是目前世界上最早進的分佈式版本控制系統。服務器
Git是免費、開源的編輯器
優勢:分佈式
缺點:工具
一直Next默認就行了,若是須要設置就要仔細讀一下安裝界面上的選項。fetch
使用git config -l 能夠查看如今的git環境詳細配置ui
#(1)查看系統config
#/etc/gitconfig:包含了適用於系統全部用戶和全部項目的值。(Win:C:\Program Files\Git\mingw64\etc\gitconfig) --system 系統級 git config --system --list #(2)查看當前用戶(global)配置
#~/.gitconfig:只適用於當前登陸用戶的配置。(Win:C:\Users\Administrator\.gitconfig) --global 全局 git config --global --list #(3)查看當前倉庫配置信息
#位於git項目目錄中的.git/config:適用於特定git項目的配置。(Win:C:\gitProject) --local當前項目 git config --local --list
注意:對於同一配置項,三個配置文件的優先級是1<2<3
安裝Git後首先要作的事情是設置你的用戶名稱和e-mail地址。這是很是重要的,由於每次Git提交都會使用該信息。它被永遠的嵌入到了你的提交中:
$ git config --global user.name "zhoumo" #名稱 $ git config --global user.email 838616767@qq.com #郵箱
#傳遞了--global 選項,--global爲全局配置,不加爲某個項目的特定配置。
#若是你但願在一個特定的項目中使用不一樣的名稱或e-mail地址,你能夠在該項目中運行該命令而不要--global選項。
添加配置項:
$ git config [--local|--global|--system] section.key value #[--local|--global|--system] #可選的,對應本地,全局,系統不一樣級別的設置 #section.key #區域下的鍵 #value #對應的值
刪除配置項:
$ git config [--local|--global|--system] --unset section.key
更多配置項:
$ git config --global color.ui true #打開全部的默認終端着色 $ git config --global alias.ci commit #別名 ci 是commit的別名 [alias] co = checkout ci = commit st = status pl = pull ps = push dt = difftool l = log --stat cp = cherry-pick ca = commit -a b = branch user.name #用戶名 user.email #郵箱 core.editor #文本編輯器 merge.tool #差別分析工具 color.diff true #diff顏色配置 alias.co checkout #設置別名 git config user.name #得到用戶名 git config core.filemode false #忽略修改權限的文件
Git本地有三個工做區域:工做目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)。若是在加上遠程的git倉庫(Remote Directory)就能夠分爲四個工做區域。文件在這四個區域之間的轉換關係以下:
git的工做流程通常是這樣的:
3.2.一、在工做目錄中添加、修改文件;
3.2.二、將須要進行版本管理的文件放入暫存區域;
3.2.三、將暫存區域的文件提交到git倉庫。
所以,git管理的文件有三種狀態:已修改(modified),已暫存(staged),已提交(committed)
全新倉庫
# 在當前目錄新建一個Git代碼庫
$ git init
# 新建一個目錄,將其初始化爲Git代碼庫
$ git init [project-name]
克隆遠程倉庫
因爲是將遠程服務器上的倉庫徹底鏡像一份至本地,而不是取某一個特定版本,因此用clone而不是checkout,語法格式以下
# 克隆一個項目和它的整個代碼歷史(版本信息)
$ git clone [url]
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 [filename]
# 查看全部文件狀態
$ git status
# 添加指定文件到暫存區
$ git add [file1] [file2] ...
# 添加指定目錄到暫存區,包括子目錄
$ git add [dir]
# 添加當前目錄的全部文件到暫存區
$ git add .
# 直接從暫存區刪除文件,工做區則不作出改變
$ git rm --cached <file>
# 不但從stage中刪除,同時刪除物理文件 $ git rm readme.txt # 把a.txt更名爲b.txt $ git mv a.txt b.txt
# 查看文件修改後的差別
$ git diff [files]
$ git reset HEAD <file>... #若是已經用add 命令把文件加入stage了,就先須要從stage中撤銷
# 只執行 「git reset HEAD」 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,可是工做區不受影響。
$ git clean [options] #移除全部未跟蹤文件,通常會加上參數-df,-d表示包含目錄,-f表示強制清除。
$ git diff HEAD~n #比較工做空間中的文件與倉庫中倒數第n+1次提交時的差別
# 只執行git diff HEAD,表示與當前指向的HEAD比較
$ git diff --cached #比較暫存區的文件與以前已經提交過的文件
$ git checkout
$ git checkout HEAD
# 彙總顯示工做區、暫存區與HEAD的差別。
$ git checkout -- filename
$ git checkout filename #用暫存區中filename文件來覆蓋工做區中的filename文件。至關於取消自上次執行git add filename以來(若是執行過)的本地修改。
$ git checkout -- . 或寫做 git checkout .
#注意git checkout命令後的參數爲一個點(「.」)。這條命令最危險!會取消全部本地的修改(相對於暫存區)。至關於用暫存區的全部文件直接覆蓋本地文件,不給用戶任何確認的機會!
$ git checkout commit_id -- file_name #檢出指定commit_id的文件到工做區和暫存區的filename。至關於恢復到某一次提交前時的狀態。
$ git checkout branch -- filename #維持HEAD的指向不變。用branch分支所指向的提交中filename替換暫存區和工做區中相應的文件。注意會將暫存區和工做區中的filename文件直接覆蓋。
有些時候咱們不想把某些文件歸入版本控制中,好比數據庫文件,臨時文件,設計文件等
在主目錄下創建".gitignore"文件,此文件有以下規則:
#爲註釋 *.txt #忽略全部 .txt結尾的文件 !lib.txt #但lib.txt除外 /temp #僅忽略項目根目錄下的文件,不包括子目錄temp build/ #忽略build/目錄下的全部文件 doc/*.txt #會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
經過add只是將文件或目錄添加到了index暫存區,使用commit能夠實現將暫存區的文件提交到本地倉庫。
# 提交暫存區到倉庫區 $ git commit -m [message] # 提交暫存區的指定文件到倉庫區 $ git commit [file1] [file2] ... -m [message] # 提交工做區自上次commit以後的變化,直接到倉庫區,跳過了add,對新文件無效 $ git commit -a -m [message] # 提交時顯示全部diff信息 $ git commit -v
# 使用一次新的commit,替代上一次提交 # 若是代碼沒有任何新變化,則用來改寫上一次commit的提交信息
$ git commit --amend -m [message]
# 重作上一次commit,幷包括指定文件的新變化
$ git commit --amend [file1] [file2] ...
原理就是放棄工做區和index的改動,同時HEAD指針指向前一個commit對象
# 撤銷上一次的提交 $ git reset --hard HEAD~1
#另外一個用法
$ git reset --hard HEAD^
$ git reset --hard commit-id
#在Git中有一個HEAD指針指向當前分支中最新的提交。當前版本咱們使用"HEAD^",那麼再前一個版本可使用"HEAD^^",若是想回退到更早的提交,可使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)
撤銷提交:(使用這條語句提示衝突,後面再找緣由)
git revert <commit-id>
這條命令會把指定的提交的全部修改回滾,並同時生成一個新的提交
恢復被撤銷的提交可用"git reflog"查看倉庫中全部的分支的全部更新記錄,包括已經撤銷的更新,撤銷方法與前面同樣。
$ git reset --hard HEAD@{3}
--hard:撤銷並刪除相應的更新
--soft:撤銷相應的更新,把這些更新的內容放到Stage中
#查看提交日誌
git log [<options>] [<revision range>] [[\--] <path>…?]
"git log --graph"以圖形化的方式顯示提交歷史的關係,這就能夠方便地查看提交歷史的分支信息,固然是控制檯用字符畫出來的圖形。
"git log -1"則表示顯示1行。
"git reflog"中會記錄這個倉庫中全部的分支的全部更新記錄,包括已經撤銷的更新。
使用git ls-files指令能夠查看指定狀態的文件列表,格式以下:
#查看指定狀態的文件
git ls-files [-z] [-t] [-v] (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])* (-[c|d|o|i|s|u|k|m])*
基本語句:
# 列出全部本地分支 $ git branch # 列出全部遠程分支 $ git branch -r # 列出全部本地分支和遠程分支 $ git branch -a # 新建一個分支,但依然停留在當前分支 $ git branch [branch-name] # 新建一個分支,並切換到該分支 $ git checkout -b [branch]
# 切換到指定分支,並更新工做區
$ git checkout [branch-name]
# 合併指定分支到當前分支
$ git merge [branch]
# 刪除分支
$ git branch -d [branch-name]
#其餘用法 $ git branch [branch] [commit] # 新建一個分支,指向指定commit $ git branch --track [branch] [remote-branch] # 新建一個分支,與指定的遠程分支創建追蹤關係 $ git checkout [branch-name] # 切換到指定分支,並更新工做區 $ git checkout - # 切換到上一個分支 $ git branch --set-upstream [branch] [remote-branch] # 創建追蹤關係,在現有分支與指定的遠程分支之間 $ git cherry-pick [commit] # 選擇一個commit,合併進當前分支
git merge [branch]
先建立一個新的分支,進行修改後提交
回到主分支,查看源文件,此時是沒有更新的,合併分支後再查看,新作的修改就更新到主分支
masters分支對文件filell.txt進行操做後提交
切換到dev6分支,修改文件filell.txt後進行提交
切換到主分支,進行合併分支。提示存在衝突
查看文件filell.txt在分支master中的狀態
Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容,其中<<<HEAD是指主分支修改的內容,>>>>>dev6 是指dev6上修改的內容
修改衝突文件後從新提交,請注意當前的狀態產master | MERGING:
語句:
git branch -d [branch] # -D(大寫)是強制刪除
建立一個新的分支dev7
切換到其餘分支執行刪除語句,不能在當前分支執行刪除當前分支
刪除遠程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
比較推薦Coding.net、GItHub。
#添加遠程主機,主機名爲origin 地址爲https://git.coding.net/zhangguoGit/project7.git git remote add origin https://git.coding.net/zhangguoGit/project7.git #本地的master分支推送到origin主機,同時指定origin爲默認主機,後面就能夠不加任何參數使用git push了,-u 參數指定一個默認主機 git push -u origin master
# 下載遠程倉庫的全部變更 $ git fetch [remote] # 顯示全部遠程倉庫 $ git remote -v # 顯示某個遠程倉庫的信息 $ git remote show [remote] # 增長一個新的遠程倉庫,並命名 $ git remote add [shortname] [url] # 取回遠程倉庫的變化,並與本地分支合併 $ git pull [remote] [branch] # 上傳本地指定分支到遠程倉庫 $ git push [remote] [branch] # 強行推送當前分支到遠程倉庫,即便有衝突 $ git push [remote] --force # 推送全部分支到遠程倉庫 $ git push [remote] --all #簡單查看遠程---全部倉庫 git remote (只能查看遠程倉庫的名字) #查看單個倉庫 git remote show [remote-branch-name] #新建遠程倉庫 git remote add [branchname] [url] #修改遠程倉庫 git remote rename [oldname] [newname] #刪除遠程倉庫 git remote rm [remote-name] #獲取遠程倉庫數據 git fetch [remote-name] (獲取倉庫全部更新,但不自動合併當前分支) git pull (獲取倉庫全部更新,並自動合併到當前分支) #上傳數據,如git push origin master git push [remote-name] [branch]
克隆:
遠程操做的第一步,一般是從遠程主機克隆一個版本庫,這時就要用到git clone
命令。
#在本地主機生成一個目錄,與遠程主機的版本庫同名 $ git clone <版本庫的網址> #要指定不一樣的目錄名,能夠將目錄名做爲git clone命令的第二個參數 $ git clone <版本庫的網址> <本地目錄名> #克隆版本庫的時候,所使用的遠程主機自動被Git命名爲origin。若是想用其餘的主機名,須要用git clone命令的-o選項指定。 $ git clone -o WeUI https://github.com/Tencent/weui.git