git 分支 merge和rebase
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 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。