赞
踩
SourceTree是拥有可视化界面的项目版本控制软件,适用于git项目管理
hooks 该目录用于配置 客户端执提交操作用于触发服务端的脚本配置,一般用于自动化部署使用
info 该目录用于配置一些不希望被 Git 管控的文件。
objects 该目录用于存储所有数据对象内容,这些数据内容类型有 commit、tree、blob、tag
refs 该目录用于存储 Git 本地以及远程分支的引用,当然还有一种特殊的引用标签引用
config 该文件包含项目特有的配置选项,并且该配置仅对该 Git 仓库有效
description 该文件仅供 GitWeb 程序使用
HEAD 该文件表示当前 Git 仓库处于哪个分支
index 该文件保存暂存区信息 (空仓库下该文件不会显示一旦执行 git add 操作该文件就会出现)
Git 是一个内容寻址文件系统,其核心部分是一个简单的键值对数据库(key-value data store)。 我们可以向该数据库插入任意类型的内容,它会返回一个 40 位字符串键,通过该 40 位字符串键可以在任意时刻再次检索(retrieve)该内容。
每次我们进行提交会通过 SHA-1 算法生成一个长度为 40 个字符的校验和(checksum hash)(也就是我们的 key)然后根据校验和去获取我们文件的内容。这种通过唯一标识的 key(也可以理解为内容的地址)去获取我们的内容的操作就是内容寻址。
在 Git 中有四种对象分别为:
Git引用我可以理解成一个书签,我在阅读一本书的时候可以为我读到的部分打上标签。然后我可以通过这个书签快速找到我之前阅读的位置。在 Git 中我们 创建新的 Commit 或者创建分支都会进行一次打标签的操作。我们各个不同 commit 之间的切换或分支的切换其实就是标签的切换。
HEAD 引用原理我的个人理解是一个 Head 头指针+当前分支 指向当前最新提交的 commit 对象。我们也可以通过 git reset --hard 来切换我们commit 记录,切换后的 commit 以前的 commit 记录就没有了,不过我们可以通过 git reflog 查询操作记录将以前 commit 找回。
标签引用是一个特殊的引用,它不像 HEAD 引用可以通过 git checkout 来更改引用的指针指向。标签引用不会移动它永远会指向一个 Commit 对象。
远程引用是只读的我们不能通过切换到远程引用执行 commit 将提交更新到远程仓库中。我们在本地分支执行 push 操作,Git 都会帮我们记录 push 到远程分支的最新 comit,当执行push 的时候,如果发现远程分支最新 commit 和我们本地仓库记录最后一次 push 的 commit 不同会报 Note about fast-forwards 异常。出现 Note about fast-forwards 我们需要执行 git pull 将远程最新的 commit 拉取下来 然后再执行 git push 操作 或者 直接执行 git puhs -f。这里强调一下不建议执行 git puhs -f 操作因为会强制将本地的历史记录覆盖到远程仓库的历史记录。
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:
Workspace:工作区,就是你平时存放项目代码的地方;
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息,一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index);
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本;
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换;
本地的三个区域确切的说应该是git仓库中HEAD指向的版本:
**Directory:**使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。
**WorkSpace:**需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。
**.git:**存放Git管理信息的目录,初始化仓库的时候自动创建。
**Index/Stage:**暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。
Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。
使用分支意味着可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
如果同一个文件在合并分支时都被修改了则会引起冲突:解决的办法是我们可以修改冲突文件后重新提交,选择要保留其中一个代码。
master主分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作,工作一般情况下在新建的dev分支上工作,工作完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。
**Clone:**克隆远程代码
**Create:**创建本地仓库
http和ssh都可以
如果箭头指向的仓库类型表明“这不是一个标准的Git仓库”,可能是有以下原因:1)项目地址获取错误;2)没有项目访问权限。
项目克隆完成后,左侧只有一个分支master
克隆完成后,得到的是发布后的master源码,如果想要获取最新的正在开发中的源码,需要对项目流进行初始化,点击“Git工作流”,直接点“确定”,获取develop分支源码
开发任务都是在develop分支上完成的
分支共有5种类型
当开发中需要增加一个新的功能时,可新建feature分支,用于增加新功能,并且不影响开发中的develop源码,当新功能增加完成后,完成feature分支,将新功能合并到develop中,更新develop上的代码
选择“建立新的功能”
给新功能命名
在feature分支上进行文件的增删改并不会影响develop分支
完成feature开发后,将feature中的源码合并到develop分支。将当前分支指向F_add_feature分支,点击“Git工作流”,选择“完成功能”
当多人协作开发时,可能会出现,不同人员对同一文件进行操作,从而引起合并冲突,对这种情况进行模拟,在当前新建两个feature,分别对”新功能文件“进行修改,然后分别合并
feature在新功能.txt下做如下操作
feature2在新功能.txt下做如下操作
先后合并F_feature_1和F_feature_2,会出现冲突
点击close,查看未提交的更改,提示新功能.txt出现冲突
打开feature_1.txt
出现<<<<<<< HEAD、====、>>>>>>> feature/F_feature_2,
>>>>>>>
feature/F_feature_2表示了要合并的分支的分支名称,根据情况区分要保留的代码,要删除的代码,最后再删除<<<<<<< HEAD、====、和>>>>>>> feature/F_feature_2
点击菜单栏上的分支,即可创建新分支
假如选中6,执行“提交回滚”之后,7,8,9的历史操作还在,只是将6的操作还原了,这时候需要注意的是7、8、9的操作会引起提交回滚6的时候产生冲突
假如我选中6,执行“重置当前分支到此次提交”之后,会发现这个时候历史列表显示落后4个版本,被重置的版本也就消失
使用sourceTree提交代码的时候,如果不添加忽略文件,经常会有一些不必要的文件冲突,在sourceTree这个工具中设置了忽略文件以后,在提交的时候直接把.gitignore提交了以后,就不会有这样的问题了.
.gitignore文件编辑:
忽略指定文件:直接写文件名
忽略文件夹:直接写文件夹路径,例:target或者target/ -> 忽略target下的所有文件
忽略某类型的文件:使用通配符*
,例:*.class -> 忽略所有.class文件
如果是第一次往仓库中提交的话,设置完这个就可以看到效果.在提交的时候,这些文件都不会显示在提交列表中.如果不是第一次提交,需要将之前仓库中需要忽略的文件删除掉,然后再提交.gitignore文件.
在我们开发迭代过程中,会遇到这种情况,当前的版本是1.0.0。但需要找到版本号0.5.0的版本提交时,可能因为时间久远,不能快速定位到当时V0.5.0的提交记录,这个时候我们就需要进行标签管理了。
Clone就是将远程库的代码拷贝到本地
填写远程和本地项目路径,点击“克隆“。这样就会将服务器上项目代码克隆到本地了。
提交Commit和推送Push
commit将工作空间修改提交到本地库。
push将本地库修改提交到远程库。
拉取pull和获取fetch
pull 从远程拉取最新版本 到本地自动合并
fetch 从远程获取最新版本到本地不会自动合并
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。