孤魂野鬼
原始版本如下:
o - A <-- name1
/
o - o - o - o - B <-- name2
\ /
o - C <-- name3
現(xiàn)在把name1移動到B:
o - A
/
o - o - o - o - B <-- name1, name2
\ /
o - C <-- name3
當沒有名字指向A的時候蒋失,A以及A前面那個提交就成為了孤魂,也就有可能被gc掉。我們可以通過reflog來恢復他移剪,但git只會為我們保存30天。
現(xiàn)在薪者,把name3也移動到B:
o - A
/
o - o - o - o - B <-- name1, name2, name3
\ /
o - C
但是C這個時候并不是孤魂野鬼纵苛,它可以通過name3^1來訪問。因故他是合法的。所以branch才會在合并之后才能被合法刪掉攻人。
把name1移動到B就不是一次fast-forward幔虏,把name3移動到B就是。
可以理解為順著已有的(合并)線移動贝椿。
概念:當且僅當一個name移動后想括,還能碰到之前指向的點的時候,成為一次fast-forward操作烙博。
fast-forward合并是非常流暢的瑟蜈。假使你進行一次fast-forward push,那么git做的事情就是把你本地的repo復制到中心repo渣窜,然后順著fast-forward的路把master指向你的master铺根,不會出現(xiàn)任何孤魂。
merge的時候使用fast-forward與否的區(qū)別
若加上--no-ff
選項乔宿,則會不使用fast-forward進行合并位迂。這個時候feature分支上的更改會做作為一個新的提交,回到master上详瑞。
而如果使用--ff
選項掂林,若master上沒有別人的新提交,那么原本指向master最新的head會直接移動到feature的最新上坝橡。
為什么公共分支上使用rebase之后不給push泻帮?
如上文所說,push到中心repo之后计寇,中心只接受fast-forward得來的結(jié)果锣杂。再引用之前的一個例子
[站外圖片上傳中...(image-209ec8-1516171303565)]
中心repo發(fā)現(xiàn)從舊的feature移動到新的feature,那么舊的D將會成為一個孤魂番宁,所以被服務器拒絕了元莫。
當A使用--force來強行推送之后,其實B的D開頭的feature還是合法的蝶押,最后會被git變得盡量fast-forward踱蠢,也就是會把中心repo上的feature所代表的分支上面的所有內(nèi)容D'作為一個陌生的新提交和E進行合并。