• [Git01]Pro Git 第三章 分支 读书笔记


    [git]分支
     
    Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来。
    Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快。
    和许多其他版本控制系统不同,Git 鼓励在工作流程中频繁使用分支与合并,哪怕一天之内进行许多次都没有关系。
    理解分支的概念并熟练运用后,你才会意识到为什么 Git 是一个如此强大而独特的工具,并从此真正改变你的开发方式。
     
    Question1 :Git 是如何储存数据的?
    Git 保存的不是文件差异或者变化量,而只是一系列文件快照。
    Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git会使用 master 作为分支的默认名字。
    在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。
     
    Question2 :Git 又是如何创建一个新的分支的呢?
    ##创建一个新的分支指针。
    $ git branch testing
     
    Question3 :Git 是如何知道你当前在哪个分支上工作的呢?
     
    它保存着一个名为 HEAD 的特别指针。请注意它和你熟知的许多其他版本控制系统里的 HEAD 概念大不相同。在 Git 中,它是一个指向你正在工作中的本地分支的
    指针。运行 git branch 命令,仅仅是建立了一个新的分支,但不会自动切换到这个分支中去,所以在这个例子中,我们依然还在 master 分支里工作(参考图 3.5)。

     
    要切换到其他分支,可以执行 git checkout 命令
     
    $ git checkout testing
    这时操作的文件就是testing branch里面的啦,可以在随意在testing 与master里面随意切换,改来改去。
    然后你的结构就会分2个支:这叫分支简直太贴切啦:
     
     
    由于 Git 中的分支实际上仅是一个包含所指对象校验和(40 个字符长度 SHA-1 字串)的文件,
    所以创建和销毁一个分支就变得非常廉价。说白了,新建一个分支就是向一个文件写入 41 个字节(外加一个换行符)那么简单,当然也就很快了。
     
    接下来看看,我们为什么应该频繁使用分支?
     
    实际工作中大体也会用到这样的工作流程:
    1. 开发某个网站。
    2. 为实现某个新的需求,创建一个分支。
    3. 在这个分支上开展工作。
    假设此时,你突然接到一个电话说有个很严重的问题需要紧急修补,那么可以按照下面的方式处理:
    1. 返回到原先已经发布到生产服务器上的分支。
    2. 为这次紧急修补建立一个新分支。
    3. 测试通过后,将此修补分支合并,再推送到生产服务器上。
    4. 切换到之前实现新需求的分支,继续工作。
    中心思想就是:你可以随意在branchs上切换,所以一个branch就干一件事(修复一个bug)
    各个branch之间独立开,互不影响,这样就会是非常清晰的workflow啦.
     
    PS:每个新的branch都是出自当前指针指向的
     
    $ git checkout -b iss53
    Switched to a new branch "iss53"
    ##相当于:
    $ git branch iss53
    $ git checkout iss53 
    测试确定bug修复后,把它合并到 master 分支并发布到生产服务
    器。用 git merge 命令来进行合并:
    $ git checkout master
    $ git merge hotfix
    合并后的hotfix没有用了,使用
    $ git branch -d hotfix
    Deleted branch hotfix (3a0874c).
     
    如果合并发生了冲突:
    $ git merge iss53
    Auto-merging index.html
    CONFLICT (content): Merge conflict in index.html
    Automatic merge failed; fix conflicts and then commit the result.
    Git 作了合并,但没有提交,它会停下来等你解决冲突。要看看哪些文件在合并时发生冲突,可以用 git status 查阅
     
    确认所有冲突都已解决,也就是进入了缓存区,就可以用 git commit 来完成这次合并提交。提交的记录差不多是这样:
    Merge branch 'iss53'
    Conflicts:
    index.html
    #
    # It looks like you may be committing a MERGE.
    # If this is not correct, please remove the file
    # .git/MERGE_HEAD
    # and try again.
    #
    如果想给将来看这次合并的人一些方便,可以修改该信息,提供更多合并细节。比如你都作了哪些改动,以及这么做的原因。
    有时候裁决冲突的理由并不直接或明显,有必要略加注解。
     
    分支管理:
     
    查看branch状态
    $git branch
    issue53
    *master
    testing
    注意看 master 分支前的 * 字符:它表示当前所在的分支。也就是说,如果现在提交更新,master 分支将随着开发进度前移。若要查看各个分支最后一次 commit 信息,运行
    $ git branch -v:
    
    要从该清单中筛选出你已经(或尚未)与当前分支合并的分支,可以用 --merge 和 --no-merged 选项(Git 1.5.6 以上版本)。比如 git branch -merge 查看哪些分支已被并入当前分支:
     
    一般来说,列表中没有 * 的分支通常都可以用 git branch -d 来删掉。原因很简单,既然已经把它们所包含的工作整合到了其他分支,删掉也不会损失什么。
     
    另外可以用 git branch --no-merged 查看尚未合并的工作:
    $ git branch --no-merged
    testing
    
    我们会看到其余还未合并的分支。因为其中还包含未合并的工作,用 git branch -d 删
    除该分支会导致失败:
    $ git branch -d testing
    error: The branch 'testing' is not an ancestor of your current HEAD.
    不过,如果你坚信你要删除它,可以用大写的删除选项 -D 强制执行,例如
    $ git branch -D testing

    下一节:再来看基本的git 工作流程有哪几种,详细做法和优缺点 :)


     
    太!可!爱!了!你挪动的时候居然还转头看了看旁边有没有空地么!!
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    合并两个有序列表
    根据前序遍历和中序遍历还原二叉树
    快速排序
    二叉树搜索的后序遍历序列
    最长回文子串
    爬楼梯
    Selenium EC 与 Wait
    爬取Django 绕过csrf实现批量注册
    Django 数据传递 个人汇总贴
    python bytes和str转换
  • 原文地址:https://www.cnblogs.com/zhongwencool/p/pro_git2.html
Copyright © 2020-2023  润新知