git教程
- 目錄
- 一、版本控制概要
- 1.1、什麼是版本控制
- 1.2、常用術語
- 1.3、常見的版本控制器
- 1.4、版本控制分類
- 1.4.1、本地版本控制
- 1.4.2、集中版本控制
- 1.4.3、分散式版本控制
- 1.5、Git與SVN最主要區別
- 二、Git安裝與配置
- 2.1、什麼是Git
- 2.2、搭建Git工作環境
- 2.2.1、下載Git
- 2.2.2、安裝Git
- 2.2.3、啟動Git
- 2.2.4、Linux與Mac OS安裝Git
- 2.2.5、Bash基本操作命令
- 2.3、Git配置 - git config
- 2.3.1、檢視配置 - git config -l
- 2.3.2、Git配置檔案分類
- 2.3.3、設定使用者名稱與郵箱(使用者標識,必要)
- 2.3.4、新增或刪除配置項
- 2.3.5、更多配置項
- 三、Git理論基礎
- 3.1、工作區域
- 3.2、工作流程
- 3.3、圖解教程
- 四、Git操作
- 4.1、建立工作目錄與常用指令
- 4.2、獲得GIT倉庫
- 4.2.1、建立全新倉庫
- 4.2.2、克隆遠端倉庫
- 4.3、GIT檔案操作
- 4.3.1、檔案4種狀態
- 4.3.2、檢視檔案狀態
- 4.3.3、新增檔案與目錄
- 4.3.4、移除檔案與目錄(撤銷add)
- 4.3.5、檢視檔案修改後的差異
- 4.3.6、簽出
- 4.3.6、忽略檔案
- 4.3.7、提交
- 4.3.8、日誌與歷史
- 4.3.9、檢視檔案列表
- 4.3.10、撤銷更新
- 4.3.11、刪除檔案
- 4.3.12、檔案操作小結
- 4.4、GIT分支
- 4.4.1、新建分支與切換分支
- 4.4.2、檢視分支
- 4.4.3、分支合併
- 4.4.4、解決衝突
- 4.4.5、刪除分支
- 4.5、Git GUI 操作
- 4.5.1、GitHub for Desktop
- 4.5.2、Source Tree
- 4.5.3、TortoiseGit
- 4.5.4、Git整合Gui工具
- 4.6、IDE整合的Git客戶端
- 4.6.1、Eclipse – Egit
- 4.6.2、Visual Studio – Git Integration & GitHub Extension
- 4.6.3、IntelliJ IDEA
- 4.7、幫助與程式碼統計
- 五、遠端倉庫
- 5.1、託管平臺
- 5.1.1、GitHub
- 5.1.2、Gitlab
- 5.1.3、Bitbucket
- 5.1.4、開源中國程式碼託管
- 5.1.5、(推薦)coding.net
- 5.2、申請帳號與設定
- 5.2.1、申請帳號
- 5.2.2、建立專案
- 5.2.3、提交原始碼到遠端倉庫
- 5.2.4、Markdown檔案(.md檔案)
- 5.3、遠端倉庫操作
- 5.3.1、常用操作指令
- 5.3.2、git clone 克隆
- 5.3.3、git remote
- 5.3.4、git fetch
- 5.3.5、git pull
- 5.3.6、git push
- 5.4、在命令列中同步本地倉庫示例
一、版本控制概要
1.1、什麼是版本控制
版本控制(Revision control)是一種在開發的過程中用於管理我們對檔案、目錄或工程等內容的修改歷史,方便檢視更改歷史記錄,備份以便恢復以前的版本的軟體工程技術。
- 實現跨區域多人協同開發
- 追蹤和記載一個或者多個檔案的歷史記錄
- 組織和保護你的原始碼和文件
- 統計工作量
- 並行開發、提高開發效率
- 跟蹤記錄整個軟體的開發過程
- 減輕開發人員的負擔,節省時間,同時降低人為錯誤
簡單說就是用於管理多人協同開發專案的技術。
沒有進行版本控制或者版本控制本身缺乏正確的流程管理,在軟體開發過程中將會引入很多問題,如軟體程式碼的一致性、軟體內容的冗餘、軟體過程的事物性、軟體開發過程中的併發性、軟體原始碼的安全性,以及軟體的整合等問題。
1.2、常用術語
1)、倉庫(Repository)
受版本控制的所有檔案修訂歷史的共享資料庫
2)、工作空間(Workspace)
本地硬碟或Unix 使用者帳戶上編輯的檔案副本
3)、工作樹/區(Working tree)
工作區中包含了倉庫的工作檔案。您可以修改的內容和提交更改作為新的提交到倉庫。
4)、暫存區(Staging area)
暫存區是工作區用來提交更改(commit)前可以暫存工作區的變化。
5)、索引(Index)
索引是暫存區的另一種術語。
6)、簽入(Checkin)
將新版本複製回倉庫
7)、簽出(Checkout)
從倉庫中將檔案的最新修訂版本複製到工作空間
8)、提交(Commit)
對各自檔案的工作副本做了更改,並將這些更改提交到倉庫
9)、衝突(Conflict)
多人對同一檔案的工作副本進行更改,並將這些更改提交到倉庫
10)、合併(Merge)
將某分支上的更改聯接到此主幹或同為主幹的另一個分支
11)、分支(Branch)
從主線上分離開的副本,預設分支叫master
12)、鎖(Lock)
獲得修改檔案的專有許可權。
13)、頭(HEAD)
頭是一個象徵性的參考,最常用以指向當前選擇的分支。
14)、修訂(Revision)
表示程式碼的一個版本狀態。Git通過用SHA1 hash演算法表示的ID來標識不同的版本。
15)、標記(Tags)
標記指的是某個分支某個特定時間點的狀態。通過標記,可以很方便的切換到標記時的狀態。
1.3、常見的版本控制器
主流的版本控制器有如下這些:
- Git
- SVN(Subversion)
- CVS(Concurrent Versions System)
- VSS(Micorosoft Visual SourceSafe)
- TFS(Team Foundation Server)
- Visual Studio Online
版本控制產品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),現在影響力最大且使用最廣泛的是Git與SVN
1.4、版本控制分類
1.4.1、本地版本控制
記錄檔案每次的更新,可以對每個版本做一個快照,或是記錄補丁檔案,適合個人用,如RCS。
1.4.2、集中版本控制
所有的版本資料都儲存在伺服器上,協同開發者從伺服器上同步更新或上傳自己的修改
所有的版本資料都存在伺服器上,使用者的本地只有自己以前所同步的版本,如果不連網的話,使用者就看不到歷史版本,也無法切換版本驗證問題,或在不同分支工作。而且,所有資料都儲存在單一的伺服器上,有很大的風險這個伺服器會損壞,這樣就會丟失所有的資料,當然可以定期備份。代表產品:SVN、CVS、VSS
1.4.3、分散式版本控制
所有版本資訊倉庫全部同步到本地的每個使用者,這樣就可以在本地檢視所有版本歷史,可以離線在本地提交,只需在連網時push到相應的伺服器或其他使用者那裡。由於每個使用者那裡儲存的都是所有的版本資料,只要有一個使用者的裝置沒有問題就可以恢復所有的資料,但這增加了本地儲存空間的佔用。
1.5、Git與SVN最主要區別
SVN是集中式版本控制系統,版本庫是集中放在中央伺服器的,而工作的時候,用的都是自己的電腦,所以首先要從中央伺服器得到最新的版本,然後工作,完成工作後,需要把自己做完的活推送到中央伺服器。集中式版本控制系統是必須聯網才能工作,對網路頻寬要求較高。
Git是分散式版本控制系統,沒有中央伺服器,每個人的電腦就是一個完整的版本庫,工作的時候不需要聯網了,因為版本都在自己電腦上。協同的方法是這樣的:比如說自己在電腦上改了檔案A,其他人也在電腦上改了檔案A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。
二、Git安裝與配置
2.1、什麼是Git
Git是目前世界上最先進的分散式版本控制系統。
Git是免費、開源的
最初Git是為輔助 Linux 核心開發的,來替代 BitKeeper
作者:Linux和Git之父李納斯·託沃茲(Linus Benedic Torvalds)1969、芬蘭
優點:
- 適合分散式開發,強調個體。
- 公共伺服器壓力和資料量都不會太大。
- 速度快、靈活。
- 任意兩個開發者之間可以很容易的解決衝突。
- 離線工作。
缺點:
- 模式上比SVN更加複雜。
- 不符合常規思維。
- 程式碼保密性差,一旦開發者把整個庫克隆下來就可以完全公開所有程式碼和版本資訊。
原始碼: https://github.com/git/git/
2.2、搭建Git工作環境
2.2.1、下載Git
開啟 git官網,下載git對應作業系統的版本。
選擇版本:
這裡我選擇下載64-bit Git for Windows Setup
2.2.2、安裝Git
選擇安裝配置資訊
一直Next預設就好了,如果需要設定就要仔細讀一下安裝介面上的選項。
2.2.3、啟動Git
安裝成功後在開始選單中會有Git項,選單下有3個程式:
Git Bash:Unix與Linux風格的命令列,使用最多,推薦最多
與DOS風格的命令有些區別,不習慣可以選擇Git CMD
Git CMD:Windows風格的命令列
Git GUI:圖形介面的Git,不建議初學者使用,儘量先熟悉常用命令
點選Create New Repository可以直接建立一個新的倉庫。
2.2.4、Linux與Mac OS安裝Git
Linux安裝Git:sudo apt-get install git 命令列就可以安裝了。
Mac OS安裝Git: https://git-scm.com/download/mac,下載雙擊.pkg安裝
2.2.5、Bash基本操作命令
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)、#表示註釋
2.3、Git配置 - git config
2.3.1、檢視配置 - git config -l
使用git config -l 可以檢視現在的git環境詳細配置
檢視不同級別的配置檔案:
#檢視系統config git config --system --list #檢視當前使用者(global)配置 git config --global --list #檢視當前倉庫配置資訊 git config --local --list
2.3.2、Git配置檔案分類
在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
這裡可以直接編輯配置檔案,通過命令設定後會響應到這裡。
2.3.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為全域性配置,不加為某個專案的特定配置。
2.3.4、新增或刪除配置項
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配置項移除
2.3.5、更多配置項
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理論基礎
3.1、工作區域
Git本地有三個工作區域:工作目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)。如果在加上遠端的git倉庫(Remote Directory)就可以分為四個工作區域。檔案在這四個區域之間的轉換關係如下:
- Workspace:工作區,就是你平時存放專案程式碼的地方
- Index / Stage:暫存區,用於臨時存放你的改動,事實上它只是一個檔案,儲存即將提交到檔案列表資訊
- Repository:倉庫區(或本地倉庫),就是安全存放資料的位置,這裡面有你提交到所有版本的資料。其中HEAD指向最新放入倉庫的版本
- Remote:遠端倉庫,託管程式碼的伺服器,可以簡單的認為是你專案組中的一臺電腦用於遠端資料交換
本地的三個區域確切的說應該是git倉庫中HEAD指向的版本
- Directory:使用Git管理的一個目錄,也就是一個倉庫,包含我們的工作空間和Git的管理空間。
- WorkSpace:需要通過Git進行版本控制的目錄和檔案,這些目錄和檔案組成了工作空間。
- .git:存放Git管理資訊的目錄,初始化倉庫的時候自動建立。
- Index/Stage:暫存區,或者叫待提交更新區,在提交進入repo之前,我們可以把所有的更新放在暫存區。
- Local Repo:本地倉庫,一個存放在本地的版本庫;HEAD會只是當前的開發分支(branch)。
- Stash:隱藏,是一個工作狀態儲存棧,用於儲存/恢復WorkSpace中的臨時狀態。
3.2、工作流程
git的工作流程一般是這樣的:
1、在工作目錄中新增、修改檔案;
2、將需要進行版本管理的檔案放入暫存區域;
3、將暫存區域的檔案提交到git倉庫。
因此,git管理的檔案有三種狀態:已修改(modified),已暫存(staged),已提交(committed)
3.3、圖解教程
個人認為Git的原理相比別的版本控制器還是複雜一些的,有一份圖解教程比較直觀:
四、Git操作
4.1、建立工作目錄與常用指令
工作目錄(WorkSpace)一般就是你希望Git幫助你管理的資料夾,可以是你專案的目錄,也可以是一個空目錄,建議不要有中文。
日常使用只要記住下圖6個命令:
4.2、獲得GIT倉庫
建立本地倉庫的方法有兩種:一種是建立全新的倉庫,另一種是克隆遠端倉庫。
4.2.1、建立全新倉庫
需要用GIT管理的專案的根目錄執行:
# 在當前目錄新建一個Git程式碼庫 $ git init
執行:
結果:
執行後可以看到,僅僅在專案目錄多出了一個.git目錄,關於版本等的所有資訊都在這個目錄裡面。
當然如果使用如下命令,可以把建立目錄與倉庫一起完成:
# 新建一個目錄,將其初始化為Git程式碼庫 $ git init [project-name]
執行命令與執行結果:
4.2.2、克隆遠端倉庫
另一種方式是克隆遠端目錄,由於是將遠端伺服器上的倉庫完全映象一份至本地,而不是取某一個特定版本,所以用clone而不是checkout,語法格式如下:
# 克隆一個專案和它的整個程式碼歷史(版本資訊) $ git clone [url]
執行:
比如我們要從克隆的遠端倉庫託管在github上,地址為:https://github.com/zhangguo5/SuperPlus.git,這是一個公開的專案
結果:
4.3、GIT檔案操作
版本控制就是對檔案的版本控制,要對檔案進行修改、提交等操作,首先要知道檔案當前在什麼狀態,不然可能會提交了現在還不想提交的檔案,或者要提交的檔案沒提交上。GIT不關心檔案兩個版本之間的具體差別,而是關心檔案的整體是否有改變,若檔案被改變,在新增提交時就生成檔案新版本的快照,而判斷檔案整體是否改變的方法就是用SHA-1演算法計算檔案的校驗和。
4.3.1、檔案4種狀態
-
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.3.2、檢視檔案狀態
上面說檔案有4種狀態,通過如下命令可以檢視到檔案的狀態:
#檢視指定檔案狀態 git status [filename] #檢視所有檔案狀態 git status
命令:
結果:
foo.htm檔案的狀態為untracked(未跟蹤),提示通過git add可以暫存
GIT在這一點做得很好,在輸出每個檔案狀態的同時還說明了怎麼操作,像上圖就有怎麼暫存、怎麼跟蹤檔案、怎麼取消暫存的說明。
4.3.3、新增檔案與目錄
工作區(Working Directory)就是你在電腦裡能看到的目錄。
版本庫(Repository)工作區有一個隱藏目錄.git
,這個不算工作區,而是Git的版本庫。
Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動建立的第一個分支master
,以及指向master
的一個指標叫HEAD
。
將untracked狀態的檔案新增到暫存區,語法格式如下:
# 新增指定檔案到暫存區 $ git add [file1] [file2] ... # 新增指定目錄到暫存區,包括子目錄 $ git add [dir] # 新增當前目錄的所有檔案到暫存區 $ git add .
執行:
4.3.4、移除檔案與目錄(撤銷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 分支中的全部或者部分檔案替換暫存區和以及工作區中的檔案。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改 動。
4.3.5、檢視檔案修改後的差異
git diff用於顯示WorkSpace中的檔案和暫存區檔案的差異
用"git status"只能檢視對哪些檔案做了改動,如果要看改動了什麼,可以用:
#檢視檔案修改後的差異 git diff [files]
命令:
---a表示修改之前的檔案,+++b表示修改後的檔案
#比較暫存區的檔案與之前已經提交過的檔案 git diff --cached
也可以把WorkSpace中的狀態和repo中的狀態進行diff,命令如下:
#比較repo與工作空間中的檔案差異 git diff HEAD~n
4.3.6、簽出
如果倉庫中已經存在檔案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 表示恢復檔案到本地版本庫中最新的狀態。
示例:
4.3.6、忽略檔案
有些時候我們不想把某些檔案納入版本控制中,比如資料庫檔案,臨時檔案,設計檔案等
在主目錄下建立".gitignore"檔案,此檔案有如下規則:
- 忽略檔案中的空行或以井號(#)開始的行將會被忽略。
- 可以使用Linux萬用字元。例如:星號(*)代表任意多個字元,問號(?)代表一個字元,方括號([abc])代表可選字元範圍,大括號({string1,string2,...})代表可選的字串等。
- 如果名稱的最前面有一個感嘆號(!),表示例外規則,將不被忽略。
- 如果名稱的最前面是一個路徑分隔符(/),表示要忽略的檔案在此目錄下,而子目錄中的檔案不忽略。
- 如果名稱的最後面是一個路徑分隔符(/),表示要忽略的是此目錄下該名稱的子目錄,而非檔案(預設檔案或目錄都忽略)。
如:
#為註釋 *.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開發專案忽視檔案:
4.3.7、提交
通過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>
這條命令會把指定的提交的所有修改回滾,並同時生成一個新的提交。
4.3.8、日誌與歷史
檢視提交日誌可以使用git log指令,語法格式如下:
#檢視提交日誌 git log [<options>] [<revision range>] [[\--] <path>…]
示例:
"git log --graph"以圖形化的方式顯示提交歷史的關係,這就可以方便地檢視提交歷史的分支資訊,當然是控制檯用字元畫出來的圖形。
"git log -1"則表示顯示1行。
使用history可以檢視您在bash下輸入過的指令:
幾乎所有輸入過的都被記錄下來的,不愧是做版本控制的。
檢視所有分支日誌
"git reflog"中會記錄這個倉庫中所有的分支的所有更新記錄,包括已經撤銷的更新。
4.3.9、檢視檔案列表
使用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])*
示例:
4.3.10、撤銷更新
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中
4.3.11、刪除檔案
1)、刪除未跟蹤檔案
如果檔案還是未跟蹤狀態,直接刪除檔案就可了,bash中使用rm可以刪除檔案,示例如下:
2)、刪除已提交檔案
-f 強制刪除,物理刪除了,同時刪除工作區和暫存區中的檔案
撤銷刪除:
#to discard changes in working directory git checkout -- <file>...
3)、刪除暫存區的檔案,不刪除工作區的檔案
使用git reset HEAD <file>...同樣可以實現上面的功能
4.3.12、檔案操作小結
Git很強大,很靈活,這是毋庸置疑的。但也正因為它的強大造成了它的複雜,因此會有很多奇奇怪怪的問題出現,多用就好了。
4.4、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]
4.4.1、新建分支與切換分支
預設分支是這樣的,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]
4.4.2、檢視分支
1)、列出所有本地分支使用$ git branch
2)、列表所有遠端分支使用$ git branch -r
3)、列出所有本地分支和遠端分支使用$ git branch -a
4.4.3、分支合併
合併指定分支到當前分支使用指令$ git merge [branch]
這裡的合併分支就是對分支的指標操作,我們先建立一個分支再合併到主分支:
這裡的file11.txt主分支與dev6的內容現在是不同的,因為在dev6中已被修改過,我們可以使用指令檢視:
現在我們將dev6合併到主分支中去,從下圖中可以看出dev6中有一次提交,而master並沒有
合併後在master上檢視file11.txt檔案內容與dev6上的內容就一樣了,合併後dev6中多出的提交在master也擁有了。
4.4.4、解決衝突
如果同一個檔案在合併分支時都被修改了則會引起衝突,如下所示:
提交前兩個分支的狀態
在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上來。
4.4.5、刪除分支
刪除本地分支可以使用命令:$ git branch -d [branch-name],-D(大寫)強制刪除
刪除遠端分支可以使用如下指令:
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
-d表示刪除分支。分支必須完全合併在其上游分支,或者在HEAD上沒有設定上游
-r表示遠端的意思remotes,如果-dr則表示刪除遠端分支
4.5、Git GUI 操作
通過命令列可以深刻的理解Git,Git GUI或IDE外掛卻可以更加直觀操作Git,常用的Git GUI有如下這些:
4.5.1、GitHub for Desktop
全球開發人員交友俱樂部提供的強大工具,功能完善,使用方便。對於使用GitHub的開發人員來說是非常便捷的工具。
GitHub for Desktop不帶三方合併工具,你必須自己手動解決衝突才可以。
– 免費
– 同時支援 Windows 和 Mac:對於需要經常在不同的作業系統間切換的開發人員來說非常方便。
– 漂亮的介面:作為每天盯著看的工具,顏值是非常重要的
– 支援Pull Request:直接從客戶端提交PR,很方便
– Timeline 支援:直接在時間線上顯示每次提交的時間點和大小
– 支援git LFS:儲存大檔案更加節省空間和高效
– 不支援三方合併:需要藉助第三方工具才行
4.5.2、Source Tree
SourceTree是老牌的Git GUI管理工具了,也號稱是最好用的Git GUI工具。強大,功能豐富,基本操作和高階操作都設計得非常流暢,適合初學者上手,支援Git Flow。
– 免費
– 功能強大:無論你是新手還是重度使用者,SourceTree 都會讓你覺得很順手。對於非常重度使用者,Source Tree還支援自定義指令碼的執行。
– 同時支援 Windows 和 Mac 作業系統
– 同時支援 Git 和 Mercurial 兩種 VCS
– 內建GitHub, BitBucket 和 Stash 的支援:直接繫結帳號即可操作遠端repo
4.5.3、TortoiseGit
小烏龜,SVN的超廣泛使用也使得這個超好用的Svn客戶端成了幾乎每個開發人員的桌面必備軟體。小烏龜只提供Windows版本,提供中文版支援的。
– 免費
– 只支援Windows作業系統:與檔案管理器的良好整合
– 中文介面
– 與TortoiseSVN一脈相承的操作體驗
4.5.4、Git整合Gui工具
安裝Git時會整合安裝Gui工具,在Git選單下可以找到,特點是:免費、簡單、不需要額外安裝
4.6、IDE整合的Git客戶端
對於使用IDE進行開發的程式設計師來說,可以不離開常用的IDE就直接操作原始碼管理系統是最好的選擇,以下是我對幾個常見的IDE整合的git客戶端:
4.6.1、Eclipse – Egit
作為Java整合開發環境的代表,Eclipse內建了egit這個外掛來提供git的整合支援。實話實說,這個外掛的功能非常豐富,無論是普通的clone, commit, pull/push操作;還是複雜一些的git flow都有支援。
4.6.2、Visual Studio – Git Integration & GitHub Extension
VS裡面的Git支援已經相當的完善。直接克隆github上的repo
4.6.3、IntelliJ IDEA
4.7、幫助與程式碼統計
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 以其強大的分支和克隆功能,更加方便了開發者遠端協作。
5.1、託管平臺
Git程式碼託管平臺,首先推薦的是GitHub,好多好的開源專案都來自GitHub,但是GitHub只能新建公開的Git倉庫,私有倉庫要收費,有時候訪問比較卡,如果你做的是一個開源專案,可以首選GitHub。下面推薦幾個比較好的Git程式碼託管平臺:
5.1.1、GitHub
關於GItHub相信大家都有耳聞,我就不詳細介紹了。GitHub地址: https://github.com/,其首頁如圖:
5.1.2、Gitlab
對於有些人,提到GitHub就會自然的想到Gitlab,Gitlab支援無限的公有專案和私有專案。Gitlab地址: https://about.gitlab.com/,其首頁截圖如圖:
5.1.3、Bitbucket
bitbucket免費支援5個開發成員的團隊建立無限私有程式碼託管庫。bitbucket地址:
5.1.4、開源中國程式碼託管
開源中國一個賬號最多可以建立1000個專案,包含公有和私有,開源中國程式碼託管地址: http://git.oschina.net/,其首頁如圖:
5.1.5、(推薦)coding.net
談到coding.net,首先必須提的是速度快,功能與開源中國相似,同樣一個賬號最多可以建立1000個專案(5個私有),也支援任務的建立等。coding.net地址: https://coding.net/:
我個人比較推薦Coding.net、GItHub。
當然還有許多,如CSDN,百度,阿里等,歡迎大家比較後推薦。
選擇國外的主機請考慮網速,選擇國內的主機請考慮穩定與安全性。
5.2、申請帳號與設定
因為coding.net免費,可以建立私有專案,且速度不錯,這裡我們以coding.net為託管平臺完成遠端倉庫的帳號申請與操作。
5.2.1、申請帳號
1)、開啟 https://coding.net/,點選右上角的註冊按鈕:
2)、填寫好註冊資訊通過郵箱或手機驗證後註冊就成功了。登入到個人首頁。
如果是QQ郵箱請注意啟用郵件可能會被當著垃圾郵件,到垃圾箱中可以找到。
5.2.2、建立專案
登入成功後,點選左側選單專案,點選加號新建專案,這裡建立的是一個公開專案,沒有Readme.md、許可證與忽視檔案,原因是如果你本地已經有一個專案了,想提交到遠端倉庫而新建立的3個檔案本地沒有,當然有辦法但初學避免麻煩這裡我就不新增這三個檔案了,輸入相關資訊後點選建立就成功了。
5.2.3、提交原始碼到遠端倉庫
從上圖可以看出建立地址有兩種:
https 型別的:https://git.coding.net/zhangguoGit/project7.git
SSH型別的:git@git.coding.net:zhangguoGit/project7.git
HTTPS(推薦輕量級使用者使用)
使用加密的網頁訪問通道讀寫倉庫,使用使用者名稱及密碼進行鑑權。 避免重複輸入密碼,檢視 怎樣在每次 Push 時不用重複輸入密碼?
提示:Git 使用者名稱為 Coding 的賬戶郵箱或者個性字尾,密碼為 Coding 的賬戶密碼。
注意:HTTPS 方式 push 大檔案可能引發錯誤,檢視 Push 出錯怎麼辦?
SSH(推薦資深使用者或經常推送大型檔案使用者使用)
SSH全稱(Secure SHell)是一種網路協議,顧名思義就是非常安全的shell,主要用於計算機間加密傳輸。
使用加密通道讀寫倉庫,無單次上傳限制,需先設定 “賬戶 SSH 公鑰”,完成配對驗證。
匯入倉庫可以將已存在的Git專案或SVN專案直接匯入。
在命令列建立專案:
#1、建立目錄 mkdir project7 #2、進入目錄 cd project7 #3、初始化目錄為git專案 git init #4、建立md檔案追加內容# project7(一級標題) echo "# project7" >> README.md #5、新增說明檔案到暫存區 git add README.md #6、提交到本地倉庫並寫日誌 git commit -m "first commit" #7、新增遠端主機,主機名為origin 地址為https://git.coding.net/zhangguoGit/project7.git git remote add origin https://git.coding.net/zhangguoGit/project7.git #8、本地的master分支推送到origin主機,同時指定origin為預設主機,後面就可以不加任何引數使用git push了,-u 引數指定一個預設主機 git push -u origin master
如果建立已經建立則只需要第7步與第8步就好了。
5.2.4、Markdown檔案(.md檔案)
Markdown 是一種輕量級標記語言,它允許人們“使用易讀易寫的純文字格式編寫文件,然後轉換成有效的XHTML(或者HTML)文件。
Markdown 語法的目標是:成為一種適用於網路的書寫語言。
1.標題
# 一級標題
## 二級標題
### 三級標題
#### 四級標題
##### 五級標題
###### 六級標題
####### 七級標題
效果:
2.列表
分為有序列表和無序列表。
有序列表
1. 1
2. 2
3. 3
無序列表
* 1
* 2
* 3
3.引用
> 這是引用
4.圖片和連結
兩者格式區別在於“ ! ”。
![圖片描述](圖片連結)
[連結描述](連結地址)
5.粗體和斜體
**這是粗體**
*這是斜體*
6.表格
| Tables | Are | Cool |
| ------------ |:------------:| -----:|
| col 3 is | right-aligned| $1600 |
| col 2 is | centered | $12 |
| zebra stripes| are neat | &1 |
7.程式碼框
用``這個把程式碼包裹起來
8.分割線
輸入***
即可。
示例:
對應的HTML:
結果:
線上實時預覽工具
5.3、遠端倉庫操作
申請到了Git遠端倉庫的帳號並建立了一個空的遠端倉庫現在我們就可以結合本地的倉庫與遠端倉庫一起協同工作了,模擬多人協同開發,這裡我們全部使用命令完成。
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] # 強行推送當前分支到遠端倉庫,即使有衝突 $ 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]
5.3.2、git clone 克隆
遠端操作的第一步,通常是從遠端主機克隆一個版本庫,這時就要用到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協議用於需要使用者認證的場合。各種協議優劣的詳細討論請參考 官方文件。
示例:
結果:
5.3.3、git remote
為了便於管理,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 <原主機名> <新主機名>
5.3.4、git fetch
一旦遠端主機的版本庫有了更新(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
。
5.3.5、git pull
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
5.3.6、git push
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
5.4、在命令列中同步本地倉庫示例
假定我們建立好了一個遠端倉庫地址為:https://coding.net/u/zhangguo5/p/project7/git,現在我們在本地建立一個專案並同步到遠端倉庫中。
1)、建立檔案新增到暫存區
2)、提交到本地倉庫
3)、提交到遠端倉庫
新增遠端主機地址:
推送檔案:
結果:
說明:這裡我使用的是SSH方式提交的,所有並沒有讓我輸入使用者名稱與密碼,如果你使用https方式提交則要配置使用者名稱與郵箱,還要輸入密碼。
六、資源與資料下載
- 權威Git書籍 ProGit(中文版)
- git官網: http://git-scm.com
- git手冊: http://git-scm.com/docs
- 網友整理的Git@osc教程,請 點選這裡;
- 一份很好的 Git 入門教程,請 點選這裡;
- Git圖解教程