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 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。

原文地址:https://www.cnblogs.com/fuyanwen/p/2784810.html