簡單使用:java
能夠將git branch new_branch
和git checkout new_branch
兩個命令合併成一個命令:git checkout -b new_branch
。這個命令的意思就是建立一個分支而且切換到這個分支上。
本地分支更名:git branch -m 原分支名 新分支名
這個過程當中,下一個版本會記錄一個parent id
,這個parent id
就是前一個版本的commit id
。git
注意當咱們在dev
中更改文件以後,必定要先add
和commit
,否則那樣就會和master
內容同步了,咱們須要的是在dev
中更改以後,在沒有進行merge
以前,master
不會和dev
相同: 看下面的演示:bash
HEAD的含義: (在git reset HEAD test.txt
中使用過)架構
即以下表示:併發
若是咱們執行git checkout -b dev
,咱們就會建立一個dev
分支並指向新的分支。分佈式
這是在master
分支的基礎上,可是這個過程並非像SVN
同樣會拷貝一份,而是隻是建立一個指針dev
,會和master
指向了同一個提交。但此時HEAD指向的是dev
(當前分支)。高併發
查看HEAD文件的內容:ui
而後我在上圖的基礎上,若是我在dev
分支下進行了一次提交,圖就會變成下面這樣:spa
此時master
指向第3次提交,而dev
已經指向了第四次提交。指針
接下來,若是我將dev
上面的修改合併到master
上面 (在master
中操做),上面的圖就會變成下面這樣:
這種狀況不會有衝突存在。
實戰演示:
總結一下這種狀況,就是直接從master
分支跳轉到了最後的dev
修改的那個位置,至關於指針的跳轉。
演示衝突:在master
中修改了test.txt
的第三行,在dev
中也修改了test.txt
中的第三行,因而合併的時候就會產生衝突:
上面的過程就是以下圖的過程:
注意箭頭往回指是由於後一個提交裏面包含一個parent-id
指向前一個提交的commit-id
,前面已經說過。
注意觀察master
分支中test.txt
文件的內容以及咱們將解決此次衝突(即咱們打算保存master
的修改而丟棄dev
的修改):
也就是說在fast-forward
模式下:
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
模式:
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…