git入门-分支
1. git分支简介
使用分支可以让你从开发主线上分离开来,然后在新的分支上解决特定问题,同时不会影响主线。像其它的一些版本控制系统,创建分支需要创建整个源代码目录的副本。而Git 的分支是很轻量级的,因为Git保存的不是文件差异,而是一系列文件快照。在Git提交时,会保存一个commit对象,该对象包含一个指向暂存内容快照的指针,Git 会先计算每一个子目录的校验和( SHA-1 哈希字串),然后在 Git 仓库中将这些目录保存为树(tree)对象。之后 Git 创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。Git 中的分支,其实本质上是个指向 commit 对象的可变指针,Git 会使用 master 作为分支的默认名字,
它在每次提交的时候都会自动移动,指向最后一次提交对象。Git使用一个名为HEAD的指针,指向你正在工作的本地分支,这样你就可以知道当前在哪个分支下面工作。
2. 创建分支
| 1 | git branch dev | 
上面操作会在当前的commit对象上新建一个名为dev的分支指针,但是仅仅是创建了该分支,并没有切换到dev分支,此时你还在master分支。
3. 切换分支
| 1 | git checkout dev | 
此时切换到了新建的dev分支,即HEAD指向了dev分支。
ps:可以加上-b参数
| 1 | git checkout -b dev | 
相当于执行
| 1 2 | git branch devgit checkout dev | 
现在我们在当前目录下进行下面的操作:
| 1 2 3 | vim test.pygit add test.pygit commit -m "add test.py" | 
我们在当前目录下新建了test.py文件,并添加到本地仓库,注意:现在dev分支移动了一格,而master分支还指向原来的commit对象,test.py文件只属于dev分支,master分支并没有该文件。
现在切换到master分支
| 1 | git checkout master | 
可以看到当前目录下是没有test.py文件的。因为Git 会把工作目录的内容恢复为检出某分支时它所指向的那个提交对象的快照,它会自动添加、删除和修改文件以确保目录的内容和你当时提交时完全一样。
4. 合并分支
使用dev分支完成一些需求后,需要回到开发主线把它合并到master分支。
| 1 | git merge dev | 
ps:需切换到master分支
合并时出现了“Fast-forward”的提示,因为当前master分支所在的提交对象是要并入的分支dev的直接上游,换句话说,如果顺着一个分支直走下去可以到达另一分支的话,合并两者时不存在任何需要解决的分歧,只需简单的移动指针,这种合并过程称为“Fast-forward”。如果当前master分支所指向的提交对象不是dev分支的直接祖先,Git需要做一些额外处理,Git会用两个分支的末端和它们的共同祖先进行一次简单的三方合并,并做一个新的快照,自动创建一个指向它的提交对象。这个对象有两个祖先,即之前两个分支的末端。合并之后,dev分支和master分支指向同一位置,master分支指向的提交对象就是最新的修改了。
如果不同分支修改了同一文件,合并时可能会遇到冲突,此时Git做了合并,但是并没有提交。使用git status查看哪些文件发生了冲突。解决了所有的冲突后,执行git add将它们添加到暂存区域,因为一旦暂存就表示冲突已解决,然后使用git commit完成这次合并的提交。
5. 删除分支
| 1 | git branch -d dev | 
6. 分支管理
6.1 列出当前所有分支的清单
| 1 2 3 4 | git branchdev* master | 
master分支前的*字符:表示当前所在的分支。
6.2 查看各个分支最后一个提交对象的信息
| 1 2 3 4 | git branch -vdev [7e90b1 add helloworld.java* master c7e90b1 [ahead 1] add helloworld.java | 
6.3 查看已经与当前分支合并的分支
| 1 2 3 4 | git branch --mergeddev* master | 
6.4 查看已经与当前分支未合并的分支
| 1 | git branch --no-merged | 
7. 远程分支
7.1 查看远程分支
| 1 2 3 4 | git branch -rorigin/HEAD-> origin/masterorigin/master | 
7.2 创建远程分支
即把本地分支推送到远程
| 1 2 3 4 5 6 | git push origin devgit branch -rorigin/HEAD-> origin/masterorigin/devorigin/master | 
看到已把dev分支成功push到服务器上
7.3 同步远程服务器上的数据到本地
| 1 | git fetch origin | 
7.4 跟踪远程分支
从远程拉取dev分支到本地,并切换到dev分支,ps:需要git1.6.2以上版本
| 1 | git checkout --track origin/dev | 
从远程拉取dev分支到本地,命名为develop,并切换到develop分支
| 1 | git checkout -b develop origin/dev | 
7.5 提交本地分支数据到远程服务器
git push origin local:remote
| 1 | git push origin dev:dev | 
如果当前是在dev分支下工作,可直接git push
7.6 删除远程分支
| 1 | git push origin :dev | 
8. 分支的衍合
把一个分支整合到另一个分支有两种方法:merge和rebase(衍合)
前面已经介绍过,merge是把两个分支最新的快照和二者最新的共同祖先进行三方合并,产生一个新的提交对象。rebase是回到两个分支的共同祖先,根据要进行衍合的分支dev的历次提交对象,生成一系列文件补丁,然后以主干分支master的最后一个提交对象为新的出发点,逐个应用dev分支准备好的补丁文件,生成一个新的提交对象,改写dev的提交历史,使dev成为master的直接下游。然后回到master分支,进行一次快进合并。这样能够保持更加清晰的提交记录,就像没有使用过分支一样。
| 1 2 | git checkout devgit rebase master | 
ps:可以把衍合当作一种在推送之前清理提交历史的手段,如果分支中的提交对象已经发布到服务端,就千万不要对该分支进行衍合。
git入门-分支的更多相关文章
- git入门学习(二):新建分支/上传代码/删除分支
		一.git新建分支,上传代码到新的不同分支 我要实现的效果,即是多个内容的平行分支:这样做的主要目的是方便统一管理属于同一个内容的不同的项目,互不干扰.如图所示: 前提是我的github上已经有we ... 
- Git入门——远程仓库及分支管理
		关于本地版本库的操作,请见:Git入门--本地版本库操作 本篇提到的所有命令: 小结 前面提到,Git相对于传统的SVN有着很大的优势,其中之一就在于集中式系统中,版本库只能存在于中央服务器上:而在G ... 
- 创建与合并分支-git入门教程
		在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ... 
- Git入门指南十一:Git branch 分支与合并分支
		十五. Git branch 分支 查看当前有哪些branch bixiaopeng@bixiaopengtekiMacBook-Pro xmrobotium$ git branch * master ... 
- [置顶] 【Git入门之八】分支管理
		原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12309385 1.分支又是神马? 我为什么说又是... 分支就是一个我们能通 ... 
- git 入门教程之分支总览
		分支就是一条独立的时间线,既有分支,必有主干,正如一棵树谈到树枝,必有树干一样的道理.我们先前对git 的全部操作默认都是在主干上进行的,这个主干也是一种特殊的分支,名为 master 分支. 无论是 ... 
- git 入门教程之分支管理
		背景 什么是分支?简单地说,分支就是两个相对独立的时间线,正常情况下,独立的时间线永远不会有交集,彼此不知道对方的存在,只有特定情况下,两条时间线才会相遇,因为相遇,所以相知,因为相知,所以改变! 正 ... 
- git入门四(分支创建合并)
		熟悉git分支的原理是掌握了git的精髓,因为git和我们常用的源码管理系统有很大的区别和优点在分支上可以体现出来,一般我们常用的源码管理系统分支都是需要创建新目录,有全新的源码copy,一般都需要创 ... 
- Ubuntu Git 入门
		参考自 码农生涯 中大熊猫 hustpzb的专栏 1 在github创建账号--创建repository 2 创建后网页会出现提示,指导如何使用 3 安装git sudo apt-get instal ... 
随机推荐
- NPOI导出Excel文件,对单元格的一些设置
			HSSFWorkbook book = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); ISheet sheet = book.Cr ... 
- 用telnet和php的curl库测试http
			一.telnet测试http telnet简介 Telnet协议是TCP/IP协议族的其中之一,是Internet远端登录服务的标准协议和主要方式,常用于网页服务器的远端控制,可供使用者在本地 ... 
- Leetcode-Construct Binary Tree from inorder and preorder travesal
			Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that ... 
- 20145120 《Java程序设计》第9周学习总结
			20145120 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC希望程序能操作所有数据库 操作JDBC驱动有4种类型: JDBC-ODBC Bridge Driver Na ... 
- 团队开发---NABC分析
			我们的软件初步构想的是版主同学们解决宿舍订桶装水的问题,随着夏季的来临,桶装水的需求量日益加大,而我们订水的过程中常常会遇到这样或那样的问题.再次我只对我们项目中可以直观的看到今日卖家总库存水量和剩余 ... 
- 电梯调度--c++--软件工程
			一.设计思路 (1)将乘客要去的楼层数存起来. (2)假设yi为乘客要爬楼层数之和,yi=n1*|(n1-ni)|+n2*|(n2-ni)|+..+n18*|(n18-ni)| (3)比较y1到y18 ... 
- Java下Web MVC的领跑者:SpringMVC
			比较常用的MVC框架有Struts 和 SpringMVC. Struts 是Java Web MVC框架中曾经不争的王者.经过长达九年的发展,Struts占有了MVC框架中最大的市场份额.但是Str ... 
- merry Christmas
			圣诞节的来历 圣诞节这个名称是基督弥撒的缩写. 弥撒是教会的一种礼拜仪式. 1.耶诞节是一个宗节,我们把它当作耶苏的诞辰来庆祝,因而又名耶诞节.这一天,世界所有的基督教会都举行特别的礼拜仪式.但是有很 ... 
- android sdk manager无法更新(2014-11-6测试OK)--自己收藏用
			问题描述: Android SDK Manager 无法下载更新,或者更新速度超慢,或者待安装包列表不显示. 解决方法: 第一,我们先修改下hosts文件.该文件的位置在系统盘(一般为C盘), ... 
- [转载]linux sed命令详解
			简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ... 
