[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 个字节(外加一个换行符)那么简单,当然也就很快了。
 
接下来看看,我们为什么应该频繁使用分支?
 
实际工作中大体也会用到这样的工作流程:
. 开发某个网站。
. 为实现某个新的需求,创建一个分支。
. 在这个分支上开展工作。
假设此时,你突然接到一个电话说有个很严重的问题需要紧急修补,那么可以按照下面的方式处理:
. 返回到原先已经发布到生产服务器上的分支。
. 为这次紧急修补建立一个新分支。
. 测试通过后,将此修补分支合并,再推送到生产服务器上。
. 切换到之前实现新需求的分支,继续工作。
中心思想就是:你可以随意在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 工作流程有哪几种,详细做法和优缺点 :)


 
太!可!爱!了!你挪动的时候居然还转头看了看旁边有没有空地么!!
 
 
 
 
 
 
 
 
 
 
 
 
 

最新文章

  1. [Think In Java]基础拾遗3 - 容器、I/O、NIO、序列化
  2. July 7th, Week 28th Thursday, 2016
  3. Python学习(14)模块二
  4. App开发流程之数据持久化和编译静态链接库
  5. 【BZOJ】3196: Tyvj 1730 二逼平衡树(区间第k小+树套树)
  6. sotower1.5报错 -Xlint:unchecked
  7. @using (Html.BeginForm())收集
  8. codeforces Upgrading Array
  9. javascript 切换动画
  10. 缩放系列(一):一个很好的bitmap手势缩放demo(多点触控)
  11. mongoose返回值无法修改
  12. ISP PIPLINE (三) BPC
  13. js中的数组方法
  14. SSO+PHS 同步问题修正解决
  15. 3、zabbix配置入门
  16. 4.2计算字符的ASCII碼
  17. js拾遗: 函数字面量
  18. Python2.7.14新手学习
  19. Java并发框架??AQS中断的支持
  20. java 异步调用与多线程

热门文章

  1. Train-Alypay-Cloud
  2. Linux常用系统函数
  3. ORA-12521: TNS: 监听程序当前无法识别连接描述符中请求的实例(原)
  4. kettle——入门操作-行列转换(行转列,字段拆分)
  5. hadoop自带TestDFSIO学习
  6. FDQuery sqlserver 临时表
  7. 发布spring jar包, 报错
  8. Oracle-11g-r2 实例囚笼(Instance Caging)配置
  9. 使用jpcap获取网卡硬件
  10. react-navigation 3.x版本的安装以及react-native-gesture-handler配置