zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Linux:正则表达式2
    Linux:基础命令三
    Linux:正则表达式1
    虚拟机:主机能ping通虚拟机,虚拟机不可以ping通主机
    Linux:安装禅道
    ssh免密钥登录
    CKA-Harbor简单使用
    CKA-docker部署LNMP网站平台
    CKA-构建Nginx、PHP、Tomcat镜像
    CKA-docker卸载以及安装
  • 原文地址:https://www.cnblogs.com/fuyanwen/p/2784810.html
Copyright © 2011-2022 走看看