1. 程式人生 > >版本管理-圖解Git的分支管理原理,深度分析fetch和pull區別

版本管理-圖解Git的分支管理原理,深度分析fetch和pull區別

1分散式與集中式

1)Git是分散式,無SVN那樣的“中央伺服器”;
2)Git每個人電腦裡都有完整的版本庫,但是SVN的中央伺服器出了問題,所有人都沒法幹活了;Git除了每人都有一個版本庫外,還有一個遠端倉庫,SVN只有一個版本庫;
3)SVN適合於區域網,因為它在網速慢的時候,可能提交一個10M的檔案都需要5分鐘,在這種情況下,Git只需要提交到本地庫便可;
4)Git有暫存區的概念進而實現每次提交的是修改,SVN無;

2 Git版本管理基本思想和命令

版本管理的檔案型別

版本控制系統無法管理二進位制檔案。只能跟蹤文字檔案,TXT檔案,網頁,程式程式碼等純文字檔案。
最好使用標準的UTF-8編碼。
工作區(Working Directory):本地被管理的檔案(不帶.git的其他資料夾);
版本庫(Repository): **.git資料夾**。

理解Git的暫存區

理解Git的暫存區(stage 或 index)如下圖所示,左側是工作區(working directory),右側是版本庫(Repository),每次add某個檔案時,就會存放在版本庫的stage,commit後才真正的提交到本地的版本庫中,預設git init時,會建立一個master分支,以及一個指向master的指標Head。


這裡寫圖片描述

如果修改的檔案不存放到stage中,就直接commit,修改就不會提交到本地版本庫。

分支管理

初始只有一個master分支,HEAD指向master,如下圖a所示,


這裡寫圖片描述
a

建立一個branch分支。僅僅建立一個branch指標,等於master,並修改HEAD使其指向branch,如下圖b所示,


這裡寫圖片描述
b

在分支上修改,


這裡寫圖片描述
c

將分支上修改合併到master上。修改master指標指向,指向branch中的修改,HEAD指向master,刪除branch指標,


這裡寫圖片描述
d

解決分支衝突
在分支上做了一些修改並提交,然後切換回master,做了一些修改並提交,如下圖所示,這個時候想合併mybranch分支的修改到master上,有可能發生衝突,需要手動解決,


這裡寫圖片描述

merge後,顯示衝突已經解決,merge後的示意圖如下,


這裡寫圖片描述

深刻理解git fetch 和 git pull的區別

.git資料夾的檔案系統如下圖所示,refs資料夾存放工作區和本地庫,本地庫和遠端庫的引用關係,是最重要的一部分。


這裡寫圖片描述

refs資料夾內包括,heads,remotes,,tags 。heads資料夾工作區和本地庫的關聯關係,存放著本地庫的最新commit id。remotes資料夾中的每一個資料夾代表一個遠端庫名稱(git remote),其中的每個檔案關聯遠端庫的一個分支,其中儲存該分支的最新commit id。


這裡寫圖片描述

git fetch origin master 表示從遠端庫origin中獲取最新的版本,只會將remotes資料夾(存放著本地庫所關聯的遠端庫)的commit id更新至最新,heads資料夾不會改動,即不會修改本地庫的HEAD。

git pull origin master 本地庫更新至最新,git pull會將本地庫更新至遠端庫的最新狀態,由於本地庫進行了更新,HEAD也會相應的指向最新的commit id。 heads和remotes資料夾都修改指向最新的commit id。如下圖所示,


這裡寫圖片描述

3 常用命令

git init 本地建立版本庫

git add mytext.txt 把檔案新增到倉庫

git commit -m “message” 把檔案提交到倉庫

git status 檢視版本庫當前的狀態

git diff mytext.txt 檢視mytext.txt做了哪些改動
git diff HEAD – mytext.txt 檢視工作區與版本庫的最新修改的區別

git log 顯示從最近到最遠的提交日誌
–pretty=oneline 每次提交顯示為一行

git reset –hard HEAD~3 從當前版本庫的頭回退到上三個版本
HEAD始終指向版本庫的頭,~3代表回退3次提交

git checkout – mytext.txt 撤銷對檔案mytext的修改(撤銷工作區中還未提交到暫存區中的修改),其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”。
git reset HEAD mytext.txt 撤銷提交到暫存區但還未到本地版本庫的修改(僅僅add)

git rm mytext.txt 從版本庫中刪除mytext檔案,commit後生效

git remote add origin [email protected]:jackzg/coreFx.git 將本地庫與遠端庫origin關聯起來

git clone [email protected]:jackzg/coreFx.git 從遠端庫克隆到本地庫

git push 把本地倉庫的當前分支master推送到遠端庫。

git fetch 從遠端庫中獲取最新版本 到本地的遠端庫(.refs/remotes檔案),本地庫的HEAD不變。

git diff HEAD FETCH_HEAD 執行 git fetch後,再執行這條命令,可以比較fetch後的遠端內容與本地庫的內容差異,然後確認接收這個差異後,再merge到本地庫,這樣更安全些。

git pull 從遠端庫拉取最新版本到本地版本庫,HEAD指向 遠端庫中的最新的commit id。注意了!如果git pull 時,你的工作目錄中有一些修改未提交到版本庫,此時git 禁止 pull,這是合理的!你需要在工作區和版本庫中做一些一致性調整,要麼將工作目錄的修改提交到版本庫,要麼捨棄工作目錄的修改。

分支管理相關命令

git branch mybranch 建立mybranch分支

git checkout mybranch 切換分支到分支mybranch(切換改變的是HEAD指標

git checkout -b dev 建立加切換分支到mybranch(HEAD指向mybranch)

git branch 檢視所有分支

git checkout master 切換回master分支

git merge mybranch 因為目前HEAD指向master了,所以,mybranch中的修改會合併到master分支中。
git merge –no-ff -m “des” 禁用Fast-forward模式

git branch -d mybranch 刪除分支mybranch

相關推薦

版本管理-圖解Git分支管理原理深度分析fetchpull區別

1分散式與集中式 1)Git是分散式,無SVN那樣的“中央伺服器”; 2)Git每個人電腦裡都有完整的版本庫,但是SVN的中央伺服器出了問題,所有人都沒法幹活了;Git除了每人都有一個版本庫外,還有一個遠端倉庫,SVN只有一個版本庫; 3)SVN適合於區域

分散式版本控制系統Git------分支管理與合併(merge與rebase)

零、需要使用到的命令:        git branch                                  檢視當前分支。        git branch <name

git分支管理(建立分支分支間轉換檢視分支合併分支刪除分支分支衝突)

分支(branch)這玩意兒我也不知道該怎麼解釋,就按照自己的理解來吧~ 在你第一次commit的時候,git會自動建立一個master分支(當然前提是你沒有在這之前就轉換到另一個分支上),這就是主線。有的時候,會想對倉庫進行某些操作,但是我們又不想影響到倉庫當前的狀態,這個時候就可以建立一

git 分支管理方案

繼續 終端 class tlab http check toc 團隊 代碼上線 現有一般的公司項目均使用git(大多數是gitLab)管理。 開發組 我們的項目都要建立在 開發組的名下 (git.xxcompany.com/xxgroup),除需要公司內部開源的項目,都必須

git分支管理

issue 就會 查看 無法刪除 date 參與 無法 track git 查看本地分支:$ git branch 查看遠程分支:$ git branch -r 創建本地分支:$ git branch [name] ----註意新分支創建後不會自動切換為當前分支 切換

Git 分支管理

gitGit 分支管理幾乎每一種版本控制系統都以某種形式支持分支。使用分支意味著你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。有人把 Git 的分支模型稱為"必殺技特性",而正是因為它,將 Git 從版本控制系統家族裏區分出來。創建分支命令:git branch (branc

git分支管理小結

用處 推送 開始 之前 checkout 完成 分支合並 默認 pos 之前在使用git的時候,大部分的用處都是用來將自己本地的代碼上傳至github上。但是近期在做點小項目的時候,發現用到分支的地方,還是挺多的。 這是今天自己看了《github入門與實踐》那本書,跟著書上

Git 分支管理及結合gitlab的使用

git git分支 git分支創建 git分支合並 git分支刪除 Git 分支管理及結合gitlab的使用 說明有關gitlab的說明及基本操作,請參考:http://blog.51cto.com/wutengfei/2090253使用git分支的作用,我們先來說一個簡單的案例吧,你們

4、git分支管理

上推 pac opp 關聯 commit 除了 快速 指定 HR 一、分支的創建與合並   在版本回退裏,你已經知道,每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git裏,這個分支叫主分支,即master分支。HEAD嚴格來

Github操作與git分支管理

想要 收獲 指導 上傳 遇到 了解 流程 通配 別人 通過今天學習的web新知識和復習Sublime Text的基礎知識,讓我收獲頗多,疑惑也多。尤其是在做用 git 和gitHub來管理自己的代碼的題目內容時候遇到了許多的疑問,首先在註冊用戶時都不太懂,在老師提示和

Git分支管理規範

報告 新功能 pan 依據 保存 調整 怎麽辦 其他人 protect 關於Git的一些分支管理規範。。。 一、分支與角色說明 Git 分支類型 master 分支(主分支) 穩定版本 develop 分支(開發分支) 最新版本 release 分支(發布分支) 發布新

Git 分支管理最佳實踐

thead .html 遠程倉庫 line 管理層 base init 代碼審查 有效 it 是目前最流行的源代碼管理工具。大量的軟件項目由 GitHub、Bitbucket 和 GitLab 這樣的雲服務平臺或是私有的 Git 倉庫來管理。在使用 Git 時通常會遇到的一

Git----分支管理01

png 每天 不用 科幻電影 圖片 現在 學會 什麽 屬於   分支就是科幻電影裏面的平行宇宙,當你正在電腦前努力學習Git的時候,另一個你正在另一個平行宇宙裏努力學習SVN。 如果兩個平行宇宙互不幹擾,那對現在的你也沒有啥影響,不過,在某個時間點,兩個平行宇宙合並了,結果

Git----分支管理分支管理策略04

font image span 切換 ade chan sim 分支策略 ice   通常,合並分支時,如果可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。 如果要強制禁用Fast forward模式,Git就會在merge時生產一個

Git系統從0到1的完整學習歷程(第四節(3) Git分支管理

主要跟著https://gitee.com/progit/index.html來學習的,知識點來自這裡,新增自己的理解和標記。 檢視分支 git branch 命令不僅僅能建立和刪除分支,如果不加任何引數,它會給出當前所有分支的清單: $ git branch is

Git的學習與使用(七)——Git 分支管理

Git 分支管理 幾乎每一種版本控制系統都以某種形式支援分支。使用分支意味著你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。 有人把 Git 的分支模型稱為"必殺技特性",而正是因為它,將 Git 從版本控制系統家族裡區分出來。 建立分支命令: git branch 

Git--分支管理

分支管理 主分支 最開始,專案只有一條分支叫主分支,即master分支,HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。 基本指令 git branch:檢視分支

[git]git分支管理

git分支管理 背景 之前的專案分支是這樣的有一個很大的video庫,每個專案以分支的形式存在 video 261.7 MB 分支 management(後臺管理) research(微信公眾號) data-support(資料介面) miniProgram(微信小程式)

Git 分支管理策略(5)

分支管理策略   Git通常在合併分支時採用的是“Fast forward” 在這種模式下刪除分支後會丟掉分支資訊,如何進行此模式,使用帶引數--no-ff 禁用此模式。 1.建立一個dev分支,修改readme.txt內容,新增到暫存區, 2.切回主分支master

Jenkins持續整合 之 git分支管理

分支的用法 通常一個專案裡面會有最基本的:master(主)、dev(開發)、test(測試)三個分支,在整個專案程式釋出的過程中,dev分支開發完成之後,會把dev分支合併到test分支,然後測試人員對該程式功能進行測試,如測試功能,再由test分支合併到主分支上,然後再有Jenkins觸發,把maste