[基本概念]
GIT branch 的本質是一個提交鏈表的指針。創建一個新的branch,實質是創建了當時提交鏈表的一個新指針。該指針和原指針獨立操作,各自疊加新的提交后,形成各自的分支鏈。
“在分支上”的含義,新建一個分支之后,建立此分支以前的提交也稱為在這個分支上。
HEAD的含義:當前branch。 隨著git branch checkout <branch> 改變。
分支不是線形性:如果發生過merge,則即使 HEAD 相同,鏈表也不具有唯一性。(即某些提交有多父情況)
為什么要及時刪掉不用的分支:防止提交查看時顯示過多的分支。
merge 時,如果自動merge沒有沖突,則 GIT 產生一個新的提交。如果有 沖突,則GIT產生一個未提交。
實踐中,可以有三個分支:
1, master
2, dev
3, Topic:針對某個具體問題,短期存在,需要經常的rebase。
問題:如果刪除一個分支,那么它上面的未 merge 的提交會一起刪除嗎?
[基本操作]
查看分支: $ git branch
創建分支: $ git branch mybranch
切換分支: $ git checkout mybranch
創建并切換分支: $ git checkout -b mybranch
合并分支:(merge from) $ git checkout master
$ git merge mybranch (merge from mybranch)
使用 merge工具(有沖突的情況下): $ git mergetool
刪除分支: $ git branch -d mybranch
強制刪除分支 (上面有尚未 merge 的提交): $ git branch -D mybranch
列出所有分支: $ git branch
查看各個分支最后一次提交: $ git branch -v
查看哪些分支合并入當前分支(可以刪了): $ git branch --merged
查看哪些分支未合并入當前分支: $ git branch --no-merged
遠程:
更新遠程庫到本地: $ git fetch origin
如果有新分支,則分支名:orgin/<branch>
取遠程分支合并到本地分支: $ git merge origin/mybranch
用遠程分支建一個本地分支: $ git checkout -b mybranch origin/mybranch
推送分支: $ git push origin mybranch
推送分支,并換個名字: $ git push origin serverfix:awesomebranc
刪除遠程分支: $ git push origin :mybranch
rebase: $ git checkout mybranch
$ git rebase master (rebase from master)
舉例: $ git checkout server
$ git rebase --onto master server client
$ git checkout master
$ git merge client (fostforward)
$ git rebase master server (checkout sever)
$ git merge server
$ git branch -d client
$ git branch -d server
merge 和 rebase 的區別:
1),從文件結果看,merge 和 rebase 可以達到同樣效果。
2),從歷史紀錄看,他們存在差異:merge 顯示合并后的多父結點,呈現環形, 而 rebase 呈現線性結果,即它對分支歷史進行合并操作。rebase 提供更好的歷史呈現方式(似分支從未曾發生過),但有風險。 掌握一條原則:Do not rebase commits that you have pushed to a public repository. 即,不要對你提交過的分支進行 rebase。因為本地的改變會造成遠端的困惑。
3), 在實踐中,可以盡量用 merge,慎用 rebase。