Git分支
一: 分支的简介
git保存的不是文件的变化或者差异,而是一系列文件的快照。
1.提交
在提交的时候,git会保存一个提交对象。
提交对象包含:
- 提交信息(作者姓名,提交输入的信息等),
- 指向父对象的指针,
- 指向树对象的索引。
树对象(树形的结构)包含:
- 保存着文件快照的blob对象。
- 目录结构
2.分支
分支的本质是指向提交对象
的可变指针
,仅仅包含了它所指向的提交对象的校验和。
每次提交,可变指针会移动,指向最新的提交对象。
2.1 创建分支
创建分支就是创建一个可移动的新的指针
git branch [branchName] 只创建了一个分支,而不切换过去,不常用
2.2 分支切换和当前分支
Git有一个名为HEAD的特殊指针,它当前指向的分支就是当前分支。
分支切换就是HEAD指针从一个分支指向另一个分支。
切换分支会修改工作目录
,git会自动增删改文件以确保工作目录和切换到的分支一模一样。
git checkout [branchName] 切换分支
创建并切换到新分支,常用。
git checkout -b [newBranchName]
3.分支的合并
3.1 Fast-forward合并:
- 当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进。
- 此类合并没有提交。
3.2三方合并:
- 如果两个合并的分支从一个较早的地方分叉开来,GIt会使用两个分支的快照和二者的工作祖先做一个简单地三方合并。
- Git会根据三方合并的结果做出一个新的快照,并
自动创建一个新的提交
指向它,此次提交称为合并提交,它有不止一个父提交。
3.3冲突
如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。
此时 Git 做了合并,但是没有自动地创建一个新的合并提交
(这里很重要),此时的状态是合并了代码,但是没有合并干净,也没有提交。
此时需要解决冲突,标记已经解决(add), 提交(commit)。
二:远程分支
1 定义:远程跟踪分支是远程分支状态的引用。
- 以 remote/branch 形式命名,比如 origin/master
- 他们是你
不能移动的本地引用
。
2 抓取服务器仓库数据,并更新本地仓库。 移动远程跟踪分支指针指向新的位置。
git fetch origin
git fetch 只是抓取了远程仓库数据并更新了本地仓库, 如果远程仓库有新的远程分支origin/branch_fix,在本地并没有创建一个新的本地分支branch_fix,只有一个不可修改的 远程跟踪分支指针origin/branch_fix。
3 推送到某个本地分支 到远程服务器某个分支 不常用
git push origin branch_fix 和下边一句含义相同
git push origin refs/heads/branch_fix : refs/heads/branch_fix
git push origin [localBranchName] : [remoteBranchName]
4.删除远程分支
git push origin --delete [branchName]
三:跟踪分支 最常用
1.定义 : 从一个远程跟踪分支检出一个本地分支会自动创建所谓的“跟踪分支”
当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/master 的 master 分支
2.从远程跟踪分支检出本地跟踪分支
git checkout -b branch_fix origin/branch_fix
git checkout --track origin/branch_fix
3.设置已有的本地分支跟踪一个远程分支
git branch -u origin/branch_fix
git branch --set-upstream-to origin/branch_fix