[git]分支
Git 作了合并,但没有提交,它会停下来等你解决冲突。要看看哪些文件在合并时发生冲突,可以用 git status 查阅
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 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 删
除该分支会导致失败:
不过,如果你坚信你要删除它,可以用大写的删除选项 -D 强制执行,例如
除该分支会导致失败:
$ git branch -d testing error: The branch 'testing' is not an ancestor of your current HEAD.
$ git branch -D testing
下一节:再来看基本的git 工作流程有哪几种,详细做法和优缺点 :)
太!可!爱!了!你挪动的时候居然还转头看了看旁边有没有空地么!!