版本控制(Revision control)是一種在開發的過程當中用於管理咱們對文件、目錄或工程等內容的修改歷史,方便查看更改歷史記錄,備份以便恢復之前的版本的軟件工程技術。html
簡單說就是用於管理多人協同開發項目的技術。java
沒有進行版本控制或者版本控制自己缺少正確的流程管理,在軟件開發過程當中將會引入不少問題,如軟件代碼的一致性、軟件內容的冗餘、軟件過程的事物性、軟件開發過程當中的併發性、軟件源代碼的安全性,以及軟件的整合等問題。git
1)、倉庫(Repository)
受版本控制的全部文件修訂歷史的共享數據庫程序員
2)、工做空間(Workspace)
本地硬盤或Unix 用戶賬戶上編輯的文件副本github
3)、工做樹/區(Working tree)
工做區中包含了倉庫的工做文件。您能夠修改的內容和提交更改做爲新的提交到倉庫。正則表達式
4)、暫存區(Staging area)
暫存區是工做區用來提交更改(commit)前能夠暫存工做區的變化。算法
5)、索引(Index)
索引是暫存區的另外一種術語。shell
6)、簽入(Checkin)
將新版本複製回倉庫數據庫
7)、簽出(Checkout)
從倉庫中將文件的最新修訂版本複製到工做空間windows
8)、提交(Commit)
對各自文件的工做副本作了更改,並將這些更改提交到倉庫
9)、衝突(Conflict)
多人對同一文件的工做副本進行更改,並將這些更改提交到倉庫
10)、合併(Merge)
將某分支上的更改聯接到此主幹或同爲主幹的另外一個分支
11)、分支(Branch)
從主線上分離開的副本,默認分支叫master
12)、鎖(Lock)
得到修改文件的專有權限。
13)、頭(HEAD)
頭是一個象徵性的參考,最經常使用以指向當前選擇的分支。
14)、修訂(Revision)
表示代碼的一個版本狀態。Git經過用SHA1 hash算法表示的ID來標識不一樣的版本。
15)、標記(Tags)
標記指的是某個分支某個特定時間點的狀態。經過標記,能夠很方便的切換到標記時的狀態。
主流的版本控制器有以下這些:
版本控制產品很是的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),如今影響力最大且使用最普遍的是Git與SVN
記錄文件每次的更新,能夠對每一個版本作一個快照,或是記錄補丁文件,適合我的用,如RCS。
全部的版本數據都保存在服務器上,協同開發者從服務器上同步更新或上傳本身的修改
全部的版本數據都存在服務器上,用戶的本地只有本身之前所同步的版本,若是不連網的話,用戶就看不到歷史版本,也沒法切換版本驗證問題,或在不一樣分支工做。並且,全部數據都保存在單一的服務器上,有很大的風險這個服務器會損壞,這樣就會丟失全部的數據,固然能夠按期備份。表明產品:SVN、CVS、VSS
全部版本信息倉庫所有同步到本地的每一個用戶,這樣就能夠在本地查看全部版本歷史,能夠離線在本地提交,只需在連網時push到相應的服務器或其餘用戶那裏。因爲每一個用戶那裏保存的都是全部的版本數據,只要有一個用戶的設備沒有問題就能夠恢復全部的數據,但這增長了本地存儲空間的佔用。
SVN是集中式版本控制系統,版本庫是集中放在中央服務器的,而工做的時候,用的都是本身的電腦,因此首先要從中央服務器獲得最新的版本,而後工做,完成工做後,須要把本身作完的活推送到中央服務器。集中式版本控制系統是必須聯網才能工做,對網絡帶寬要求較高。
Git是分佈式版本控制系統,沒有中央服務器,每一個人的電腦就是一個完整的版本庫,工做的時候不須要聯網了,由於版本都在本身電腦上。協同的方法是這樣的:好比說本身在電腦上改了文件A,其餘人也在電腦上改了文件A,這時,大家兩之間只需把各自的修改推送給對方,就能夠互相看到對方的修改了。
Git是目前世界上最早進的分佈式版本控制系統。
Git是免費、開源的
最初Git是爲輔助 Linux 內核開發的,來替代 BitKeeper
做者:Linux和Git之父李納斯·託沃茲(Linus Benedic Torvalds)196九、芬蘭
優勢:
缺點:
源碼: https://github.com/git/git/
打開 git官網,下載git對應操做系統的版本。
選擇版本:
這裏我選擇下載64-bit Git for Windows Setup
選擇安裝配置信息
一直Next默認就行了,若是須要設置就要仔細讀一下安裝界面上的選項。
安裝成功後在開始菜單中會有Git項,菜單下有3個程序:
Git Bash:Unix與Linux風格的命令行,使用最多,推薦最多
與DOS風格的命令有些區別,不習慣能夠選擇Git CMD
Git CMD:Windows風格的命令行
Git GUI:圖形界面的Git,不建議初學者使用,儘可能先熟悉經常使用命令
點擊Create New Repository能夠直接建立一個新的倉庫。
Linux安裝Git:sudo apt-get install git 命令行就能夠安裝了。
Mac OS安裝Git: https://git-scm.com/download/mac,下載雙擊.pkg安裝
1)、cd : 改變目錄。
2)、cd . . 回退到上一個目錄,直接cd進入默認目錄
3)、pwd : 顯示當前所在的目錄路徑。
4)、ls(ll): 都是列出當前目錄中的全部文件,只不過ll(兩個ll)列出的內容更爲詳細。
5)、touch : 新建一個文件 如 touch index.js 就會在當前目錄下新建一個index.js文件。
6)、rm: 刪除一個文件, rm index.js 就會把index.js文件刪除。
7)、mkdir: 新建一個目錄,就是新建一個文件夾。
8)、rm -r : 刪除一個文件夾, rm -r src 刪除src目錄, 好像不能用通配符。
9)、mv 移動文件, mv index.html src index.html 是咱們要移動的文件, src 是目標文件夾,固然, 這樣寫,必須保證文件和目標文件夾在同一目錄下。
10)、reset 從新初始化終端/清屏。
11)、clear 清屏。
12)、history 查看命令歷史。
13)、help 幫助。
14)、exit 退出。
15)、#表示註釋
使用git config -l 能夠查看如今的git環境詳細配置
查看不一樣級別的配置文件:
#查看系統config git config --system --list #查看當前用戶(global)配置 git config --global --list #查看當前倉庫配置信息 git config --local --list
在Windows系統中,Git在$HOME目錄中查找.gitconfig文件(通常位於C:\Documents and Settings\$USER下)
Git相關的配置文件有三個:
1)、 /etc/gitconfig:包含了適用於系統全部用戶和全部項目的值。(Win:C:\Program Files\Git\mingw64\etc\gitconfig) --system 系統級
2)、~/.gitconfig:只適用於當前登陸用戶的配置。(Win:C:\Users\Administrator\.gitconfig) --global 全局
3)、位於git項目目錄中的.git/config:適用於特定git項目的配置。(Win:C:\gitProject) --local當前項目
注意:對於同一配置項,三個配置文件的優先級是1<2<3
這裏能夠直接編輯配置文件,經過命令設置後會響應到這裏。
當你安裝Git後首先要作的事情是設置你的用戶名稱和e-mail地址。這是很是重要的,由於每次Git提交都會使用該信息。它被永遠的嵌入到了你的提交中:
$ git config --global user.name "zhangguo" #名稱 $ git config --global user.email zhangguo@qq.com #郵箱
只須要作一次這個設置,若是你傳遞了--global 選項,由於Git將老是會使用該信息來處理你在系統中所作的一切操做。若是你但願在一個特定的項目中使用不一樣的名稱或e-mail地址,你能夠在該項目中運行該命令而不要--global選項。 總之--global爲全局配置,不加爲某個項目的特定配置。
git config [--local|--global|--system] section.key value [--local|--global|--system] #可選的,對應本地,全局,系統不一樣級別的設置,請看2.3.2 section.key #區域下的鍵 value #對應的值
--local 項目級
--global 當前用戶級
--system 系統級
例如咱們要在student區域下添加一個名稱爲height值爲198的配置項,執行結果以下:
2)、刪除配置項
git config [--local|--global|--system] --unset section.key
將系統級的height配置項移除
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 #差別分析工具 core.paper "less -N" #配置顯示方式 color.diff true #diff顏色配置 alias.co checkout #設置別名 git config user.name #得到用戶名 git config core.filemode false #忽略修改權限的文件
全部config命令參數
語法: git config [<options>] 文件位置 --global #use global config file 使用全局配置文件 --system #use system config file 使用系統配置文件 --local #use repository config file 使用存儲庫配置文件 -f, --file <file> #use given config file 使用給定的配置文件 --blob <blob-id> #read config from given blob object 從給定的對象中讀取配置 動做 --get #get value: name [value-regex] 得到值:[值]名[正則表達式] --get-all #get all values: key [value-regex] 得到全部值:[值]名[正則表達式] --get-regexp #get values for regexp: name-regex [value-regex] 獲得的值根據正則 --get-urlmatch #get value specific for the URL: section[.var] URL 爲URL獲取特定的值 --replace-all #replace all matching variables: name value [value_regex] 替換全部匹配的變量:名稱值[ value_regex ] --add #add a new variable: name value 添加一個新變量:name值 --unset #remove a variable: name [value-regex] 刪除一個變量名[值]:正則表達式 --unset-all #remove all matches: name [value-regex] 刪除全部匹配的正則表達式:名稱[值] --rename-section #rename section: old-name new-name 重命名部分:舊名稱 新名稱 --remove-section #remove a section: name 刪除部分:名稱 -l, --list #list all 列出全部 -e, --edit #open an editor 打開一個編輯器 --get-color #find the color configured: slot [default] 找到配置的顏色:插槽[默認] --get-colorbool #find the color setting: slot [stdout-is-tty] 發現顏色設置:槽[ stdout是TTY ] 類型 --bool #value is "true" or "false" 值是「真」或「假」。 --int #value is decimal number 值是十進制數。 --bool-or-int #value is --bool or --int 值--布爾或int --path #value is a path (file or directory name) 值是路徑(文件或目錄名) 其它 -z, --null #terminate values with NUL byte 終止值與null字節 --name-only #show variable names only 只顯示變量名 --includes #respect include directives on lookup 尊重包括查找指令 --show-origin #show origin of config (file, standard input, blob, command line) 顯示配置(文件、標準輸入、數據塊、命令行)的來源
Git本地有三個工做區域:工做目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)。若是在加上遠程的git倉庫(Remote Directory)就能夠分爲四個工做區域。文件在這四個區域之間的轉換關係以下:
本地的三個區域確切的說應該是git倉庫中HEAD指向的版本
git的工做流程通常是這樣的:
1、在工做目錄中添加、修改文件;
2、將須要進行版本管理的文件放入暫存區域;
3、將暫存區域的文件提交到git倉庫。
所以,git管理的文件有三種狀態:已修改(modified),已暫存(staged),已提交(committed)
我的認爲Git的原理相比別的版本控制器仍是複雜一些的,有一份圖解教程比較直觀:
工做目錄(WorkSpace)通常就是你但願Git幫助你管理的文件夾,能夠是你項目的目錄,也能夠是一個空目錄,建議不要有中文。
平常使用只要記住下圖6個命令:
建立本地倉庫的方法有兩種:一種是建立全新的倉庫,另外一種是克隆遠程倉庫。
須要用GIT管理的項目的根目錄執行:
# 在當前目錄新建一個Git代碼庫 $ git init
執行:
結果:
執行後能夠看到,僅僅在項目目錄多出了一個.git目錄,關於版本等的全部信息都在這個目錄裏面。
固然若是使用以下命令,能夠把建立目錄與倉庫一塊兒完成:
# 新建一個目錄,將其初始化爲Git代碼庫 $ git init [project-name]
執行命令與運行結果:
另外一種方式是克隆遠程目錄,因爲是將遠程服務器上的倉庫徹底鏡像一份至本地,而不是取某一個特定版本,因此用clone而不是checkout,語法格式以下:
# 克隆一個項目和它的整個代碼歷史(版本信息) $ git clone [url]
執行:
好比咱們要從克隆的遠程倉庫託管在github上,地址爲:https://github.com/zhangguo5/SuperPlus.git,這是一個公開的項目
結果:
版本控制就是對文件的版本控制,要對文件進行修改、提交等操做,首先要知道文件當前在什麼狀態,否則可能會提交了如今還不想提交的文件,或者要提交的文件沒提交上。GIT不關心文件兩個版本之間的具體差異,而是關心文件的總體是否有改變,若文件被改變,在添加提交時就生成文件新版本的快照,而判斷文件總體是否改變的方法就是用SHA-1算法計算文件的校驗和。
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
上面說文件有4種狀態,經過以下命令能夠查看到文件的狀態:
#查看指定文件狀態 git status [filename] #查看全部文件狀態 git status
命令:
結果:
foo.htm文件的狀態爲untracked(未跟蹤),提示經過git add能夠暫存
GIT在這一點作得很好,在輸出每一個文件狀態的同時還說明了怎麼操做,像上圖就有怎麼暫存、怎麼跟蹤文件、怎麼取消暫存的說明。
工做區(Working Directory)就是你在電腦裏能看到的目錄。
版本庫(Repository)工做區有一個隱藏目錄.git
,這個不算工做區,而是Git的版本庫。
Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master
,以及指向master
的一個指針叫HEAD
。
將untracked狀態的文件添加到暫存區,語法格式以下:
# 添加指定文件到暫存區 $ git add [file1] [file2] ... # 添加指定目錄到暫存區,包括子目錄 $ git add [dir] # 添加當前目錄的全部文件到暫存區 $ git add .
執行:
當執行以下命令時,會直接從暫存區刪除文件,工做區則不作出改變
#直接從暫存區刪除文件,工做區則不作出改變 git rm --cached <file>
執行命令
經過重寫目錄樹移除add文件:
#若是已經用add 命令把文件加入stage了,就先須要從stage中撤銷 git reset HEAD <file>...
當執行 「git reset HEAD」 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,可是工做區不受影響。
示例:把f1.txt文件從暫存區撤回工做區
移除全部未跟蹤文件
#移除全部未跟蹤文件 #通常會加上參數-df,-d表示包含目錄,-f表示強制清除。 git clean [options]
示例:
移除前:
執行移除:
移除後:
#只從stage中刪除,保留物理文件 git rm --cached readme.txt #不但從stage中刪除,同時刪除物理文件 git rm readme.txt #把a.txt更名爲b.txt git mv a.txt b.txt
當執行提交操做(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會作相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
當執行 「git reset HEAD」 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,可是工做區不受影響。
當執行 「git rm –cached <file>」 命令時,會直接從暫存區刪除文件,工做區則不作出改變。
當執行 「git checkout .」 或者 「git checkout — <file>」 命令時,會用暫存區所有或指定的文件替換工做區的文件。這個操做很危險,會清除工做區中未添加到暫存區的改動。
當執行 「git checkout HEAD .」 或者 「git checkout HEAD <file>」 命令時,會用 HEAD 指向的 master 分支中的所有或者部分文件替換暫存區和以及工做區中的文件。這個命令也是極具危險性的,由於不但會清除工做區中未提交的改動,也會清除暫存區中未提交的改 動。
git diff用於顯示WorkSpace中的文件和暫存區文件的差別
用"git status"只能查看對哪些文件作了改動,若是要看改動了什麼,能夠用:
#查看文件修改後的差別 git diff [files]
命令:
---a表示修改以前的文件,+++b表示修改後的文件
#比較暫存區的文件與以前已經提交過的文件 git diff --cached
也能夠把WorkSpace中的狀態和repo中的狀態進行diff,命令以下:
#比較repo與工做空間中的文件差別 git diff HEAD~n
若是倉庫中已經存在文件f4.txt,在工做區中對f4修改了,若是想撤銷可使用checkout,簽出覆蓋
檢出命令git checkout是git最經常使用的命令之一,同時也是一個很危險的命令,由於這條命令會重寫工做區
語法:
#用法一 git checkout [-q] [<commit>] [--] <paths>... #用法二 git checkout [<branch>] #用法三 git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>]
<commit>是可選項,若是省略則至關於從暫存區(index)進行檢出
$ git checkout branch #檢出branch分支。要完成圖中的三個步驟,更新HEAD以指向branch分支,以及用branch 指向的樹更新暫存區和工做區。 $ git checkout #彙總顯示工做區、暫存區與HEAD的差別。 $ git checkout HEAD #同上 $ git checkout -- filename #用暫存區中filename文件來覆蓋工做區中的filename文件。至關於取消自上次執行git add filename以來(若是執行過)的本地修改。 $ git checkout branch -- filename #維持HEAD的指向不變。用branch所指向的提交中filename替換暫存區和工做區中相 應的文件。注意會將暫存區和工做區中的filename文件直接覆蓋。 $ git checkout -- . 或寫做 git checkout . #注意git checkout 命令後的參數爲一個點(「.」)。這條命令最危險!會取消全部本地的 #修改(相對於暫存區)。至關於用暫存區的全部文件直接覆蓋本地文件,不給用戶任何確認的機會! $ git checkout commit_id -- file_name #若是不加commit_id,那麼git checkout -- file_name 表示恢復文件到本地版本庫中最新的狀態。
示例:
有些時候咱們不想把某些文件歸入版本控制中,好比數據庫文件,臨時文件,設計文件等
在主目錄下創建".gitignore"文件,此文件有以下規則:
如:
#爲註釋 *.txt #忽略全部 .txt結尾的文件 !lib.txt #但lib.txt除外 /temp #僅忽略項目根目錄下的TODO文件,不包括其它目錄temp build/ #忽略build/目錄下的全部文件 doc/*.txt #會忽略 doc/notes.txt 但不包括 doc/server/arch.txt
示例:
建立一個.gitignore文件忽視全部的日誌文件
查看狀態:
從上圖中能夠看出2個日誌文件並無添加到暫存區,直接被忽視了。
針對各類語言與項目的Git忽視文件: https://github.com/kaedei/gitignore https://github.com/github/gitignore
通用的java忽視文件:
# Compiled class file *.class # Log file *.log # BlueJ files *.ctxt # Mobile Tools for Java (J2ME) .mtj.tmp/ # Package Files # *.jar *.war *.ear *.zip *.tar.gz *.rar # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid*
通用的Visual Studio開發項目忽視文件:
經過add只是將文件或目錄添加到了index暫存區,使用commit能夠實現將暫存區的文件提交到本地倉庫。
# 提交暫存區到倉庫區 $ git commit -m [message] # 提交暫存區的指定文件到倉庫區 $ git commit [file1] [file2] ... -m [message] # 提交工做區自上次commit以後的變化,直接到倉庫區,跳過了add,對新文件無效 $ git commit -a # 提交時顯示全部diff信息 $ git commit -v # 使用一次新的commit,替代上一次提交 # 若是代碼沒有任何新變化,則用來改寫上一次commit的提交信息 $ git commit --amend -m [message] # 重作上一次commit,幷包括指定文件的新變化 $ git commit --amend [file1] [file2] ...
示例:
提交前的狀態
提交:
提交後的狀態:
從上圖中能夠看出暫存區中沒有了bar.htm
修訂提交
若是咱們提交事後發現有個文件改錯了,或者只是想修改提交說明,這時能夠對相應文件作出修改,將修改過的文件經過"git add"添加到暫存區,而後執行如下命令:
#修訂提交 git commit --amend
撤銷提交(commit)
原理就是放棄工做區和index的改動,同時HEAD指針指向前一個commit對象
#撤銷上一次的提交 git reset --hard HEAD~1
要經過git log查看提交日誌,也可直接指定提交編號或序號
示例:
撤銷提交
git revert <commit-id>
這條命令會把指定的提交的全部修改回滾,並同時生成一個新的提交。
查看提交日誌可使用git log指令,語法格式以下:
#查看提交日誌 git log [<options>] [<revision range>] [[\--] <path>…]
示例:
"git log --graph"以圖形化的方式顯示提交歷史的關係,這就能夠方便地查看提交歷史的分支信息,固然是控制檯用字符畫出來的圖形。
"git log -1"則表示顯示1行。
使用history能夠查看您在bash下輸入過的指令:
幾乎全部輸入過的都被記錄下來的,不愧是作版本控制的。
查看全部分支日誌
"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])*
示例:
1)、撤銷暫存區更新
使用"git add"把更新提交到了暫存區。這時"git status"的輸出中提示咱們能夠經過"git reset HEAD <file>..."把暫存區的更新移出到WorkSpace中
示例:f6已經提交,工做區修改,暫存區修改,撤銷
2)、撤銷本地倉庫更新
使用git log查看提交日誌
撤銷提交有兩種方式:使用HEAD指針和使用commit id
在Git中,有一個HEAD指針指向當前分支中最新的提交。當前版本,咱們使用"HEAD^",那麼再錢一個版本可使用"HEAD^^",若是想回退到更早的提交,可使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2)
git reset --hard HEAD^ git reset --hard HEAD~1 git reset --59cf9334cf957535cb328f22a1579b84db0911e5
示例:回退到添加f6
回退前:
回退後:
如今又想恢復被撤銷的提交可用"git reflog"查看倉庫中全部的分支的全部更新記錄,包括已經撤銷的更新,撤銷方法與前面同樣。
git reset --hard HEAD@{7} git reset --hard e0e79d7
--hard:撤銷並刪除相應的更新
--soft:撤銷相應的更新,把這些更新的內容放到Stage中
1)、刪除未跟蹤文件
若是文件仍是未跟蹤狀態,直接刪除文件就可了,bash中使用rm能夠刪除文件,示例以下:
2)、刪除已提交文件
-f 強制刪除,物理刪除了,同時刪除工做區和暫存區中的文件
撤銷刪除:
#to discard changes in working directory git checkout -- <file>...
3)、刪除暫存區的文件,不刪除工做區的文件
使用git reset HEAD <file>...一樣能夠實現上面的功能
Git很強大,很靈活,這是毋庸置疑的。但也正由於它的強大形成了它的複雜,所以會有不少奇奇怪怪的問題出現,多用就行了。
分支在GIT中相對較難
分支就是科幻電影裏面的平行宇宙,當你正在電腦前努力學習Git的時候,另外一個你正在另外一個平行宇宙裏努力學習SVN。
若是兩個平行宇宙互不干擾,那對如今的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,結果,你既學會了Git又學會了SVN!
分支在實際中有什麼用呢?假設你準備開發一個新功能,可是須要兩週才能完成,第一週你寫了50%的代碼,若是馬上提交,因爲代碼還沒寫完,不完整的代碼庫會致使別人不能幹活了。若是等代碼所有寫完再一次提交,又存在丟失天天進度的巨大風險。
如今有了分支,就不用怕了。你建立了一個屬於你本身的分支,別人看不到,還繼續在原來的分支上正常工做,而你在本身的分支上幹活,想提交就提交,直到開發完畢後,再一次性合併到原來的分支上,這樣,既安全,又不影響別人工做。
Git分支的速度很是快。
截止到目前,只有一條時間線,在Git裏,這個分支叫主分支,即master分支。HEAD嚴格來講不是指向提交,而是指向master,master纔是指向提交的,因此,HEAD指向的就是當前分支。
git分支中經常使用指令:
# 列出全部本地分支 $ git branch # 列出全部遠程分支 $ git branch -r # 列出全部本地分支和遠程分支 $ git branch -a # 新建一個分支,但依然停留在當前分支 $ git branch [branch-name] # 新建一個分支,並切換到該分支 $ git checkout -b [branch] # 新建一個分支,指向指定commit $ git branch [branch] [commit] # 新建一個分支,與指定的遠程分支創建追蹤關係 $ git branch --track [branch] [remote-branch] # 切換到指定分支,並更新工做區 $ git checkout [branch-name] # 切換到上一個分支 $ git checkout - # 創建追蹤關係,在現有分支與指定的遠程分支之間 $ git branch --set-upstream [branch] [remote-branch] # 合併指定分支到當前分支 $ git merge [branch] # 選擇一個commit,合併進當前分支 $ git cherry-pick [commit] # 刪除分支 $ git branch -d [branch-name] # 刪除遠程分支 $ git push origin --delete [branch-name] $ git branch -dr [remote/branch]
默認分支是這樣的,master是主分支
1)、新建一個分支,但依然停留在當前分支,使用:$ git branch [branch-name]
切換分支到dev1後的結果:
當咱們建立新的分支,例如dev
時,Git新建了一個指針叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示當前分支在dev
上:
你看,Git建立一個分支很快,由於除了增長一個dev
指針,改改HEAD
的指向,工做區的文件都沒有任何變化!
不過,從如今開始,對工做區的修改和提交就是針對dev
分支了,好比新提交一次後,dev
指針往前移動一步,而master
指針不變:
假如咱們在dev
上的工做完成了,就能夠把dev
合併到master
上。Git怎麼合併呢?最簡單的方法,就是直接把master
指向dev
的當前提交,就完成了合併:
因此Git合併分支也很快!就改改指針,工做區內容也不變!
合併完分支後,甚至能夠刪除dev
分支。刪除dev
分支就是把dev
指針給刪掉,刪掉後,咱們就剩下了一條master
分支:
2)、切換分支,git branch <name>,若是name爲-則爲上一個分支
切換爲上一個分支
3)、新建一個分支,並切換到該分支,$ git checkout -b [branch]
4)、新建一個分支,指向指定commit使用命令:$ git branch [branch] [commit]
上面建立了dev3分支且指向了master中首次提交的位置,切換到dev3查看日誌以下:
master上原本有兩個提交記錄的,此時的dev3指向的是第1次提交的位置
5)、新建一個分支,與指定的遠程分支創建追蹤關係使用命令:$ git branch --track [branch] [remote-branch]
1)、列出全部本地分支使用$ git branch
2)、列表全部遠程分支使用$ git branch -r
3)、列出全部本地分支和遠程分支使用$ git branch -a
合併指定分支到當前分支使用指令$ git merge [branch]
這裏的合併分支就是對分支的指針操做,咱們先建立一個分支再合併到主分支:
這裏的file11.txt主分支與dev6的內容如今是不一樣的,由於在dev6中已被修改過,咱們可使用指令查看:
如今咱們將dev6合併到主分支中去,從下圖中能夠看出dev6中有一次提交,而master並無
合併後在master上查看file11.txt文件內容與dev6上的內容就同樣了,合併後dev6中多出的提交在master也擁有了。
若是同一個文件在合併分支時都被修改了則會引發衝突,以下所示:
提交前兩個分支的狀態
在dev6分支中一樣修改file11.txt
dev6與master分支中file11.txt文件都被修改且提交了,如今合併分支
提示衝突,如今咱們看看file11.txt在master分支中的狀態
Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容,其中<<<HEAD是指主分支修改的內容,>>>>>dev6 是指dev6上修改的內容
解決的辦法是咱們能夠修改衝突文件後從新提交,請注意當前的狀態產master | MERGING:
從新提交後衝突解決:
手動解決完衝突後就能夠把此文件添 加到索引(index)中去,用git commit命令來提交,就像平時修改了一個文件 同樣。
用git log --graph命令能夠看到分支合併圖。
分支策略
master主分支應該很是穩定,用來發布新版本,通常狀況下不容許在上面工做,工做通常狀況下在新建的dev分支上工做,工做完後,好比上要發佈,或者說dev分支代碼穩定後能夠合併到主分支master上來。
刪除本地分支可使用命令:$ git branch -d [branch-name],-D(大寫)強制刪除
刪除遠程分支可使用以下指令:
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
-d表示刪除分支。分支必須徹底合併在其上游分支,或者在HEAD上沒有設置上游
-r表示遠程的意思remotes,若是-dr則表示刪除遠程分支
經過命令行能夠深入的理解Git,Git GUI或IDE插件卻能夠更加直觀操做Git,經常使用的Git GUI有以下這些:
全球開發人員交友俱樂部提供的強大工具,功能完善,使用方便。對於使用GitHub的開發人員來講是很是便捷的工具。
GitHub for Desktop不帶三方合併工具,你必須本身手動解決衝突才能夠。
– 免費
– 同時支持 Windows 和 Mac:對於須要常常在不一樣的操做系統間切換的開發人員來講很是方便。
– 漂亮的界面:做爲天天盯着看的工具,顏值是很是重要的
– 支持Pull Request:直接從客戶端提交PR,很方便
– Timeline 支持:直接在時間線上顯示每次提交的時間點和大小
– 支持git LFS:存儲大文件更加節省空間和高效
– 不支持三方合併:須要藉助第三方工具才行
SourceTree是老牌的Git GUI管理工具了,也號稱是最好用的Git GUI工具。強大,功能豐富,基本操做和高級操做都設計得很是流暢,適合初學者上手,支持Git Flow。
– 免費
– 功能強大:不管你是新手仍是重度用戶,SourceTree 都會讓你以爲很順手。對於很是重度用戶,Source Tree還支持自定義腳本的執行。
– 同時支持 Windows 和 Mac 操做系統
– 同時支持 Git 和 Mercurial 兩種 VCS
– 內置GitHub, BitBucket 和 Stash 的支持:直接綁定賬號便可操做遠程repo
小烏龜,SVN的超普遍使用也使得這個超好用的Svn客戶端成了幾乎每一個開發人員的桌面必備軟件。小烏龜只提供Windows版本,提供中文版支持的。
– 免費
– 只支持Windows操做系統:與文件管理器的良好集成
– 中文界面
– 與TortoiseSVN一脈相承的操做體驗
安裝Git時會集成安裝Gui工具,在Git菜單下能夠找到,特色是:免費、簡單、不須要額外安裝
對於使用IDE進行開發的程序員來講,能夠不離開經常使用的IDE就直接操做源代碼管理系統是最好的選擇,如下是我對幾個常見的IDE集成的git客戶端:
做爲Java集成開發環境的表明,Eclipse內置了egit這個插件來提供git的集成支持。實話實說,這個插件的功能很是豐富,不管是普通的clone, commit, pull/push操做;仍是複雜一些的git flow都有支持。
VS裏面的Git支持已經至關的完善。直接克隆github上的repo
1)、幫助文檔
完整的安裝了Git後有一個官方幫助,這是最權威的資料,方法以下:
好比咱們要查看git commit的使用
執行時會打開對應的git幫助文檔,其實就在本地,固然您也能夠去官網在線搜索,地址是: https://git-scm.com/docs。
2)、信息查看與統計命令
#統計某人的代碼提交量,包括增長,刪除: git log --author="$(git config --get user.name)" --pretty=tformat: --numstat | gawk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }' - #倉庫提交者排名前 5(若是看所有,去掉 head 管道便可): git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5 #倉庫提交者(郵箱)排名前 5:這個統計可能不會太準,由於不少人有不一樣的郵箱,但會使用相同的名字 git log --pretty=format:%ae | gawk -- '{ ++c[$0]; } END { for(cc in c) printf "%5d %s\n",c[cc],cc; }' | sort -u -n -r | head -n 5 #貢獻者統計: git log --pretty='%aN' | sort -u | wc -l #提交數統計: git log --oneline | wc -l # 顯示有變動的文件 $ git status # 顯示當前分支的版本歷史 $ git log # 顯示commit歷史,以及每次commit發生變動的文件 $ git log --stat # 搜索提交歷史,根據關鍵詞 $ git log -S [keyword] # 顯示某個commit以後的全部變更,每一個commit佔據一行 $ git log [tag] HEAD --pretty=format:%s # 顯示某個commit以後的全部變更,其"提交說明"必須符合搜索條件 $ git log [tag] HEAD --grep feature # 顯示某個文件的版本歷史,包括文件更名 $ git log --follow [file] $ git whatchanged [file] # 顯示指定文件相關的每一次diff $ git log -p [file] # 顯示過去5次提交 $ git log -5 --pretty --oneline # 顯示全部提交過的用戶,按提交次數排序 $ git shortlog -sn # 顯示指定文件是什麼人在什麼時間修改過 $ git blame [file] # 顯示暫存區和工做區的差別 $ git diff # 顯示暫存區和上一個commit的差別 $ git diff --cached [file] # 顯示工做區與當前分支最新commit之間的差別 $ git diff HEAD # 顯示兩次提交之間的差別 $ git diff [first-branch]...[second-branch] # 顯示今天你寫了多少行代碼 $ git diff --shortstat "@{0 day ago}" # 顯示某次提交的元數據和內容變化 $ git show [commit] # 顯示某次提交發生變化的文件 $ git show --name-only [commit] # 顯示某次提交時,某個文件的內容 $ git show [commit]:[filename] # 顯示當前分支的最近幾回提交 $ git reflog
示例:
Git是分佈式版本控制系統,同一個Git倉庫,能夠分佈到不一樣的機器上,但開發參與者必須在同一個網絡中,且必須有一個項目的原始版本,一般的辦法是讓一臺電腦充當服務器的角色,天天24小時開機,其餘每一個人都從這個「服務器」倉庫克隆一份到本身的電腦上,而且各自把各自的提交推送到服務器倉庫裏,也從服務器倉庫中拉取別人的提交。徹底能夠本身搭建一臺運行Git的服務器但如今更適合的作法是使用免費的託管平臺。
同時相較於傳統的代碼都是管理到本機或者內網。 一旦本機或者內網機器出問題,代碼可能會丟失,使用遠端代碼倉庫將永遠存在一個備份。同時也免去了搭建本地代碼版本控制服務的繁瑣。 雲計算時代 Git 以其強大的分支和克隆功能,更加方便了開發者遠程協做。
Git代碼託管平臺,首先推薦的是GitHub,好多好的開源項目都來自GitHub,可是GitHub只能新建公開的Git倉庫,私有倉庫要收費,有時候訪問比較卡,若是你作的是一個開源項目,能夠首選GitHub。下面推薦幾個比較好的Git代碼託管平臺:
關於GItHub相信你們都有耳聞,我就不詳細介紹了。GitHub地址: https://github.com/,其首頁如圖:
對於有些人,提到GitHub就會天然的想到Gitlab,Gitlab支持無限的公有項目和私有項目。Gitlab地址: https://about.gitlab.com/,其首頁截圖如圖:
bitbucket免費支持5個開發成員的團隊建立無限私有代碼託管庫。bitbucket地址:
開源中國一個帳號最多能夠建立1000個項目,包含公有和私有,開源中國代碼託管地址: http://git.oschina.net/,其首頁如圖:
談到coding.net,首先必須提的是速度快,功能與開源中國類似,一樣一個帳號最多能夠建立1000個項目(5個私有),也支持任務的建立等。coding.net地址: https://coding.net/:
我我的比較推薦Coding.net、GItHub。
固然還有許多,如CSDN,百度,阿里等,歡迎你們比較後推薦。
選擇國外的主機請考慮網速,選擇國內的主機請考慮穩定與安全性。
由於coding.net免費,能夠建立私有項目,且速度不錯,這裏咱們以coding.net爲託管平臺完成遠程倉庫的賬號申請與操做。
1)、打開 https://coding.net/,點擊右上角的註冊按鈕:
2)、填寫好註冊信息經過郵箱或手機驗證後註冊就成功了。登陸到我的首頁。
若是是QQ郵箱請注意激活郵件可能會被當着垃圾郵件,到垃圾箱中能夠找到。
登陸成功後,點擊左側菜單項目,點擊加號新建項目,這裏建立的是一個公開項目,沒有Readme.md、許可證與忽視文件,緣由是若是你本地已經有一個項目了,想提交到遠程倉庫而新建立的3個文件本地沒有,固然有辦法但初學避免麻煩這裏我就不添加這三個文件了,輸入相關信息後點擊建立就成功了。
從上圖能夠看出建立地址有兩種:
https 類型的:https://git.coding.net/zhangguoGit/project7.git
SSH類型的:git@git.coding.net:zhangguoGit/project7.git
使用加密的網頁訪問通道讀寫倉庫,使用用戶名及密碼進行鑑權。 避免重複輸入密碼,查看 怎樣在每次 Push 時不用重複輸入密碼?
提示:Git 用戶名爲 Coding 的帳戶郵箱或者個性後綴,密碼爲 Coding 的帳戶密碼。
注意:HTTPS 方式 push 大文件可能引起錯誤,查看 Push 出錯怎麼辦?
SSH全稱(Secure SHell)是一種網絡協議,顧名思義就是很是安全的shell,主要用於計算機間加密傳輸。
使用加密通道讀寫倉庫,無單次上傳限制,需先設置 「帳戶 SSH 公鑰」,完成配對驗證。
導入倉庫能夠將已存在的Git項目或SVN項目直接導入。
在命令行建立項目:
#一、建立目錄 mkdir project7 #二、進入目錄 cd project7 #三、初始化目錄爲git項目 git init #四、建立md文件追加內容# project7(一級標題) echo "# project7" >> README.md #五、添加說明文件到暫存區 git add README.md #六、提交到本地倉庫並寫日誌 git commit -m "first commit" #七、添加遠程主機,主機名爲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
若是建立已經建立則只須要第7步與第8步就行了。
Markdown 是一種輕量級標記語言,它容許人們「使用易讀易寫的純文本格式編寫文檔,而後轉換成有效的XHTML(或者HTML)文檔。
Markdown 語法的目標是:成爲一種適用於網絡的書寫語言。
# 一級標題
## 二級標題
### 三級標題
#### 四級標題
##### 五級標題
###### 六級標題
####### 七級標題
效果:
分爲有序列表和無序列表。
有序列表
1. 1
2. 2
3. 3
無序列表
* 1
* 2
* 3
> 這是引用
二者格式區別在於「 ! 」。
![圖片描述](圖片連接)
[連接描述](連接地址)
**這是粗體**
*這是斜體*
| Tables | Are | Cool |
| ------------ |:------------:| -----:|
| col 3 is | right-aligned| $1600 |
| col 2 is | centered | $12 |
| zebra stripes| are neat | &1 |
用``這個把代碼包裹起來
輸入***
便可。
示例:
對應的HTML:
結果:
在線實時預覽工具
申請到了Git遠程倉庫的賬號並建立了一個空的遠程倉庫如今咱們就能夠結合本地的倉庫與遠程倉庫一塊兒協同工做了,模擬多人協同開發,這裏咱們所有使用命令完成。
# 下載遠程倉庫的全部變更 $ 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 https://github.com/zhangguo5/AngularJS04_BookStore.git
該命令會在本地主機生成一個目錄,與遠程主機的版本庫同名。若是要指定不一樣的目錄名,能夠將目錄名做爲git clone
命令的第二個參數。
$ git clone <版本庫的網址> <本地目錄名>
git clone
支持多種協議,除了HTTP(s)之外,還支持SSH、Git、本地文件協議等,下面是一些例子。
$ git clone http[s]://example.com/path/to/repo.git/ $ git clone ssh://example.com/path/to/repo.git/ $ git clone git://example.com/path/to/repo.git/ $ git clone /opt/git/project.git $ git clone file:///opt/git/project.git $ git clone ftp[s]://example.com/path/to/repo.git/ $ git clone rsync://example.com/path/to/repo.git/
SSH協議還有另外一種寫法。
$ git clone [user@]example.com:path/to/repo.git/
一般來講,Git協議下載速度最快,SSH協議用於須要用戶認證的場合。各類協議優劣的詳細討論請參考 官方文檔。
示例:
結果:
爲了便於管理,Git要求每一個遠程主機都必須指定一個主機名。git remote
命令就用於管理主機名。
不帶選項的時候,git remote
命令列出全部遠程主機。
$ git remote
使用-v
選項,能夠參看遠程主機的網址。
$ git remote -v
上面命令表示,當前只有一臺遠程主機,叫作origin,以及它的網址。
克隆版本庫的時候,所使用的遠程主機自動被Git命名爲origin
。若是想用其餘的主機名,須要用git clone
命令的-o
選項指定。
$ git clone -o WeUI https://github.com/Tencent/weui.git $ git remote
上面命令表示,克隆的時候,指定遠程主機叫作WeUI。
git remote show
命令加上主機名,能夠查看該主機的詳細信息。
$ git remote show <主機名>
git remote add
命令用於添加遠程主機。
$ git remote add <主機名> <網址>
git remote rm
命令用於刪除遠程主機。
$ git remote rm <主機名>
git remote rename
命令用於遠程主機的更名。
$ git remote rename <原主機名> <新主機名>
一旦遠程主機的版本庫有了更新(Git術語叫作commit),須要將這些更新取回本地,這時就要用到git fetch
命令。
$ git fetch <遠程主機名>
上面命令將某個遠程主機的更新,所有取回本地。
git fetch
命令一般用來查看其餘人的進程,由於它取回的代碼對你本地的開發代碼沒有影響。
默認狀況下,git fetch
取回全部分支(branch)的更新。若是隻想取回特定分支的更新,能夠指定分支名。
$ git fetch <遠程主機名> <分支名>
好比,取回origin
主機的master
分支。
$ git fetch origin master
所取回的更新,在本地主機上要用"遠程主機名/分支名"的形式讀取。好比origin
主機的master
,就要用origin/master
讀取。
git branch
命令的-r
選項,能夠用來查看遠程分支,-a
選項查看全部分支。
$ git branch -r origin/master $ git branch -a * master remotes/origin/master
上面命令表示,本地主機的當前分支是master
,遠程分支是origin/master
。
取回遠程主機的更新之後,能夠在它的基礎上,使用git checkout
命令建立一個新的分支。
$ git checkout -b newBrach origin/master
上面命令表示,在origin/master
的基礎上,建立一個新分支。
此外,也可使用git merge
命令或者git rebase
命令,在本地分支上合併遠程分支。
$ git merge origin/master # 或者 $ git rebase origin/master
上面命令表示在當前分支上,合併origin/master
。
git pull
命令的做用是,取回遠程主機某個分支的更新,再與本地的指定分支合併。它的完整格式稍稍有點複雜。
$ git pull <遠程主機名> <遠程分支名>:<本地分支名>
好比,取回origin
主機的next
分支,與本地的master
分支合併,須要寫成下面這樣。
$ git pull origin next:master
若是遠程分支是與當前分支合併,則冒號後面的部分能夠省略。
$ git pull origin next
上面命令表示,取回origin/next
分支,再與當前分支合併。實質上,這等同於先作git fetch
,再作git merge
。
$ git fetch origin $ git merge origin/next
在某些場合,Git會自動在本地分支與遠程分支之間,創建一種追蹤關係(tracking)。好比,在git clone
的時候,全部本地分支默認與遠程主機的同名分支,創建追蹤關係,也就是說,本地的master
分支自動"追蹤"origin/master
分支。
Git也容許手動創建追蹤關係。
git branch --set-upstream master origin/next
上面命令指定master
分支追蹤origin/next
分支。
若是當前分支與遠程分支存在追蹤關係,git pull
就能夠省略遠程分支名。
$ git pull origin
上面命令表示,本地的當前分支自動與對應的origin
主機"追蹤分支"(remote-tracking branch)進行合併。
若是當前分支只有一個追蹤分支,連遠程主機名均可以省略。
$ git pull
上面命令表示,當前分支自動與惟一一個追蹤分支進行合併。
若是合併須要採用rebase模式,可使用--rebase
選項。
$ git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名>
若是遠程主機刪除了某個分支,默認狀況下,git pull
不會在拉取遠程分支的時候,刪除對應的本地分支。這是爲了防止,因爲其餘人操做了遠程主機,致使git pull
不知不覺刪除了本地分支。
可是,你能夠改變這個行爲,加上參數 -p
就會在本地刪除遠程已經刪除的分支。
$ git pull -p # 等同於下面的命令 $ git fetch --prune origin $ git fetch -p
git push
命令用於將本地分支的更新,推送到遠程主機。它的格式與git pull
命令相仿。
$ git push <遠程主機名> <本地分支名>:<遠程分支名>
注意,分支推送順序的寫法是<來源地>:<目的地>,因此git pull
是<遠程分支>:<本地分支>,而git push
是<本地分支>:<遠程分支>。
若是省略遠程分支名,則表示將本地分支推送與之存在"追蹤關係"的遠程分支(一般二者同名),若是該遠程分支不存在,則會被新建。
$ git push origin master
上面命令表示,將本地的master
分支推送到origin
主機的master
分支。若是後者不存在,則會被新建。
若是省略本地分支名,則表示刪除指定的遠程分支,由於這等同於推送一個空的本地分支到遠程分支。
$ git push origin :master # 等同於 $ git push origin --delete master
上面命令表示刪除origin
主機的master
分支。
若是當前分支與遠程分支之間存在追蹤關係,則本地分支和遠程分支均可以省略。
$ git push origin
上面命令表示,將當前分支推送到origin
主機的對應分支。
若是是新建分支第一次push,會提示:
fatal: The current branch dev1 has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin dev1
輸入這行命令,而後輸入用戶名和密碼,就push成功了。
之後的push就只須要輸入git push origin
緣由是:
#由於在git的全局配置中,有一個push.default屬性,其決定了git push操做的默認行爲。在Git 2.0以前,這個屬性的默認被設爲'matching',2.0以後則被更改成了'simple'。 #咱們能夠經過git version肯定當前的git版本(若是小於2.0,更新是個更好的選擇),經過git config --global push.default 'option'改變push.default的默認行爲(或者也可直接編輯~/.gitconfig文件)。 push.default 有如下幾個可選值: nothing, current, upstream, simple, matching 其用途分別爲: nothing - push操做無效,除非顯式指定遠程分支,例如git push origin develop(我以爲。。。能夠給那些不肯學git的同事配上此項)。 current - push當前分支到遠程同名分支,若是遠程同名分支不存在則自動建立同名分支。 upstream - push當前分支到它的upstream分支上(這一項其實用於常常從本地分支push/pull到同一遠程倉庫的情景,這種模式叫作central workflow)。 simple - simple和upstream是類似的,只有一點不一樣,simple必須保證本地分支和它的遠程 upstream分支同名,不然會拒絕push操做。 matching - push全部本地和遠程兩端都存在的同名分支。
所以若是咱們使用了git2.0以前的版本,push.default = matching,git push後則會推送當前分支代碼到遠程分支,而2.0以後,push.default = simple,若是沒有指定當前分支的upstream分支,就會收到上文的fatal提示。
若是當前分支只有一個追蹤分支,那麼主機名均可以省略。
$ git push
若是當前分支與多個主機存在追蹤關係,則可使用-u
選項指定一個默認主機,這樣後面就能夠不加任何參數使用git push
。
$ git push -u origin master
上面命令將本地的master
分支推送到origin
主機,同時指定origin
爲默認主機,後面就能夠不加任何參數使用git push
了。
不帶任何參數的git push
,默認只推送當前分支,這叫作simple方式。此外,還有一種matching方式,會推送全部有對應的遠程分支的本地分支。Git 2.0版本以前,默認採用matching方法,如今改成默認採用simple方式。若是要修改這個設置,能夠採用git config
命令。
$ git config --global push.default matching # 或者 $ git config --global push.default simple
還有一種狀況,就是無論是否存在對應的遠程分支,將本地的全部分支都推送到遠程主機,這時須要使用--all
選項。
$ git push --all origin
上面命令表示,將全部本地分支都推送到origin
主機。
若是遠程主機的版本比本地版本更新,推送時Git會報錯,要求先在本地作git pull
合併差別,而後再推送到遠程主機。這時,若是你必定要推送,可使用--force
選項。
$ git push --force origin
上面命令使用--force
選項,結果致使遠程主機上更新的版本被覆蓋。除非你很肯定要這樣作,不然應該儘可能避免使用--force
選項。
最後,git push
不會推送標籤(tag),除非使用--tags
選項。
$ git push origin --tags
假定咱們建立好了一個遠程倉庫地址爲:https://coding.net/u/zhangguo5/p/project7/git,如今咱們在本地建立一個項目並同步到遠程倉庫中。
1)、建立文件添加到暫存區
2)、提交到本地倉庫
3)、提交到遠程倉庫
添加遠程主機地址:
推送文件:
結果:
說明:這裏我使用的是SSH方式提交的,全部並無讓我輸入用戶名與密碼,若是你使用https方式提交則要配置用戶名與郵箱,還要輸入密碼。
資料連接: https://pan.baidu.com/s/1c20DVOW 密碼: p9ri