目錄
最近要與部門同事一起做技術(shù)分享,我選擇了Git,因為Git 是一種在全球范圍都廣受歡迎的版本控制系統(tǒng)。在開發(fā)過程中,為了跟蹤代碼,文檔,項目等信息中的變化,版本控制變得前所未有的重要。 一、版本控制概要 工作區(qū) 暫存區(qū) 本地倉庫 遠程倉庫1.1、什么是版本控制版本控制(Revision control)是一種在開發(fā)的過程中用于管理我們對文件、目錄或工程等內(nèi)容的修改歷史,方便查看更改歷史記錄,備份以便恢復(fù)以前的版本的軟件工程技術(shù)。
簡單說就是用于管理多人協(xié)同開發(fā)項目的技術(shù)。 沒有進行版本控制或者版本控制本身缺乏正確的流程管理,在軟件開發(fā)過程中將會引入很多問題,如軟件代碼的一致性、軟件內(nèi)容的冗余、軟件過程的事物性、軟件開發(fā)過程中的并發(fā)性、軟件源代碼的安全性,以及軟件的整合等問題。 1.2、常用術(shù)語1)、倉庫(Repository) 2)、工作空間(Workspace) 3)、工作樹/區(qū)(Working tree) 4)、暫存區(qū)(Staging area) 5)、索引(Index) 6)、簽入(Checkin) 7)、簽出(Checkout) 8)、提交(Commit) 9)、沖突(Conflict) 10)、合并(Merge) 11)、分支(Branch) 12)、鎖(Lock) 13)、頭(HEAD) 14)、修訂(Revision) 15)、標(biāo)記(Tags) 1.3、常見的版本控制器主流的版本控制器有如下這些:
版本控制產(chǎn)品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),現(xiàn)在影響力最大且使用最廣泛的是Git與SVN 1.4、版本控制分類1.4.1、本地版本控制記錄文件每次的更新,可以對每個版本做一個快照,或是記錄補丁文件,適合個人用,如RCS。 1.4.2、集中版本控制所有的版本數(shù)據(jù)都保存在服務(wù)器上,協(xié)同開發(fā)者從服務(wù)器上同步更新或上傳自己的修改 所有的版本數(shù)據(jù)都存在服務(wù)器上,用戶的本地只有自己以前所同步的版本,如果不連網(wǎng)的話,用戶就看不到歷史版本,也無法切換版本驗證問題,或在不同分支工作。而且,所有數(shù)據(jù)都保存在單一的服務(wù)器上,有很大的風(fēng)險這個服務(wù)器會損壞,這樣就會丟失所有的數(shù)據(jù),當(dāng)然可以定期備份。代表產(chǎn)品:SVN、CVS、VSS 1.4.3、分布式版本控制所有版本信息倉庫全部同步到本地的每個用戶,這樣就可以在本地查看所有版本歷史,可以離線在本地提交,只需在連網(wǎng)時push到相應(yīng)的服務(wù)器或其他用戶那里。由于每個用戶那里保存的都是所有的版本數(shù)據(jù),只要有一個用戶的設(shè)備沒有問題就可以恢復(fù)所有的數(shù)據(jù),但這增加了本地存儲空間的占用。 1.5、Git與SVN最主要區(qū)別SVN是集中式版本控制系統(tǒng),版本庫是集中放在中央服務(wù)器的,而工作的時候,用的都是自己的電腦,所以首先要從中央服務(wù)器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服務(wù)器。集中式版本控制系統(tǒng)是必須聯(lián)網(wǎng)才能工作,對網(wǎng)絡(luò)帶寬要求較高。
Git是分布式版本控制系統(tǒng),沒有中央服務(wù)器,每個人的電腦就是一個完整的版本庫,工作的時候不需要聯(lián)網(wǎng)了,因為版本都在自己電腦上。協(xié)同的方法是這樣的:比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。 二、Git安裝與配置2.1、什么是GitGit是目前世界上最先進的分布式版本控制系統(tǒng)。 Git是免費、開源的 最初Git是為輔助 Linux 內(nèi)核開發(fā)的,來替代 BitKeeper 作者:Linux和Git之父李納斯·托沃茲(Linus Benedic Torvalds)1969、芬蘭 優(yōu)點:
缺點:
官網(wǎng): https:/// 源碼: https://github.com/git/git/ 2.2、搭建Git工作環(huán)境2.2.1、下載Git打開 git官網(wǎng),下載git對應(yīng)操作系統(tǒng)的版本。 選擇版本: 這里我選擇下載64-bit Git for Windows Setup 2.2.2、安裝Git選擇安裝配置信息 一直Next默認(rèn)就好了,如果需要設(shè)置就要仔細(xì)讀一下安裝界面上的選項。 2.2.3、啟動Git安裝成功后在開始菜單中會有Git項,菜單下有3個程序: Git Bash:Unix與Linux風(fēng)格的命令行,使用最多,推薦最多 與DOS風(fēng)格的命令有些區(qū)別,不習(xí)慣可以選擇Git CMD Git CMD:Windows風(fēng)格的命令行 Git GUI:圖形界面的Git,不建議初學(xué)者使用,盡量先熟悉常用命令 點擊Create New Repository可以直接創(chuàng)建一個新的倉庫。 2.2.4、Linux與Mac OS安裝GitLinux安裝Git:sudo apt-get install git 命令行就可以安裝了。 Mac OS安裝Git: https:///download/mac,下載雙擊.pkg安裝 2.2.5、Bash基本操作命令~就是home 進入Bash默認(rèn)位置,注意標(biāo)題欄 1)、cd : 改變目錄。 cd ~ 回Home(windows是當(dāng)前用戶所在目錄)
2)、cd . . 回退到上一個目錄,直接cd進入默認(rèn)目錄 3)、pwd : 顯示當(dāng)前所在的目錄路徑。 4)、ls(ll): 都是列出當(dāng)前目錄中的所有文件,只不過ll(兩個ll)列出的內(nèi)容更為詳細(xì)。 5)、touch : 新建一個文件 如 touch index.js 就會在當(dāng)前目錄下新建一個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 是目標(biāo)文件夾,當(dāng)然, 這樣寫,必須保證文件和目標(biāo)文件夾在同一目錄下。 10)、reset 重新初始化終端/清屏。 11)、clear 清屏。 12)、history 查看命令歷史。 13)、help 幫助。 14)、exit 退出。 15)、#表示注釋 16)、輸出與注釋 17)、創(chuàng)建文件 18、顯示文件內(nèi)容 cat
2.3、Git配置 - git config2.3.1、查看配置 - git config -l使用git config -l 可以查看現(xiàn)在的git環(huán)境詳細(xì)配置 查看不同級別的配置文件: #查看系統(tǒng)config git config --system --list #查看當(dāng)前用戶(global)配置 git config --global --list #查看當(dāng)前倉庫配置信息 git config --local --list 2.3.2、Git配置文件分類在Windows系統(tǒng)中,Git在$HOME目錄中查找.gitconfig文件(一般位于C:\Documents and Settings$USER下) Git相關(guān)的配置文件有三個: 1)、 /etc/gitconfig:包含了適用于系統(tǒng)所有用戶和所有項目的值。(Win:C:\Program Files\Git\mingw64\etc\gitconfig) --system 系統(tǒng)級
2)、~/.gitconfig:只適用于當(dāng)前登錄用戶的配置。(Win:C:\Users\Administrator\.gitconfig) --global 全局 3)、位于git項目目錄中的.git/config:適用于特定git項目的配置。(Win:C:\gitProject) --local當(dāng)前項目 注意:對于同一配置項,三個配置文件的優(yōu)先級是1<2<3 這里可以直接編輯配置文件,通過命令設(shè)置后會響應(yīng)到這里。 2.3.3、設(shè)置用戶名與郵箱(用戶標(biāo)識,必要)當(dāng)你安裝Git后首先要做的事情是設(shè)置你的用戶名稱和e-mail地址。這是非常重要的,因為每次Git提交都會使用該信息。它被永遠的嵌入到了你的提交中: $ git config --global user.name "zhangguo" #名稱 $ git config --global user.email zhangguo@qq.com #郵箱 只需要做一次這個設(shè)置,如果你傳遞了--global 選項,因為Git將總是會使用該信息來處理你在系統(tǒng)中所做的一切操作。如果你希望在一個特定的項目中使用不同的名稱或e-mail地址,你可以在該項目中運行該命令而不要--global選項。 總之--global為全局配置,不加為某個項目的特定配置。 2.3.4、添加或刪除配置項1)、添加配置項
git config [--local|--global|--system] section.key value [--local|--global|--system] #可選的,對應(yīng)本地,全局,系統(tǒng)不同級別的設(shè)置,請看2.3.2 section.key #區(qū)域下的鍵 value #對應(yīng)的值 --local 項目級 --global 當(dāng)前用戶級 --system 系統(tǒng)級 例如我們要在student區(qū)域下添加一個名稱為height值為198的配置項,執(zhí)行結(jié)果如下: 2)、刪除配置項 git config [--local|--global|--system] --unset section.key 將系統(tǒng)級的height配置項移除 2.3.5、更多配置項git config --global color.ui true #打開所有的默認(rèn)終端著色 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 #設(shè)置別名 git config user.name #獲得用戶名 git config core.filemode false #忽略修改權(quán)限的文件 所有config命令參數(shù) 語法: git config [<options>] 文件位置 --global #use global config file 使用全局配置文件 --system #use system config file 使用系統(tǒng)配置文件 --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] 得到的值根據(jù)正則 --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] 找到配置的顏色:插槽[默認(rèn)] --get-colorbool #find the color setting: slot [stdout-is-tty] 發(fā)現(xiàn)顏色設(shè)置:槽[ stdout是TTY ] 類型 --bool #value is "true" or "false" 值是“真”或“假”。 --int #value is decimal number 值是十進制數(shù)。 --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字節(jié) --name-only #show variable names only 只顯示變量名 --includes #respect include directives on lookup 尊重包括查找指令 --show-origin #show origin of config (file, standard input, blob, command line) 顯示配置(文件、標(biāo)準(zhǔn)輸入、數(shù)據(jù)塊、命令行)的來源 三、Git理論基礎(chǔ)3.1、工作區(qū)域Git本地有三個工作區(qū)域:工作目錄(Working Directory)、暫存區(qū)(Stage/Index)、資源庫(Repository或Git Directory)。如果在加上遠程的git倉庫(Remote Directory)就可以分為四個工作區(qū)域。文件在這四個區(qū)域之間的轉(zhuǎn)換關(guān)系如下:
本地的三個區(qū)域確切的說應(yīng)該是git倉庫中HEAD指向的版本
3.2、工作流程git的工作流程一般是這樣的: 1、在工作目錄中添加、修改文件; 2、將需要進行版本管理的文件放入暫存區(qū)域; 3、將暫存區(qū)域的文件提交到git倉庫。 因此,git管理的文件有三種狀態(tài):已修改(modified),已暫存(staged),已提交(committed) 3.3、圖解教程個人認(rèn)為Git的原理相比別的版本控制器還是復(fù)雜一些的,有一份圖解教程比較直觀: 四、Git操作4.1、創(chuàng)建工作目錄與常用指令工作目錄(WorkSpace)一般就是你希望Git幫助你管理的文件夾,可以是你項目的目錄,也可以是一個空目錄,建議不要有中文。 日常使用只要記住下圖6個命令: 4.2、獲得GIT倉庫創(chuàng)建本地倉庫的方法有兩種:一種是創(chuàng)建全新的倉庫,另一種是克隆遠程倉庫。 4.2.1、創(chuàng)建全新倉庫需要用GIT管理的項目的根目錄執(zhí)行: # 在當(dāng)前目錄新建一個Git代碼庫 $ git init 執(zhí)行: 結(jié)果:
執(zhí)行后可以看到,僅僅在項目目錄多出了一個.git目錄,關(guān)于版本等的所有信息都在這個目錄里面。 當(dāng)然如果使用如下命令,可以把創(chuàng)建目錄與倉庫一起完成: # 新建一個目錄,將其初始化為Git代碼庫 $ git init [project-name] 執(zhí)行命令與運行結(jié)果: 4.2.2、克隆遠程倉庫另一種方式是克隆遠程目錄,由于是將遠程服務(wù)器上的倉庫完全鏡像一份至本地,而不是取某一個特定版本,所以用clone而不是checkout,語法格式如下: # 克隆一個項目和它的整個代碼歷史(版本信息) $ git clone [url] 執(zhí)行: 比如我們要從克隆的遠程倉庫托管在github上,地址為:https://github.com/zhangguo5/SuperPlus.git,這是一個公開的項目
結(jié)果: 4.3、GIT文件操作版本控制就是對文件的版本控制,要對文件進行修改、提交等操作,首先要知道文件當(dāng)前在什么狀態(tài),不然可能會提交了現(xiàn)在還不想提交的文件,或者要提交的文件沒提交上。GIT不關(guān)心文件兩個版本之間的具體差別,而是關(guān)心文件的整體是否有改變,若文件被改變,在添加提交時就生成文件新版本的快照,而判斷文件整體是否改變的方法就是用SHA-1算法計算文件的校驗和。 4.3.1、文件4種狀態(tài)
4.3.2、查看文件狀態(tài)上面說文件有4種狀態(tài),通過如下命令可以查看到文件的狀態(tài): 命令: 結(jié)果: foo.htm文件的狀態(tài)為untracked(未跟蹤),提示通過git add可以暫存 GIT在這一點做得很好,在輸出每個文件狀態(tài)的同時還說明了怎么操作,像上圖就有怎么暫存、怎么跟蹤文件、怎么取消暫存的說明。 4.3.3、添加文件與目錄工作區(qū)(Working Directory)就是你在電腦里能看到的目錄。 版本庫(Repository)工作區(qū)有一個隱藏目錄 Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支 將untracked狀態(tài)的文件添加到暫存區(qū),語法格式如下: # 添加指定文件到暫存區(qū) $ git add [file1] [file2] ... # 添加指定目錄到暫存區(qū),包括子目錄 $ git add [dir] # 添加當(dāng)前目錄的所有文件到暫存區(qū) $ git add . 執(zhí)行: 4.3.4、移除文件與目錄(撤銷add)當(dāng)執(zhí)行如下命令時,會直接從暫存區(qū)刪除文件,工作區(qū)則不做出改變 #直接從暫存區(qū)刪除文件,工作區(qū)則不做出改變 git rm --cached <file> 執(zhí)行命令 通過重寫目錄樹移除add文件: #如果已經(jīng)用add 命令把文件加入stage了,就先需要從stage中撤銷 git reset HEAD <file>... 當(dāng)執(zhí)行 “git reset HEAD” 命令時,暫存區(qū)的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區(qū)不受影響。 示例:把f1.txt文件從暫存區(qū)撤回工作區(qū) 移除所有未跟蹤文件 #移除所有未跟蹤文件 #一般會加上參數(shù)-df,-d表示包含目錄,-f表示強制清除。 git clean [options] 示例: 移除前: 執(zhí)行移除: 移除后: #只從stage中刪除,保留物理文件 git rm --cached readme.txt #不但從stage中刪除,同時刪除物理文件 git rm readme.txt #把a.txt改名為b.txt git mv a.txt b.txt 當(dāng)執(zhí)行提交操作(git commit)時,暫存區(qū)的目錄樹寫到版本庫(對象庫)中,master 分支會做相應(yīng)的更新。即 master 指向的目錄樹就是提交時暫存區(qū)的目錄樹。 當(dāng)執(zhí)行 “git reset HEAD” 命令時,暫存區(qū)的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區(qū)不受影響。 當(dāng)執(zhí)行 “git rm –cached <file>” 命令時,會直接從暫存區(qū)刪除文件,工作區(qū)則不做出改變。 當(dāng)執(zhí)行 “git checkout .” 或者 “git checkout — <file>” 命令時,會用暫存區(qū)全部或指定的文件替換工作區(qū)的文件。這個操作很危險,會清除工作區(qū)中未添加到暫存區(qū)的改動。 當(dāng)執(zhí)行 “git checkout HEAD .” 或者 “git checkout HEAD <file>” 命令時,會用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區(qū)和以及工作區(qū)中的文件。這個命令也是極具危險性的,因為不但會清除工作區(qū)中未提交的改動,也會清除暫存區(qū)中未提交的改 動。 4.3.5、查看文件修改后的差異git diff用于顯示W(wǎng)orkSpace中的文件和暫存區(qū)文件的差異 用"git status"只能查看對哪些文件做了改動,如果要看改動了什么,可以用: #查看文件修改后的差異 git diff [files] 命令: ---a表示修改之前的文件,+++b表示修改后的文件 #比較暫存區(qū)的文件與之前已經(jīng)提交過的文件 git diff --cached 也可以把WorkSpace中的狀態(tài)和repo中的狀態(tài)進行diff,命令如下: #比較repo與工作空間中的文件差異 git diff HEAD~n
4.3.6、簽出如果倉庫中已經(jīng)存在文件f4.txt,在工作區(qū)中對f4修改了,如果想撤銷可以使用checkout,簽出覆蓋 檢出命令git checkout是git最常用的命令之一,同時也是一個很危險的命令,因為這條命令會重寫工作區(qū) 語法: #用法一 git checkout [-q] [<commit>] [--] <paths>... #用法二 git checkout [<branch>] #用法三 git checkout [-m] [[-b]--orphan] <new_branch>] [<start_point>] <commit>是可選項,如果省略則相當(dāng)于從暫存區(qū)(index)進行檢出
$ git checkout branch #檢出branch分支。要完成圖中的三個步驟,更新HEAD以指向branch分支,以及用branch 指向的樹更新暫存區(qū)和工作區(qū)。 $ git checkout #匯總顯示工作區(qū)、暫存區(qū)與HEAD的差異。 $ git checkout HEAD #同上 $ git checkout -- filename #用暫存區(qū)中filename文件來覆蓋工作區(qū)中的filename文件。相當(dāng)于取消自上次執(zhí)行g(shù)it add filename以來(如果執(zhí)行過)的本地修改。 $ git checkout branch -- filename #維持HEAD的指向不變。用branch所指向的提交中filename替換暫存區(qū)和工作區(qū)中相 應(yīng)的文件。注意會將暫存區(qū)和工作區(qū)中的filename文件直接覆蓋。 $ git checkout -- . 或?qū)懽?git checkout . #注意git checkout 命令后的參數(shù)為一個點(“.”)。這條命令最危險!會取消所有本地的 #修改(相對于暫存區(qū))。相當(dāng)于用暫存區(qū)的所有文件直接覆蓋本地文件,不給用戶任何確認(rèn)的機會! $ git checkout commit_id -- file_name #如果不加commit_id,那么git checkout -- file_name 表示恢復(fù)文件到本地版本庫中最新的狀態(tài)。 示例: 4.3.6、忽略文件有些時候我們不想把某些文件納入版本控制中,比如數(shù)據(jù)庫文件,臨時文件,設(shè)計文件等 在主目錄下建立".gitignore"文件,此文件有如下規(guī)則:
如: #為注釋 *.txt #忽略所有 .txt結(jié)尾的文件 !lib.txt #但lib.txt除外 /temp #僅忽略項目根目錄下的TODO文件,不包括其它目錄temp build/ #忽略build/目錄下的所有文件 doc/*.txt #會忽略 doc/notes.txt 但不包括 doc/server/arch.txt 示例: 創(chuàng)建一個.gitignore文件忽視所有的日志文件 查看狀態(tài): 從上圖中可以看出2個日志文件并沒有添加到暫存區(qū),直接被忽視了。 針對各種語言與項目的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./en/download/help/error_hotspot.xml hs_err_pid* 通用的Visual Studio開發(fā)項目忽視文件:
View Code
idea忽視文件: .idea/ *.iml out/ gen/ idea-gitignore.jar resources/templates.list resources/gitignore/* build/ build.properties junit*.properties IgnoreLexer.java~ .gradle /verification
4.3.7、提交通過add只是將文件或目錄添加到了index暫存區(qū),使用commit可以實現(xiàn)將暫存區(qū)的文件提交到本地倉庫。 # 提交暫存區(qū)到倉庫區(qū) $ git commit -m [message] # 提交暫存區(qū)的指定文件到倉庫區(qū) $ git commit [file1] [file2] ... -m [message] # 提交工作區(qū)自上次commit之后的變化,直接到倉庫區(qū),跳過了add,對新文件無效 $ git commit -a # 提交時顯示所有diff信息 $ git commit -v # 使用一次新的commit,替代上一次提交 # 如果代碼沒有任何新變化,則用來改寫上一次commit的提交信息 $ git commit --amend -m [message] # 重做上一次commit,并包括指定文件的新變化 $ git commit --amend [file1] [file2] ... 示例: 提交前的狀態(tài) 提交: 提交后的狀態(tài): 從上圖中可以看出暫存區(qū)中沒有了bar.htm 修訂提交 如果我們提交過后發(fā)現(xiàn)有個文件改錯了,或者只是想修改提交說明,這時可以對相應(yīng)文件做出修改,將修改過的文件通過"git add"添加到暫存區(qū),然后執(zhí)行以下命令: #修訂提交 git commit --amend 撤銷提交(commit) 原理就是放棄工作區(qū)和index的改動,同時HEAD指針指向前一個commit對象 #撤銷上一次的提交 git reset --hard HEAD~1 要通過git log查看提交日志,也可直接指定提交編號或序號 示例:
撤銷提交 4.3.8、日志與歷史查看提交日志可以使用git log指令,語法格式如下: #查看提交日志 git log [<options>] [<revision range>] [[\--] <path>…?] 示例: "git log --graph"以圖形化的方式顯示提交歷史的關(guān)系,這就可以方便地查看提交歷史的分支信息,當(dāng)然是控制臺用字符畫出來的圖形。 "git log -1"則表示顯示1行。 使用history可以查看您在bash下輸入過的指令: 幾乎所有輸入過的都被記錄下來的,不愧是做版本控制的。 查看所有分支日志 "git reflog"中會記錄這個倉庫中所有的分支的所有更新記錄,包括已經(jīng)撤銷的更新。 4.3.9、查看文件列表使用git ls-files指令可以查看指定狀態(tài)的文件列表,格式如下: #查看指定狀態(tài)的文件 git ls-files [-z] [-t] [-v] (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])* (-[c|d|o|i|s|u|k|m])* 示例: 4.3.10、撤銷更新1)、撤銷暫存區(qū)更新 使用"git add"把更新提交到了暫存區(qū)。這時"git status"的輸出中提示我們可以通過"git reset HEAD <file>..."把暫存區(qū)的更新移出到WorkSpace中 示例:f6已經(jīng)提交,工作區(qū)修改,暫存區(qū)修改,撤銷 2)、撤銷本地倉庫更新 使用git log查看提交日志 撤銷提交有兩種方式:使用HEAD指針和使用commit id 在Git中,有一個HEAD指針指向當(dāng)前分支中最新的提交。當(dāng)前版本,我們使用"HEAD^",那么再錢一個版本可以使用"HEAD^^",如果想回退到更早的提交,可以使用"HEAD~n"。(也就是,HEAD^=HEAD~1,HEAD^^=HEAD~2) git reset --hard HEAD^
git reset --hard HEAD~1
git reset --59cf9334cf957535cb328f22a1579b84db0911e5
示例:回退到添加f6 回退前: 回退后:
現(xiàn)在又想恢復(fù)被撤銷的提交可用"git reflog"查看倉庫中所有的分支的所有更新記錄,包括已經(jīng)撤銷的更新,撤銷方法與前面一樣。 git reset --hard HEAD@{7} git reset --hard e0e79d7 --hard:撤銷并刪除相應(yīng)的更新 --soft:撤銷相應(yīng)的更新,把這些更新的內(nèi)容放到Stage中 4.3.11、刪除文件1)、刪除未跟蹤文件 如果文件還是未跟蹤狀態(tài),直接刪除文件就可了,bash中使用rm可以刪除文件,示例如下: 2)、刪除已提交文件
-f 強制刪除,物理刪除了,同時刪除工作區(qū)和暫存區(qū)中的文件 撤銷刪除: #to discard changes in working directory git checkout -- <file>... 3)、刪除暫存區(qū)的文件,不刪除工作區(qū)的文件
使用git reset HEAD <file>...同樣可以實現(xiàn)上面的功能 4.3.12、文件操作小結(jié)Git很強大,很靈活,這是毋庸置疑的。但也正因為它的強大造成了它的復(fù)雜,因此會有很多奇奇怪怪的問題出現(xiàn),多用就好了。 4.4、GIT分支分支在GIT中相對較難 分支就是科幻電影里面的平行宇宙,當(dāng)你正在電腦前努力學(xué)習(xí)Git的時候,另一個你正在另一個平行宇宙里努力學(xué)習(xí)SVN。 如果兩個平行宇宙互不干擾,那對現(xiàn)在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合并了,結(jié)果,你既學(xué)會了Git又學(xué)會了SVN! 分支在實際中有什么用呢?假設(shè)你準(zhǔn)備開發(fā)一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由于代碼還沒寫完,不完整的代碼庫會導(dǎo)致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風(fēng)險。 現(xiàn)在有了分支,就不用怕了。你創(chuàng)建了一個屬于你自己的分支,別人看不到,還繼續(xù)在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發(fā)完畢后,再一次性合并到原來的分支上,這樣,既安全,又不影響別人工作。 Git分支的速度非??臁?/p> 截止到目前,只有一條時間線,在Git里,這個分支叫主分支,即master分支。HEAD嚴(yán)格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當(dāng)前分支。 git分支中常用指令: # 列出所有本地分支 $ git branch # 列出所有遠程分支 $ git branch -r # 列出所有本地分支和遠程分支 $ git branch -a # 新建一個分支,但依然停留在當(dāng)前分支 $ git branch [branch-name] # 新建一個分支,并切換到該分支 $ git checkout -b [branch] # 新建一個分支,指向指定commit $ git branch [branch] [commit] # 新建一個分支,與指定的遠程分支建立追蹤關(guān)系 $ git branch --track [branch] [remote-branch] # 切換到指定分支,并更新工作區(qū) $ git checkout [branch-name] # 切換到上一個分支 $ git checkout - # 建立追蹤關(guān)系,在現(xiàn)有分支與指定的遠程分支之間 $ git branch --set-upstream [branch] [remote-branch] # 合并指定分支到當(dāng)前分支 $ git merge [branch] # 選擇一個commit,合并進當(dāng)前分支 $ git cherry-pick [commit] # 刪除分支 $ git branch -d [branch-name] # 刪除遠程分支 $ git push origin --delete [branch-name] $ git branch -dr [remote/branch] 4.4.1、新建分支與切換分支每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git里,這個分支叫主分支,即master分支。HEAD嚴(yán)格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當(dāng)前分支。 每次提交,master分支都會向前移動一步,這樣,隨著你不斷提交,master分支的線也越來越長: 默認(rèn)分支是這樣的,master是主分支 1)、新建一個分支,但依然停留在當(dāng)前分支,使用:$ git branch [branch-name] 切換分支到dev1后的結(jié)果: 當(dāng)我們創(chuàng)建新的分支,例如 你看,Git創(chuàng)建一個分支很快,因為除了增加一個 不過,從現(xiàn)在開始,對工作區(qū)的修改和提交就是針對 假如我們在 所以Git合并分支也很快!就改改指針,工作區(qū)內(nèi)容也不變! 合并完分支后,甚至可以刪除 動畫演示: 2)、切換分支,git branch <name>,如果name為-則為上一個分支 切換為上一個分支 3)、新建一個分支,并切換到該分支,$ git checkout -b [branch] 4)、新建一個分支,指向指定commit使用命令:$ git branch [branch] [commit]
上面創(chuàng)建了dev3分支且指向了master中首次提交的位置,切換到dev3查看日志如下: master上本來有兩個提交記錄的,此時的dev3指向的是第1次提交的位置 5)、新建一個分支,與指定的遠程分支建立追蹤關(guān)系使用命令:$ git branch --track [branch] [remote-branch] 4.4.2、查看分支1)、列出所有本地分支使用$ git branch 2)、列表所有遠程分支使用$ git branch -r 3)、列出所有本地分支和遠程分支使用$ git branch -a 4.4.3、分支合并合并指定分支到當(dāng)前分支使用指令$ git merge [branch] 這里的合并分支就是對分支的指針操作,我們先創(chuàng)建一個分支再合并到主分支: 這里的file11.txt主分支與dev6的內(nèi)容現(xiàn)在是不同的,因為在dev6中已被修改過,我們可以使用指令查看: 現(xiàn)在我們將dev6合并到主分支中去,從下圖中可以看出dev6中有一次提交,而master并沒有 合并后在master上查看file11.txt文件內(nèi)容與dev6上的內(nèi)容就一樣了,合并后dev6中多出的提交在master也擁有了。 4.4.4、解決沖突如果同一個文件在合并分支時都被修改了則會引起沖突,如下所示: 提交前兩個分支的狀態(tài) 在dev6分支中同樣修改file11.txt dev6與master分支中file11.txt文件都被修改且提交了,現(xiàn)在合并分支 提示沖突,現(xiàn)在我們看看file11.txt在master分支中的狀態(tài) Git用<<<<<<<,=======,>>>>>>>標(biāo)記出不同分支的內(nèi)容,其中<<<HEAD是指主分支修改的內(nèi)容,>>>>>dev6 是指dev6上修改的內(nèi)容 解決的辦法是我們可以修改沖突文件后重新提交,請注意當(dāng)前的狀態(tài)產(chǎn)master | MERGING:
重新提交后沖突解決: 手動解決完沖突后就可以把此文件添 加到索引(index)中去,用git commit命令來提交,就像平時修改了一個文件 一樣。 用git log --graph命令可以看到分支合并圖。 分支策略 master主分支應(yīng)該非常穩(wěn)定,用來發(fā)布新版本,一般情況下不允許在上面工作,工作一般情況下在新建的dev分支上工作,工作完后,比如上要發(fā)布,或者說dev分支代碼穩(wěn)定后可以合并到主分支master上來。 4.4.5、刪除分支刪除本地分支可以使用命令:$ git branch -d [branch-name],-D(大寫)強制刪除 刪除遠程分支可以使用如下指令: $ git push origin --delete [branch-name] -d表示刪除分支。分支必須完全合并在其上游分支,或者在HEAD上沒有設(shè)置上游 -r表示遠程的意思remotes,如果-dr則表示刪除遠程分支 4.5、Git GUI 操作通過命令行可以深刻的理解Git,Git GUI或IDE插件卻可以更加直觀操作Git,常用的Git GUI有如下這些: 4.5.1、GitHub for Desktop全球開發(fā)人員交友俱樂部提供的強大工具,功能完善,使用方便。對于使用GitHub的開發(fā)人員來說是非常便捷的工具。 GitHub for Desktop不帶三方合并工具,你必須自己手動解決沖突才可以。 – 免費 4.5.2、Source TreeSourceTree是老牌的Git GUI管理工具了,也號稱是最好用的Git GUI工具。強大,功能豐富,基本操作和高級操作都設(shè)計得非常流暢,適合初學(xué)者上手,支持Git Flow。 – 免費 4.5.3、TortoiseGit小烏龜,SVN的超廣泛使用也使得這個超好用的Svn客戶端成了幾乎每個開發(fā)人員的桌面必備軟件。小烏龜只提供Windows版本,提供中文版支持的。 – 免費 4.5.4、Git集成Gui工具安裝Git時會集成安裝Gui工具,在Git菜單下可以找到,特點是:免費、簡單、不需要額外安裝 4.6、IDE集成的Git客戶端對于使用IDE進行開發(fā)的程序員來說,可以不離開常用的IDE就直接操作源代碼管理系統(tǒng)是最好的選擇,以下是我對幾個常見的IDE集成的git客戶端: 4.6.1、Eclipse – Egit作為Java集成開發(fā)環(huán)境的代表,Eclipse內(nèi)置了egit這個插件來提供git的集成支持。實話實說,這個插件的功能非常豐富,無論是普通的clone, commit, pull/push操作;還是復(fù)雜一些的git flow都有支持。 4.6.2、Visual Studio – Git Integration & GitHub ExtensionVS里面的Git支持已經(jīng)相當(dāng)?shù)耐晟啤V苯涌寺ithub上的repo
4.6.3、IntelliJ IDEA4.7、幫助與代碼統(tǒng)計1)、幫助文檔 完整的安裝了Git后有一個官方幫助,這是最權(quán)威的資料,方法如下: 比如我們要查看git commit的使用 執(zhí)行時會打開對應(yīng)的git幫助文檔,其實就在本地,當(dāng)然您也可以去官網(wǎng)在線搜索,地址是: https:///docs。 2)、信息查看與統(tǒng)計命令 #統(tǒng)計某人的代碼提交量,包括增加,刪除: 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:這個統(tǒng)計可能不會太準(zhǔn),因為很多人有不同的郵箱,但會使用相同的名字 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 #貢獻者統(tǒng)計: git log --pretty='%aN' | sort -u | wc -l #提交數(shù)統(tǒng)計: git log --oneline | wc -l # 顯示有變更的文件 $ git status # 顯示當(dāng)前分支的版本歷史 $ git log # 顯示commit歷史,以及每次commit發(fā)生變更的文件 $ git log --stat # 搜索提交歷史,根據(jù)關(guān)鍵詞 $ git log -S [keyword] # 顯示某個commit之后的所有變動,每個commit占據(jù)一行 $ git log [tag] HEAD --pretty=format:%s # 顯示某個commit之后的所有變動,其"提交說明"必須符合搜索條件 $ git log [tag] HEAD --grep feature # 顯示某個文件的版本歷史,包括文件改名 $ git log --follow [file] $ git whatchanged [file] # 顯示指定文件相關(guān)的每一次diff $ git log -p [file] # 顯示過去5次提交 $ git log -5 --pretty --oneline # 顯示所有提交過的用戶,按提交次數(shù)排序 $ git shortlog -sn # 顯示指定文件是什么人在什么時間修改過 $ git blame [file] # 顯示暫存區(qū)和工作區(qū)的差異 $ git diff # 顯示暫存區(qū)和上一個commit的差異 $ git diff --cached [file] # 顯示工作區(qū)與當(dāng)前分支最新commit之間的差異 $ git diff HEAD # 顯示兩次提交之間的差異 $ git diff [first-branch]...[second-branch] # 顯示今天你寫了多少行代碼 $ git diff --shortstat "@{0 day ago}" # 顯示某次提交的元數(shù)據(jù)和內(nèi)容變化 $ git show [commit] # 顯示某次提交發(fā)生變化的文件 $ git show --name-only [commit] # 顯示某次提交時,某個文件的內(nèi)容 $ git show [commit]:[filename] # 顯示當(dāng)前分支的最近幾次提交 $ git reflog 示例: 五、遠程倉庫Git是分布式版本控制系統(tǒng),同一個Git倉庫,可以分布到不同的機器上,但開發(fā)參與者必須在同一個網(wǎng)絡(luò)中,且必須有一個項目的原始版本,通常的辦法是讓一臺電腦充當(dāng)服務(wù)器的角色,每天24小時開機,其他每個人都從這個“服務(wù)器”倉庫克隆一份到自己的電腦上,并且各自把各自的提交推送到服務(wù)器倉庫里,也從服務(wù)器倉庫中拉取別人的提交。完全可以自己搭建一臺運行Git的服務(wù)器但現(xiàn)在更適合的做法是使用免費的托管平臺。 同時相較于傳統(tǒng)的代碼都是管理到本機或者內(nèi)網(wǎng)。 一旦本機或者內(nèi)網(wǎng)機器出問題,代碼可能會丟失,使用遠端代碼倉庫將永遠存在一個備份。同時也免去了搭建本地代碼版本控制服務(wù)的繁瑣。 云計算時代 Git 以其強大的分支和克隆功能,更加方便了開發(fā)者遠程協(xié)作。 5.1、托管平臺Git代碼托管平臺,首先推薦的是GitHub,好多好的開源項目都來自GitHub,但是GitHub只能新建公開的Git倉庫,私有倉庫要收費,有時候訪問比較卡,如果你做的是一個開源項目,可以首選GitHub。下面推薦幾個比較好的Git代碼托管平臺: 5.1.1、GitHub關(guān)于GItHub相信大家都有耳聞,我就不詳細(xì)介紹了。GitHub地址: https://github.com/,其首頁如圖: 5.1.2、Gitlab對于有些人,提到GitHub就會自然的想到Gitlab,Gitlab支持無限的公有項目和私有項目。Gitlab地址: https://about./,其首頁截圖如圖: 5.1.3、Bitbucketbitbucket免費支持5個開發(fā)成員的團隊創(chuàng)建無限私有代碼托管庫。bitbucket地址: 5.1.4、開源中國代碼托管開源中國一個賬號最多可以創(chuàng)建1000個項目,包含公有和私有,開源中國代碼托管地址: http://git.oschina.net/,其首頁如圖: 5.1.5、(推薦)談到,首先必須提的是速度快,功能與開源中國相似,同樣一個賬號最多可以創(chuàng)建1000個項目(5個私有),也支持任務(wù)的創(chuàng)建等。地址: https:///: 我個人比較推薦Coding.net、GItHub。 當(dāng)然還有許多,如CSDN,百度,阿里等,歡迎大家比較后推薦。 選擇國外的主機請考慮網(wǎng)速,選擇國內(nèi)的主機請考慮穩(wěn)定與安全性。 5.2、申請賬號與設(shè)置因為免費,可以創(chuàng)建私有項目,且速度不錯,這里我們以為托管平臺完成遠程倉庫的賬號申請與操作。 5.2.1、申請賬號1)、打開 https:///,點擊右上角的注冊按鈕: 2)、填寫好注冊信息通過郵箱或手機驗證后注冊就成功了。登錄到個人首頁。 如果是QQ郵箱請注意激活郵件可能會被當(dāng)著垃圾郵件,到垃圾箱中可以找到。 5.2.2、創(chuàng)建項目登錄成功后,點擊左側(cè)菜單項目,點擊加號新建項目,這里創(chuàng)建的是一個公開項目,沒有Readme.md、許可證與忽視文件,原因是如果你本地已經(jīng)有一個項目了,想提交到遠程倉庫而新創(chuàng)建的3個文件本地沒有,當(dāng)然有辦法但初學(xué)避免麻煩這里我就不添加這三個文件了,輸入相關(guān)信息后點擊創(chuàng)建就成功了。 5.2.3、提交源代碼到遠程倉庫從上圖可以看出創(chuàng)建地址有兩種: https 類型的:https://git./zhangguoGit/project7.git SSH類型的:git@git.:zhangguoGit/project7.git HTTPS(推薦輕量級用戶使用)使用加密的網(wǎng)頁訪問通道讀寫倉庫,使用用戶名及密碼進行鑒權(quán)。 避免重復(fù)輸入密碼,查看 怎樣在每次 Push 時不用重復(fù)輸入密碼?
SSH(推薦資深用戶或經(jīng)常推送大型文件用戶使用)SSH全稱(Secure SHell)是一種網(wǎng)絡(luò)協(xié)議,顧名思義就是非常安全的shell,主要用于計算機間加密傳輸。 導(dǎo)入倉庫可以將已存在的Git項目或SVN項目直接導(dǎo)入。 在命令行創(chuàng)建項目: #1、創(chuàng)建目錄 mkdir project7 #2、進入目錄 cd project7 #3、初始化目錄為git項目 git init #4、創(chuàng)建md文件追加內(nèi)容# project7(一級標(biāo)題) echo "# project7" >> README.md #5、添加說明文件到暫存區(qū) git add README.md #6、提交到本地倉庫并寫日志 git commit -m "first commit" #7、添加遠程主機,主機名為origin 地址為https://git./zhangguoGit/project7.git git remote add origin https://git./zhangguoGit/project7.git #8、本地的master分支推送到origin主機,同時指定origin為默認(rèn)主機,后面就可以不加任何參數(shù)使用git push了,-u 參數(shù)指定一個默認(rèn)主機 git push -u origin master 如果創(chuàng)建已經(jīng)創(chuàng)建則只需要第7步與第8步就好了。 5.2.4、Markdown文件(.md文件)Markdown 是一種輕量級標(biāo)記語言,它允許人們“使用易讀易寫的純文本格式編寫文檔,然后轉(zhuǎn)換成有效的XHTML(或者HTML)文檔。 Markdown 語法的目標(biāo)是:成為一種適用于網(wǎng)絡(luò)的書寫語言。 1.標(biāo)題
####### 七級標(biāo)題 效果: 2.列表分為有序列表和無序列表。 有序列表
無序列表
3.引用
4.圖片和鏈接兩者格式區(qū)別在于“ ! ”。
5.粗體和斜體
6.表格
7.代碼框
8.分割線輸入 示例:
View Code
對應(yīng)的HTML:
View Code
結(jié)果: 5.3、遠程倉庫操作申請到了Git遠程倉庫的賬號并創(chuàng)建了一個空的遠程倉庫現(xiàn)在我們就可以結(jié)合本地的倉庫與遠程倉庫一起協(xié)同工作了,模擬多人協(xié)同開發(fā),這里我們?nèi)渴褂妹钔瓿伞?/p> 5.3.1、常用操作指令# 下載遠程倉庫的所有變動 $ git fetch [remote] # 顯示所有遠程倉庫 $ git remote -v # 顯示某個遠程倉庫的信息 $ git remote show [remote] # 增加一個新的遠程倉庫,并命名 $ git remote add [shortname] [url] # 取回遠程倉庫的變化,并與本地分支合并 $ git pull [remote] [branch] # 上傳本地指定分支到遠程倉庫 $ git push [remote] [branch] # 強行推送當(dāng)前分支到遠程倉庫,即使有沖突 $ git push [remote] --force # 推送所有分支到遠程倉庫 $ git push [remote] --all #簡單查看遠程---所有倉庫 git remote (只能查看遠程倉庫的名字) 5.3.2、git clone 克隆遠程操作的第一步,通常是從遠程主機克隆一個版本庫,這時就要用到 $ git clone <版本庫的網(wǎng)址> 比如,克隆一個上課示例的版本庫。 $ git clone https://github.com/zhangguo5/AngularJS04_BookStore.git 該命令會在本地主機生成一個目錄,與遠程主機的版本庫同名。如果要指定不同的目錄名,可以將目錄名作為 $ git clone <版本庫的網(wǎng)址> <本地目錄名>
$ 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協(xié)議還有另一種寫法。 $ git clone [user@]example.com:path/to/repo.git/ 通常來說,Git協(xié)議下載速度最快,SSH協(xié)議用于需要用戶認(rèn)證的場合。各種協(xié)議優(yōu)劣的詳細(xì)討論請參考 官方文檔。 示例: 結(jié)果: 5.3.3、git remote為了便于管理,Git要求每個遠程主機都必須指定一個主機名。 不帶選項的時候, $ git remote
使用 $ git remote -v
上面命令表示,當(dāng)前只有一臺遠程主機,叫做origin,以及它的網(wǎng)址。 克隆版本庫的時候,所使用的遠程主機自動被Git命名為 $ git clone -o WeUI https://github.com/Tencent/weui.git $ git remote
上面命令表示,克隆的時候,指定遠程主機叫做WeUI。
$ git remote show <主機名>
$ git remote add <主機名> <網(wǎng)址>
$ git remote rm <主機名>
$ git remote rename <原主機名> <新主機名>
5.3.4、git fetch一旦遠程主機的版本庫有了更新(Git術(shù)語叫做commit),需要將這些更新取回本地,這時就要用到 $ git fetch <遠程主機名>
上面命令將某個遠程主機的更新,全部取回本地。
默認(rèn)情況下, $ git fetch <遠程主機名> <分支名>
比如,取回 $ git fetch origin master 所取回的更新,在本地主機上要用"遠程主機名/分支名"的形式讀取。比如
上面命令表示,本地主機的當(dāng)前分支是 取回遠程主機的更新以后,可以在它的基礎(chǔ)上,使用 $ git checkout -b newBrach origin/master 上面命令表示,在 此外,也可以使用 $ git merge origin/master # 或者 $ git rebase origin/master 上面命令表示在當(dāng)前分支上,合并 5.3.5、git pull
$ git pull <遠程主機名> <遠程分支名>:<本地分支名> 比如,取回 $ git pull origin next:master
如果遠程分支是與當(dāng)前分支合并,則冒號后面的部分可以省略。 $ git pull origin next
上面命令表示,取回 $ git fetch origin
$ git merge origin/next
在某些場合,Git會自動在本地分支與遠程分支之間,建立一種追蹤關(guān)系(tracking)。比如,在 Git也允許手動建立追蹤關(guān)系。 git branch --set-upstream master origin/next
上面命令指定 如果當(dāng)前分支與遠程分支存在追蹤關(guān)系, $ git pull origin 上面命令表示,本地的當(dāng)前分支自動與對應(yīng)的 如果當(dāng)前分支只有一個追蹤分支,連遠程主機名都可以省略。 $ git pull 上面命令表示,當(dāng)前分支自動與唯一一個追蹤分支進行合并。 如果合并需要采用rebase模式,可以使用 $ git pull --rebase <遠程主機名> <遠程分支名>:<本地分支名> 如果遠程主機刪除了某個分支,默認(rèn)情況下, 但是,你可以改變這個行為,加上參數(shù) $ git pull -p # 等同于下面的命令 $ git fetch --prune origin $ git fetch -p 5.3.6、git push
$ git push <遠程主機名> <本地分支名>:<遠程分支名>
注意,分支推送順序的寫法是<來源地>:<目的地>,所以 如果省略遠程分支名,則表示將本地分支推送與之存在"追蹤關(guān)系"的遠程分支(通常兩者同名),如果該遠程分支不存在,則會被新建。 $ git push origin master
上面命令表示,將本地的 如果省略本地分支名,則表示刪除指定的遠程分支,因為這等同于推送一個空的本地分支到遠程分支。 $ git push origin :master # 等同于 $ git push origin --delete master
上面命令表示刪除 如果當(dāng)前分支與遠程分支之間存在追蹤關(guān)系,則本地分支和遠程分支都可以省略。 $ git push origin
上面命令表示,將當(dāng)前分支推送到 如果是新建分支第一次push,會提示: 以后的push就只需要輸入git push origin 原因是: #因為在git的全局配置中,有一個push.default屬性,其決定了git push操作的默認(rèn)行為。在Git 2.0之前,這個屬性的默認(rèn)被設(shè)為'matching',2.0之后則被更改為了'simple'。 #我們可以通過git version確定當(dāng)前的git版本(如果小于2.0,更新是個更好的選擇),通過git config --global push.default 'option'改變push.default的默認(rèn)行為(或者也可直接編輯~/.gitconfig文件)。 push.default 有以下幾個可選值: nothing, current, upstream, simple, matching 其用途分別為: nothing - push操作無效,除非顯式指定遠程分支,例如git push origin develop(我覺得。。??梢越o那些不愿學(xué)git的同事配上此項)。 current - push當(dāng)前分支到遠程同名分支,如果遠程同名分支不存在則自動創(chuàng)建同名分支。 upstream - push當(dāng)前分支到它的upstream分支上(這一項其實用于經(jīng)常從本地分支push/pull到同一遠程倉庫的情景,這種模式叫做central workflow)。 simple - simple和upstream是相似的,只有一點不同,simple必須保證本地分支和它的遠程 upstream分支同名,否則會拒絕push操作。 matching - push所有本地和遠程兩端都存在的同名分支。 如果當(dāng)前分支只有一個追蹤分支,那么主機名都可以省略。 $ git push
如果當(dāng)前分支與多個主機存在追蹤關(guān)系,則可以使用 $ git push -u origin master
上面命令將本地的 不帶任何參數(shù)的 $ git config --global push.default matching # 或者 $ git config --global push.default simple 還有一種情況,就是不管是否存在對應(yīng)的遠程分支,將本地的所有分支都推送到遠程主機,這時需要使用 $ git push --all origin
上面命令表示,將所有本地分支都推送到 如果遠程主機的版本比本地版本更新,推送時Git會報錯,要求先在本地做 $ git push --force origin
上面命令使用 最后, $ git push origin --tags
5.4、在命令行中同步本地倉庫示例假定我們創(chuàng)建好了一個遠程倉庫地址為:https:///u/zhangguo5/p/project7/git,現(xiàn)在我們在本地創(chuàng)建一個項目并同步到遠程倉庫中。 1)、創(chuàng)建文件添加到暫存區(qū) 2)、提交到本地倉庫 3)、提交到遠程倉庫 添加遠程主機地址: 推送文件: 結(jié)果: 說明:這里我使用的是SSH方式提交的,所有并沒有讓我輸入用戶名與密碼,如果你使用https方式提交則要配置用戶名與郵箱,還要輸入密碼。 5.5、IDEA中Git的使用工作中多人使用版本控制軟件協(xié)作開發(fā),常見的應(yīng)用場景歸納如下: 假設(shè)小組中有兩個人,組長蓋茨,組員艾倫 場景一:蓋茨創(chuàng)建項目并提交到遠程Git倉庫 場景二:艾倫從遠程Git倉庫上獲取項目源碼 場景三:艾倫修改了部分源碼,提交到遠程倉庫 場景四:蓋茨從遠程倉庫獲取艾倫的提交 場景五:艾倫接受了一個新功能的任務(wù),創(chuàng)建了一個分支并在分支上開發(fā) 場景六:艾倫把分支提交到遠程Git倉庫 場景七:蓋茨獲取艾倫提交的分支 場景八:蓋茨把分支合并到主干 下面來看以上各場景在IDEA中對應(yīng)的操作。 場景一:蓋茨創(chuàng)建項目并提交到遠程Git倉庫在IDEA中配置Git 測試環(huán)境是否正常 創(chuàng)建好項目,這里創(chuàng)建了一個Maven項目,結(jié)構(gòu)如下,當(dāng)然可以是任意項目: 選擇VCS - > Enable Version Control Integration,允許將項目集成到版本控制器中 選擇版本控制器類型 完成后當(dāng)前項目就變成一個Git項目,是工作空間 點擊OK后創(chuàng)建完成本地倉庫,注意,這里僅僅是本地的。下面把項目源碼添加到本地倉庫。 下圖是Git與提交有關(guān)的三個命令對應(yīng)的操作,Add命令是把文件從IDE的工作目錄添加到本地倉庫的stage區(qū),Commit命令把stage區(qū)的暫存文件提交到當(dāng)前分支的倉庫,并清空stage區(qū)。Push命令把本地倉庫的提交同步到遠程倉庫。 IDEA中對操作做了一定的簡化,Commit和Push可以在一步中完成。 具體操作,在項目上點擊右鍵,選擇Git菜單,如果使用Add則將文件從工作空間提交到暫存庫,Commit Directory則是同時完成提交到暫存與本地倉庫。 選擇要提交的文件,填寫消息 將本地倉庫的內(nèi)容提交到遠程倉庫 定義遠程地址的別名
輸入名稱與URL 點擊push將本地倉庫的內(nèi)容推送到遠程服務(wù)器
提示Push Successful就成功了 提交后的遠程庫
場景二:艾倫從遠程Git倉庫上獲取項目源碼即克隆項目,操作如下: 輸入蓋茨Push時填寫的遠程倉庫地址 填寫倉庫地址、要克隆到的父目錄與項目目錄 接下來按向?qū)Р僮?,即可把項目從遠程倉艾倫隆到本地倉庫和IDE工作區(qū)。 當(dāng)提示簽出成功點擊打開就可以看到項目了 下載到本地的文件 其它方法 場景三:艾倫修改了部分源碼,提交到遠程倉庫這個操作和首次提交的流程基本一致,分別是 Add -> Commit -> Push。請參考場景一 添加一個類,并提交
提交到本地倉庫 提交到遠程倉庫 場景四:蓋茨從遠程倉庫獲取艾倫的提交獲取更新有兩個命令:Fetch和Pull,F(xiàn)etch是從遠程倉庫下載文件到本地的origin/master,然后可以手動對比修改決定是否合并到本地的master庫。Pull則是直接下載并合并。如果各成員在工作中都執(zhí)行修改前先更新的規(guī)范,則可以直接使用Pull方式以簡化操作。
選擇分支 場景五:艾倫接受了一個新功能的任務(wù),創(chuàng)建了一個分支并在分支上開發(fā)建分支也是一個常用的操作,例如臨時修改bug、開發(fā)不確定是否加入的功能等,都可以創(chuàng)建一個分支,再等待合適的時機合并到主干。 創(chuàng)建流程如下: 選擇New Branch并輸入一個分支的名稱 創(chuàng)建完成后注意IDEA的右下角,如下圖,Git: dev表示已經(jīng)自動切換到dev分支,當(dāng)前工作在這個分支上。 點擊后彈出一個小窗口,在Local Branches中有其他可用的本地分支選項,點擊后選擇Checkout即可切換當(dāng)前工作的分支(見場景7操作切換其他分支)。 如下圖,點擊Checkout 注意,這里創(chuàng)建的分支僅僅在本地倉庫,如果想讓組長蓋茨獲取到這個分支,還需要提交到遠程倉庫。 場景六:艾倫把分支提交到遠程Git倉庫切換到新建的分支,使用Push功能 提交到遠程 艾倫將新開發(fā)的功能提交到遠程 提交到遠程 場景七:蓋茨獲取艾倫提交的分支使用Pull功能打開更新窗口,點擊Remote欄后面的刷新按鈕,會在Branches to merge欄中刷新出新的分支。這里并不想做合并,所以不要選中任何分支,直接點擊Pull按鈕完成操作。
更新后,再點擊右下角,可以看到在Remote Branches區(qū)已經(jīng)有了新的分支,點擊后在彈出的子菜單中選擇Checkout as new local branch,在本地倉庫中創(chuàng)建該分支。完成后在Local Branches區(qū)也會出現(xiàn)該分支的選項,可以按上面的方法,點擊后選擇Checkout切換。 切換遠程分支: 切換本地分支: 場景八:蓋茨把分支合并到主干新功能開發(fā)完成,體驗很好,項目組決定把該功能合并到主干上。 切換到master分支,選擇Merge Changes 選擇要合并的分支,點擊Merge完成 六、作業(yè)與評分標(biāo)準(zhǔn)作業(yè)要求: 1、申請一個遠程git賬號,創(chuàng)建一個倉庫 2、將本人第一次提升時提交的IDEA作業(yè)升級為一個git項目并提交到遠程倉庫中 3、在git bash下執(zhí)行: history > mylog.txt,并提交到遠程倉庫 (把本地執(zhí)行過的git指令導(dǎo)出到mylog.txt文件中) 提交內(nèi)容: 將您同步的遠程倉庫地址,如:https:///u/yourname/p/ideaproject/git 發(fā)送到我的郵箱99510309#qq.com或在當(dāng)前博客下留言 提交時間: 2017-09-28 星期四 中午12:00前 七、資源與資料下載
資料鏈接: https://pan.baidu.com/s/1c20DVOW 密碼: p9ri
示例1:
View Code
示例2:
View Code
示例3:
View Code
八、視頻https://www.bilibili.com/video/av14813510/
|
|