git的用法

一、版本控制器的分類

1.一、本地版本控制

記錄文件每次的更新,能夠對每一個版本作一個快照,或是記錄補丁文件,適合我的用,如RCS。git

1.二、集中版本控制

全部的版本數據都保存在服務器上,協同開發者從服務器上同步更新或上傳本身的修改github

全部的版本數據都存在服務器上,用戶的本地只有本身之前所同步的版本,若是不連網的話,用戶就看不到歷史版本,也沒法切換版本驗證問題,或在不一樣分支工做。並且,全部數據都保存在單一的服務器上,有很大的風險這個服務器會損壞,這樣就會丟失全部的數據,固然能夠按期備份。表明產品:SVN、CVS、VSS數據庫

 

 

 

 

1.三、分佈式版本控制

全部版本信息倉庫所有同步到本地的每一個用戶,這樣就能夠在本地查看全部版本歷史,能夠離線在本地提交,只需在連網時push到相應的服務器或其餘用戶那裏。因爲每一個用戶那裏保存的都是全部的版本數據,只要有一個用戶的設備沒有問題就能夠恢復全部的數據,但這增長了本地存儲空間的佔用。安全

 

 

二、GIT

Git是目前世界上最早進的分佈式版本控制系統。服務器

Git是免費、開源的編輯器

 

優勢:分佈式

  • 適合分佈式開發,強調個體。
  • 公共服務器壓力和數據量都不會太大。
  • 速度快、靈活。
  • 任意兩個開發者之間能夠很容易的解決衝突。
  • 離線工做。

缺點:工具

  • 模式上比SVN更加複雜。
  • 不符合常規思惟。
  • 代碼保密性差,一旦開發者把整個庫克隆下來就能夠徹底公開全部代碼和版本信息

二、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文件操做

3.一、工做區域

Git本地有三個工做區域:工做目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)。若是在加上遠程的git倉庫(Remote Directory)就能夠分爲四個工做區域。文件在這四個區域之間的轉換關係以下:

  • Workspace:工做區,就是你平時存放項目代碼的地方
  • Index / Stage:暫存區,用於臨時存放你的改動,事實上它只是一個文件,保存即將提交到文件列表信息
  • Repository:倉庫區(或本地倉庫),就是安全存放數據的位置,這裏面有你提交到全部版本的數據。其中HEAD指向最新放入倉庫的版本
  • Remote:遠程倉庫,託管代碼的服務器,能夠簡單的認爲是你項目組中的一臺電腦用於遠程數據交換

3.二、工做流程

git的工做流程通常是這樣的:

3.2.一、在工做目錄中添加、修改文件;

3.2.二、將須要進行版本管理的文件放入暫存區域;

3.2.三、將暫存區域的文件提交到git倉庫。

所以,git管理的文件有三種狀態:已修改(modified),已暫存(staged),已提交(committed)

3.三、建立倉庫

全新倉庫

# 在當前目錄新建一個Git代碼庫
$ git init

# 新建一個目錄,將其初始化爲Git代碼庫
$ git init [project-name]

克隆遠程倉庫
因爲是將遠程服務器上的倉庫徹底鏡像一份至本地,而不是取某一個特定版本,因此用clone而不是checkout,語法格式以下

# 克隆一個項目和它的整個代碼歷史(版本信息)
$ git clone [url]

3.四、文件操做

文件的四種狀態

 

  • 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"文件,此文件有以下規則:

  1. 忽略文件中的空行或以井號(#)開始的行將會被忽略。
  2. 可使用Linux通配符。例如:星號(*)表明任意多個字符,問號(?)表明一個字符,方括號([abc])表明可選字符範圍,大括號({string1,string2,...})表明可選的字符串等。
  3. 若是名稱的最前面有一個感嘆號(!),表示例外規則,將不被忽略。
  4. 若是名稱的最前面是一個路徑分隔符(/),表示要忽略的文件在此目錄下,而子目錄中的文件不忽略。
  5. 若是名稱的最後面是一個路徑分隔符(/),表示要忽略的是此目錄下該名稱的子目錄,而非文件(默認文件或目錄都忽略)。
#爲註釋
*.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分支

基本語句:

# 列出全部本地分支
$ 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
相關文章
相關標籤/搜索