㈠ Git分支,为何以及如何使用分支
几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间。
有人把 Git 的分支模型称为“必杀技特性”,而正是因为它,将 Git 从版本控制系统家族里区分出来。Git 有何特别之处呢?Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快。和许多其他版本控制系统不同,Git 鼓励在工作流程中频繁使用分支与合并,哪怕一天之内进行许多次都没有关系。理解分支的概念并熟练运用后,你才会意识到为什么 Git 是一个如此强大而独特的工具,并从此真正改变你的开发方式。
为了理解 Git 分支的实现方式,我们需要回顾一下 Git 是如何储存数据的。或许你还记得第一章的内容,Git 保存的不是文件差异或者变化量,而只是一系列文件快照。
在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对 象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。
为直观起见,我们假设在工作目录中有三个文件,准备将它们暂存后提交。暂存操作会对每一个文件计算校验和(即第一章中提到的 SHA-1 哈希字串),然后把当前版本的文件快照保存到 Git 仓库中(Git 使用 blob 类型的对象存储这些快照),并将校验和加入暂存区域:
$ git add README test.rb LICENSE$ git commit -m 'initial commit of my project'
当使用git commit新建一个提交对象前,Git 会先计算每一个子目录(本例中就是项目根目录)的校验和,然后在 Git 仓库中将这些目录保存为树(tree)对象。之后 Git 创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。
现在,Git 仓库中有五个对象:三个表示文件快照内容的 blob 对象;一个记录着目录树内容及其中各个文件对应 blob 对象索引的 tree 对象;以及一个包含指向 tree 对象(根目录)的索引和其他提交信息元数据的 commit 对象。概念上来说,仓库中的各个对象保存的数据和相互关系看起来如图 3-1 所示:
图 3-8. HEAD 在一次 checkout 之后移动到了另一个分支
这条命令做了两件事。它把 HEAD 指针移回到 master 分支,并把工作目录中的文件换成了 master 分支所指向的快照内容。也就是说,现在开始所做的改动,将始于本项目中一个较老的版本。它的主要作用是将 testing 分支里作出的修改暂时取消,这样你就可以向另一个方向进行开发。
㈡ Android studio怎么创建Git分支,创建远程分支
方式一:命令行 git push origin <branch-name>,branch-name就是你要新建的远程branch的名称。你可以用git bash或者Android Studio中的Terminal敲命令行。
方式二:直接通过Android Studio来创建远程branch,很简单,一步就可以了。我直接上图:
下面图中你看到远程的branch就两个:master和nick
㈢ git如何切换分支命令
(一).创建本地分支
git checkout -b新分支名。
执行该指令后,会在本地创建一个新分支,该分支是从当前分支上检出的,所以所有文件内容都和当前分支一模一样,这是正常的。创建成功后,将自动切换至新分支上。
比如我要创建一个名为dev1的新分支:
三、将远程git仓库里的指定分支拉取到本地(本地不存在的分支)
当我想从远程仓库里拉取一条本地不存在的分支时。
git checkout -b本地分支名origin/远程分支名。
这个将会自动创建一个新的本地分支,并与指定的远程分支关联起来。
例如远程仓库里有个分支dev2,我本地没有该分支,我要把dev2拉到我本地。
若成功,将会在本地创建新分支dev2,并自动切到dev2上。
如果出现提示:
fatal: Cannot update paths and switch to branch 'dev2' at the same time.
Did you intend to checkout 'origin/dev2' which can not be resolved as commit?
表示拉取不成功。我们需要先执行。
㈣ GIT怎么控制用户能不能强制PUSH或者DELETE分支、创建分支
Git是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linuxkernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro)
Git的更多介绍,请参考我的上一篇博客:Git版本管理工具
一、Git命令初识
在正式介绍Git命令之前,先介绍一下Git的基本命令和操作,对Git命令有一个总体的认识
示例:从Git版本库的初始化,通常有两种方式:
1)gitclone:这是一种较为简单的初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份
例如:gitclonegit://github.com/someone/some_project.gitsome_project
上面的命令就是将'git://github.com/someone/some_project.git'这个URL地址的远程版本库,完全克隆到本地some_project目录下
2)gitinit和gitremote:这种方式稍微复杂一些,当你本地创建了一个工作目录,你可以进入这个目录,使用'gitinit'命令进行初始化;Git以后就会对该目录下的文件进行版本控制,这时候如果你需要将它放到远程服务器上,可以在远程服务器上创建一个目录,并把可访问的URL记录下来,此时你就可以利用'gitremoteadd'命令来增加一个远程服务器端,
例如:gitremoteaddorigingit://github.com/someone/another_project.git
上面的命令就会增加URL地址为'git://github.com/someone/another_project.git',名称为origin的远程服务器,以后提交代码的时候只需要使用origin别名即可
二、Git常用命令
1)远程仓库相关命令
检出仓库:$gitclonegit://github.com/jQuery/jquery.git
查看远程仓库:$gitremote-v
添加远程仓库:$gitremoteadd[name][url]
删除远程仓库:$gitremoterm[name]
修改远程仓库:$gitremoteset-url--push[name][newUrl]
拉取远程仓库:$gitpull[remoteName][localBranchName]
推送远程仓库:$gitpush[remoteName][localBranchName]
*如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:
$gitpushorigintest:master//提交本地test分支作为远程的master分支
$gitpushorigintest:test//提交本地test分支作为远程的test分支
2)分支(branch)操作相关命令
查看本地分支:$gitbranch
查看远程分支:$gitbranch-r
创建本地分支:$gitbranch[name]----注意新分支创建后不会自动切换为当前分支
切换分支:$gitcheckout[name]
创建新分支并立即切换到新分支:$gitcheckout-b[name]
删除分支:$gitbranch-d[name]-----d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支:$gitmerge[name]----将名称为[name]的分支与当前分支合并
创建远程分支(本地分支push到远程):$gitpushorigin[name]
删除远程分支:$gitpushorigin:heads/[name]或$gitpushorigin:[name]
*创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)
$gitsymbolic-refHEADrefs/heads/[name]
$rm.git/index
$gitclean-fdx
3)版本(tag)操作相关命令
查看版本:$gittag
创建版本:$gittag[name]
删除版本:$gittag-d[name]
查看远程版本:$gittag-r
创建远程版本(本地版本push到远程):$gitpushorigin[name]
删除远程版本:$gitpushorigin:refs/tags/[name]
合并远程仓库的tag到本地:$gitpullorigin--tags
上传本地tag到远程仓库:$gitpushorigin--tags
创建带注释的tag:$gittag-a[name]-m'yourMessage'
4)子模块(submole)相关操作命令
添加子模块:$gitsubmoleadd[url][path]
如:$gitsubmoleaddgit://github.com/soberh/ui-libs.gitsrc/main/webapp/ui-libs
初始化子模块:$gitsubmoleinit----只在首次检出仓库时运行一次就行
更新子模块:$gitsubmoleupdate----每次更新或切换分支后都需要运行一下
删除子模块:(分4步走哦)
1)$gitrm--cached[path]
2)编辑“.gitmoles”文件,将子模块的相关配置节点删除掉
3)编辑“.git/config”文件,将子模块的相关配置节点删除掉
4)手动删除子模块残留的目录
5)忽略一些文件、文件夹不提交
在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如
target
bin
*.db
三、Git命令详解
现在我们有了本地和远程的版本库,让我们来试着用用Git的基本命令:
gitpull:从其他的版本库(既可以是远程的也可以是本地的)将代码更新到本地,例如:'gitpulloriginmaster'就是将origin这个版本库的代码更新到本地的master主枝,该功能类似于SVN的update
gitadd:是将当前更改或者新增的文件加入到Git的索引中,加入到Git的索引中就表示记入了版本历史中,这也是提交之前所需要执行的一步,例如'gitaddapp/model/user.rb'就会增加app/model/user.rb文件到Git的索引中,该功能类似于SVN的add
gitrm:从当前的工作空间中和索引中删除文件,例如'gitrmapp/model/user.rb',该功能类似于SVN的rm、del
gitcommit:提交当前工作空间的修改内容,类似于SVN的commit命令,例如'gitcommit-mstory#3,adsermodel',提交的时候必须用-m来输入一条提交信息,该功能类似于SVN的commit
gitpush:将本地commit的代码更新到远程版本库中,例如'gitpushorigin'就会将本地的代码更新到名为orgin的远程版本库中
gitlog:查看历史日志,该功能类似于SVN的log
gitrevert:还原一个版本的修改,必须提供一个具体的Git版本号,例如'',Git的版本号都是生成的一个哈希值
上面的命令几乎都是每个版本控制工具所公有的,下面就开始尝试一下Git独有的一些命令:
gitbranch:对分支的增、删、查等操作,例如'gitbranchnew_branch'会从当前的工作版本创建一个叫做new_branch的新分支,'gitbranch-Dnew_branch'就会强制删除叫做new_branch的分支,'gitbranch'就会列出本地所有的分支
gitcheckout:Git的checkout有两个作用,其一是在不同的branch之间进行切换,例如'gitcheckoutnew_branch'就会切换到new_branch的分支上去;另一个功能是还原代码的作用,例如'gitcheckoutapp/model/user.rb'就会将user.rb文件从上一个已提交的版本中更新回来,未提交的内容全部会回滚
gitrebase:用下面两幅图解释会比较清楚一些,rebase命令执行后,实际上是将分支点从C移到了G,这样分支也就具有了从C到G的功能
gitreset:将当前的工作目录完全回滚到指定的版本号,假设如下图,我们有A-G五次提交的版本,其中C的版本号是,我们执行了'gitreset'那么结果就只剩下了A-C三个提交的版本
gitstash:将当前未提交的工作存入Git工作栈中,时机成熟的时候再应用回来,这里暂时提一下这个命令的用法,后面在技巧篇会重点讲解
gitconfig:利用这个命令可以新增、更改Git的各种设置,例如'gitconfigbranch.master.remoteorigin'就将master的远程版本库设置为别名叫做origin版本库,后面在技巧篇会利用这个命令个性化设置你的Git,为你打造独一无二的Git
gittag:可以将某个具体的版本打上一个标签,这样你就不需要记忆复杂的版本号哈希值了,例如你可以使用'gittagrevert_version'来标记这个被你还原的版本,那么以后你想查看该版本时,就可以使用revert_version标签名,而不是哈希值了
Git之所以能够提供方便的本地分支等特性,是与它的文件存储机制有关的。Git存储版本控制信息时使用它自己定义的一套文件系统存储机制,在代码根目录下有一个.git文件夹,会有如下这样的目录结构:
有几个比较重要的文件和目录需要解释一下:HEAD文件存放根节点的信息,其实目录结构就表示一个树型结构,Git采用这种树形结构来存储版本信息,那么HEAD就表示根;refs目录存储了你在当前版本控制目录下的各种不同引用(引用指的是你本地和远程所用到的各个树分支的信息),它有heads、remotes、stash、tags四个子目录,分别存储对不同的根、远程版本库、Git栈和标签的四种引用,你可以通过命令'gitshow-ref'更清晰地查看引用信息;logs目录根据不同的引用存储了日志信息。因此,Git只需要代码根目录下的这一个.git目录就可以记录完整的版本控制信息,而不是像SVN那样根目录和子目录下都有.svn目录。那么下面就来看一下Git与SVN的区别吧
四、Git与SVN比较
SVN(Subversion)是当前使用最多的版本控制工具。与它相比较,Git最大的优势在于两点:易于本地增加分支和分布式的特性。
下面两幅图可以形象的展示Git与SVN的不同之处:
------------
1)本地增加分支
图中Git本地和服务器端结构都很灵活,所有版本都存储在一个目录中,你只需要进行分支的切换即可达到在某个分支工作的效果
而SVN则完全不同,如果你需要在本地试验一些自己的代码,只能本地维护多个不同的拷贝,每个拷贝对应一个SVN服务器地址
举一个实际的例子:
使用SVN作为版本控制工具,当正在试图增强一个模块,工作做到一半,由于会改变原模块的行为导致代码服务器上许多测试的失败,所以并没有提交代码。
这时候假如现在有一个很紧急的Bug需要处理,必须在两个小时内完成。我只好将本地的所有修改diff,并输出成为一个patch文件,然后回滚有关当前任务的所有代码,再开始修改Bug的任务,等到修改好后,在将patch应用回来。前前后后要完成多个繁琐的步骤,这还不计中间代码发生冲突所要进行的工作量。
可是如果使用Git,我们只需要开一个分支或者转回到主分支上,就可以随时开始Bug修改的任务,完成之后,只要切换到原来的分支就可以优雅的继续以前的任务。只要你愿意,每一个新的任务都可以开一个分支,完成后,再将它合并到主分支上,轻松而优雅。
2)分布式提交
Git可以本地提交代码,所以在上面的图中,Git有利于将一个大任务分解,进行本地的多次提交
而SVN只能在本地进行大量的一次性更改,导致将来合并到主干上造成巨大的风险
3)日志查看
Git的代码日志是在本地的,可以随时查看
SVN的日志在服务器上的,每次查看日志需要先从服务器上下载下来
例如:代码服务器在美国,当每次查看几年前所做的工作时,日志下载可能需要十分钟,这不能不说是一个痛苦。但是如果迁移到Git上,利用Git日志在本地的特性,查看某个具体任务的所有代码历史,每次只需要几秒钟,大大方便了工作,提高了效率。
当然分布式并不是说用了Git就不需要一个代码中心服务器,如果你工作在一个团队里,还是需要一个服务器来保存所有的代码的。
㈤ 如何使用git创建项目,创建分支
git config -global user.name "Your name"git config -global user.email "[email protected]"建立一个存放工程的文件夹git init命令用于初始化当前所在目录的这个项目会创建一个隐藏文件 .git创建main.c 文件创建.gitignore文件,忽略该文件里面有的项目文件git status 查看项目状态git add .. 给我目前的这个项目制作一个快照snapshot(快照只是登记留名,快照不等于记录在案,git管快照叫做索引index)git commit用于将快照里登记的内容永久写入git仓库中,也就是开发者已经想好了要提交自己的开发成果了。要说一句:切记写开发日志的时候,第一行一定要是少于50字的开发概括信息,而且第二行务必是空行,第三行开始才可以开始细致描述开发信息。这是因为很多版本服务系统中的email机制都会选取log中的第一行为邮件题目。git commit -a这个命令可以直接提交所有修改,省去了你git add和git diff和git commit的工序注意:无法把新增文件或文件夹加入进来,所以,如果你新增了文件或文件夹,那么就要老老实实的先git add .,再git commitgit log -p如果你觉得git log给出的信息太单薄了,可以使用git log -p,这样git不但会给出开发日志,而且会显示每个开发版本的代码区别所在。总结:先git add你修改过的文件,再git diff并git status查看确认,然后git commit提交,然后输入你的开发日志,最后git log再次确认。创建分支git branch experiment 创建一个分支直接输入git branch,不加任何后续参数,就表示让git列出所有已存在的分支。前面带“星号”的分支表示当前所在的分支。
㈥ 如何在Git上创建子分支
在使用Git平台时,为了不污染我们的主分支,我们一般都拷贝一个master的副本(创 建分支),然后修改副本的代码,这样我们一直操作的就不是 master分支,而是master分支的副本了。我们将这个副本分支称之为”子分支”。
方法/步骤
1
点击Git Flow 创建分支:
1. develop : 创建一个develop分支,在develop分支上进行开发
2. feature : 然后在develop上附属创建一些特性分支,比比如我们可 以为登陆功能创建一个login分支,为注册功能创建一个register分支, 为用户管 理创建一个user分支,这些功能分支都属于feature分支
3. release : 我们每次产品发布时都会将代码更新到master上进行打 包上传,然后更新打包代码到release分支上,这样就可以在以后只查 看释放 分支来查看每次上线时产品的代码了.
4. hotfix : 在代码更新到master分支后,突然发现代码中有bug,这是 我们直接创建一个热修复分支,改完这个bug后立即更新到master分 支了.
㈦ github怎么创建分支 合并分支
前置条件,github上面已有库项目Repository (MyFirstGitProject)
第一种情况:你的项目还没跟github目标库MyFirstGitProject建立连接:
1.cd C:\Users\Administrator\Desktop\MyProject //进入到你要提交的项目文件夹
2. git init //这是初始化在这个文件夹中建立一个空库
3.git add //这个命令 你可以直接 git add . 这是把当前文件夹中的所有文件都加入到上传的列表中(注意要有空格),你还可以添加具体的文件 git add 你要添加的文件
(输入ls命令回车,你可以查看C:\Users\Administrator\Desktop\MyProject下面的文件)
4.git commit -m "更新内容说明""
5.git remote add origin https://github.com/waitForWind/MyFirstGitProject.git //这里说两处地方 origin 这个相当于是个别名 你可以自己随便写也可以写成当前文件夹的名 , 后面的地址是你在GITHUB 刚刚新建的 库 地址, 你建了哪几个库,你到GITHUB找到 你 建的库点进去 就能看到相应的地址.
6.git push -u origin master //开始上传了 ,然后 会提示你 输入 你在 GITHUB上注册的用户名跟密码 输入正确后就等着上传吧
第二种情况:更新代码的操作(不是第一次提交)
1.cd C:\Users\Administrator\Desktop\MyProject //进入到你要提交的项目文件夹
2.git add . //或者添加具体的文件 git add 你要添加的文件
3.git commit -m "说明"
4.git push -u origin master 真正开始上传代码到github //还记的这个别名吗 origin 这个别名就是你用第一种方法首次 向 GITHUB提交代码 你用的 别名
㈧ git 怎么在本地创建一个分支并拉取远程分支
使用如下命令:
git checkout -b 本地分支名x origin/远程分支名x1
使用该方式会在本地新建分支x,并自动切换到该本地分支x。
采用此种方法建立的本地分支会和远程分支建立映射关系。
㈨ 怎样用git创建分支并上传代码
怎样用git创建分支并上传代码
先存放a[0]行,再存放a[1]行,最后存放a[2]行。每行中有四个元素也是依次存放。由于数组a说明为int类型,该类型占两个字节的内存空间,所以每个元素均占有两个字节)。
7.2.2 二维数组元素的引用
二维数组的元素也称为双下标变量,其表示的形式为:
数组名[下标][下标]
其中下标应为整型常量或整型表达式。
例如:
a[3][4]
表示a数组三行四列的元素。
下标变量和数组说明在形式中有些相似,但这两者具有完全不同的含义。数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。
【例7.6】一个学习小组有5个人,每个人有三门课的考试成绩。求全组分科的平均成绩和各科总平均成绩。
㈩ git branch管理常用命令
git
branch管理常用命令查看本地分支[plain]git
branch
*
dev
master
*代表当前位于dev分支查看远程分支[plain]git
branch
--remote
origin/dev
origin/master
创建分支[plain]git
checkout
-b
new_branch
注意,new_branch的代码来自于当前分支切换分支[plain]git
checkout
another_branch
和创建分支就差-b参数push本地分支代码到远端服务器[plain]git
push
origin
branch_name
如果远端服务器没有该分支,将会自动创建pull远端分支代码到本地对应分支[plain]git
pull
origin
branch_name
删除本地分支,首先切换到别的分支,然后才能删除某个分支[plain]git
checkout
b
git
branch
-d
a
删除远程分支[plain]git
push
origin
--delete
branch_name
合并本地分支[plain]git
merge
b
假设当前分支为dev,上面的命令就是将本地的b分支代码合并到当前分支dev中合并远程分支,和前面的几乎一样,[plain]git
merge
origin/b
远程分支b被合并到本地当前分支dev中了。