IDEA可視化Log理解Git倉庫\歷史狀態\commit\分支
from:https://github.com/tintinng/advanced-git/tree/master
fork from:https://github.com/hcsp/advanced-git
ref:https://xiedaimala.com/courses
什么是倉庫?
倉庫是指一個歷史可追溯(tracked)的文件集合,可以把該文件集合的任意一個歷史狀態變更看成是一個單位,圖中的一個個小圓點即為該倉庫的某個歷史狀態變更。
這個歷史狀態變更時如何產生的?
通過commit,每一次commit就會生成一個commit對象,產生一次歷史狀態變更。因此這一個個小圓點也可以看成是一個個commit對象。
如何標識這個歷史狀態變更?
- Commit對象的SHA-1
- 分支(branch)
- HEAD指針
- tag標簽
什么是分支?分支和歷史狀態變更的關系,分支和倉庫的關系
- 分支是一個指向葉子節點的指針,每個節點都是一個歷史狀態變更。葉子節點可以理解為最新的歷史狀態變更。
- 一個分支包括多個歷史狀態變更(節點),可以在本分支的各個歷史狀態變更(節點)中穿梭。
- 一個倉庫通常有各種分支錯綜復雜,IDEA 可視化log中可以可以查看各個分支之間的關系。單個分支,select幾個分支和所有分支:
各個分支之間有什么關系?
- 多個分支可以合並,產生一個新的歷史狀態變更。例:我正在master分支上,要把fixbug分支上的變更內容合並過來。我(master分支)的歷史狀態變更向前推進一個,fixbug分支還停留在原來的歷史狀態變更上。
git merge fixbug
- 可以切換當前的工作分支,即從一個分支可以切換到(checkout)另一個分支。切換到另一個分支上工作。
遠程分支和本地分支對應
- push成功的條件就是遠程分支是我本地分支的父親,意思就是遠程做過的修改(歷史狀態變更/節點)我本地都做過了,所以我可以push成功,否則遠程分支有另外的修改(有分叉)但我本地卻沒有,因此push會產生沖突。通過合並(merge)\解決沖突(solve conflict)后再合並(merge)。
- 同理,pull(fetch+merge)成功的條件是本地分支是遠程分支的父親。