>[success] # GIT 分支
1. `HEAD `文件是一個指針,其有一個特性就是總會指向當前分支的最新的一個 `commit `對象

2. 查看分支存儲`cat .git/HEAD`

`cat .git/refs/heads/master` 查看當前master 的最新的`commit` 類型文件

* 日志`git log --graph`

* 讓分支出現不同步,此時使用`git checkout testing`創建一個 `testing `分支,并修改文件在 `testing` 分支提交到本地倉庫,切換回分支`master `( 可以發現此時`HEAD` 在`master`),但此時 `testing` 分支是領先的

接著做操作在 `master` 分支修改提交代碼到本地倉庫,執行`git log --all --graph --oneline`
* 可以發現從`c4f4a4a` 節點開始形成了兩個走向

* 用圖形表示(此圖對應commit 信息并非當前案例)

>[danger] ##### 總結
當前`commit`在哪里,`HEAD`就在哪里,這是一個永遠自動指向當前`commit`的引用,所以你永遠可以用`HEAD`來操作當前`commit`
*****
`HEAD`是 Git 中一個獨特的引用,它是唯一的。而除了`HEAD`之外,Git 還有一種引用,叫做`branch`(分支)。`HEAD`除了可以指向`commit`,還可以指向一個`branch`,當它指向某個`branch`的時候,會通過這個`branch`來間接地指向某個`commit`;另外,當`HEAD`在提交時自動向前移動的時候,它會像一個拖鉤一樣帶著它所指向的`branch`一起移動

* `HEAD `-> `master`分支->`commit`

* 當創建`commit `時候 `HEAD`會帶著`master`一起移動到最新的`commit`

>[danger] ##### master 分支
1. `Git `的 `master `分支并不是**一個特殊分支**,只是`Git `的默認分支名字是 `master`
2. 新創建的 repository(倉庫)是沒有任何`commit`的。但在它創建第一個`commit`時,會把`master`指向它,并把`HEAD`指向`master`
3. 當有人使用`git clone`時,除了從遠程倉庫把`.git`這個倉庫目錄下載到工作目錄中,還會`checkout`(簽出)`master`(`checkout`的意思就是把某個`commit`作為當前`commit`,把`HEAD`移動過去,并把工作目錄的文件內容替換成這個`commit`所對應的內容)。可以理解成**遠程倉庫如果有多個默認分支,往往在第一次clon 下來代碼,git 會為了確定當前 HEAD 往往默認指向 master 也就是間接指向master 的最新commit**

>[danger] ##### 切換分支時候

>[info] ## 分支指令
1. `git branch xxx` -- 創建一個分支,例如創建一個`testing `分支 `git branch testing `

2. `git checkout xxx` -- 切換分支`HEAD`就會指向新建的`branch`

創建分支后自動切換到創建的分支`git checkout -b xxx`
3. `git branch -d xxx` -- 刪除分支
* `HEAD`指向的`branch`不能刪除。如果要刪除`HEAD`指向的`branch`,需要先用`checkout`把`HEAD`指向其他地方
* 由于 Git 中的`branch`只是一個引用,所以刪除`branch`的操作也只會刪掉這個引用,并不會刪除任何的`commit`。如果沒有任何一個`branch`可以回溯到這條`commit`,那么在一定時間后,它會被 Git 的回收機制刪除掉

* 刪除分支

* 但依舊可以在 `objects `文件中找到

* 如果分支一次都沒有進行合并要刪除的話把`-d`改成`-D`,小寫換成大寫,就能刪除了
4. `git branch` -- 查看當前所有的分支
5. `git branch –v` -- 同時查看最后一次提交
6. `git branch --merged` -- 查看所有合并到當前分支的分支
7. `git branch --no-merged` -- 查看所有沒有合并到當前分支的分支
8. `git merge xxx` -- 分支合并
>[danger] ##### 分支合并
1. 合并分支指令 `git merge xxx` ,例如將`testing `分支合并到 `master` 分支,需要先將分支切換到 `master` 分支 執行`git merge testing `
* 如圖 testing 分支合并到了master 分支上,此時產生的新的 `commit` 節點會有兩個`parent` 指向



2. `pull`的實際操作其實是把遠端倉庫的內容用`fetch`取下來之后,用`merge`來合并
>[danger] ##### HEAD 領先于目標 commit
如果`merge`時的目標`commit`和`HEAD`處的`commit`并不存在分叉,而是`HEAD`領先于目標`commit`,`merge`就沒必要再創建一個新的`commit`來進行合并操作,因為并沒有什么需要合并的。在這種情況下, Git 什么也不會做,`merge`是一個空操作

>[danger] ##### HEAD 落后于 目標 commit——fast-forward
如果`HEAD`和目標`commit`依然是不存在分叉,但`HEAD`不是領先于目標`commit`,而是落后于目標`commit`

那么 Git 會直接把`HEAD`(以及它所指向的`branch`,如果有的話)移動到目標`commit`
