Git分支和版本回退

1、分支

一、分支簡單介紹

簡單使用:java



能夠將 git branch new_branchgit checkout new_branch兩個命令合併成一個命令: git checkout -b new_branch。這個命令的意思就是建立一個分支而且切換到這個分支上。
本地分支更名: git branch -m 原分支名 新分支名

二、合併分支merge

這個過程當中,下一個版本會記錄一個parent id,這個parent id就是前一個版本的commit idgit



注意當咱們在dev中更改文件以後,必定要先addcommit,否則那樣就會和master內容同步了,咱們須要的是在dev中更改以後,在沒有進行merge以前,master不會和dev相同: 看下面的演示:bash



三、快進fast forward

HEAD的含義: (在git reset HEAD test.txt中使用過)架構

  • HEAD指向的是當前分支;
  • master是指向提交(本質上只的是當前的提交);

即以下表示:併發



若是咱們執行git checkout -b dev,咱們就會建立一個dev分支並指向新的分支。分佈式

這是在master分支的基礎上,可是這個過程並非像SVN同樣會拷貝一份,而是隻是建立一個指針dev,會和master指向了同一個提交。但此時HEAD指向的是dev(當前分支)。高併發



查看HEAD文件的內容:ui



而後我在上圖的基礎上,若是我在dev分支下進行了一次提交,圖就會變成下面這樣:spa



此時master指向第3次提交,而dev已經指向了第四次提交指針

接下來,若是我將dev上面的修改合併到master上面 (在master中操做),上面的圖就會變成下面這樣:



這種狀況不會有衝突存在。

實戰演示:



總結一下這種狀況,就是直接從master分支跳轉到了最後的dev修改的那個位置,至關於指針的跳轉。

四、master和dev同時修改同一文件同一位置產生衝突

演示衝突:在master中修改了test.txt的第三行,在dev中也修改了test.txt中的第三行,因而合併的時候就會產生衝突:



上面的過程就是以下圖的過程:



注意箭頭往回指是由於後一個提交裏面包含一個 parent-id指向前一個提交的 commit-id,前面已經說過。

注意觀察master分支中test.txt文件的內容以及咱們將解決此次衝突(即咱們打算保存master的修改而丟棄dev的修改):



五、深刻fast-forward模式

也就是說在fast-forward模式下:

  • 若是可能(合併時沒有衝突),那麼Git就會採用fast-forward模式;
  • 在這種模式下,刪除分支時會丟掉分支信息;
  • 合併時加上 -- no-ff參數會禁用fast-forward模式,這樣就會多出一個commit - id,也就是說在fast-forward模式下面merge不會多出一個commit-id
git merge -- no-ff dev複製代碼
  • 查看日誌更好的方式
git log --graph複製代碼

關於fast-forward模式和非fast-forward模式下的少一次commit-id和多一次commid-id的圖解:



咱們先看使用fast-forward模式下的: (即合併的時候commit-id和另外一個分支相同):



再看不使用fast-forward模式:



2、Git版本回退

Git的另一個強大之處在於能夠回退到以前的任意一個版本:



主要看下面的命令:

  • git reset --hard HEAD^, 日後回退1個版本;
  • git reset --hard HEAD~3,日後回退3個版本;
  • git reset --hard commit-id,直接回退到某個commit-id;(若是當前在靠前面,就能夠經過git log查看);
  • 若是在後面,不能查看到前面的git log 獲得 commit-id怎麼辦呢?能夠用git reflog查看本身的操做日誌;

實戰演示:



查看修改和提交日誌:



下面演示怎麼回退:


原文:Java架構筆記

免費Java高級資料須要本身領取,涵蓋了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高併發分佈式等教程,一共30G。
傳送門: mp.weixin.qq.com/s/JzddfH-7y…
相關文章
相關標籤/搜索