git
一、概念
Git是一个开源的分布式版本控制系统。
集中式:版本库集中放在中央服务器,开发人员要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的内容推送给中央服务器,必须联网才能工作。典型案例:SVN。特点:结构简单,但安全性低、依赖网络。
分布式:没有“中央服务器”,每个人的电脑上都是一个完整的版本库,有网络时相互推送最新的内容即可。典型案例:git。特点:适合分布式开发、便利、可离线,但模式复杂、保密性差。
二、常用术语
仓库repository:受版本控制的所有文件修订历史的共享数据库;
工作空间workspace:本地硬盘用户帐户上编辑的文件副本;
暂存区staging area:是工作区用来提交更改(commit)前可以暂存工作区的变化;
检入checkin:将新版本复制回仓库;
检出checkout:从仓库中将文件的最新修订版本复制到工作空间;
提交commit:对各自文件的工作副本做了更改,并将这些更改提交到仓库;
冲突conflict:多人对同一文件的工作副本进行更改,并将这些更改提交到仓库;
合并merge:将某分支上的更改联接到此主干或同为主干的另一个分支;
分支branch:从主线上分离开的副本,默认分支叫master;
头head:头是一个象征性的参考,最常用以指向当前选择的分支;
标记tags:标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态;
三、Git理论
3.1工作区域
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。
Workspace:工作区,就是你平时存放项目代码的地方;
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息;
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本;
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换;
3.1工作流程
git的工作流程一般是这样的:
1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域;
3、将暂存区域的文件提交到git仓库。
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

四、Git操作
4.1 创建工作目录
工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。常用指令:pull、clone、checkout、add、commit、push.

4.2 创建仓库
$ git init # 在当前目录新建一个Git代码库
$ git init [project-name] # 新建一个目录,将其初始化为Git代码库
$ git clone [url] # 克隆一个项目和它的整个代码历史(版本信息)
$ git status [filename] #查看指定文件状态
$ git status #查看所有文件状态
$ git add [file1] [file2] ... # 添加指定文件到暂存区
$ git add [dir] # 添加指定目录到暂存区,包括子目录
$ git add . # 添加当前目录的所有文件到暂存区
$ git rm --cached <file> #直接从暂存区删除文件,工作区则不做出改变
$ git reset HEAD <file>... #如果已经用add 命令把文件加入stage了,就先需要从stage中撤销
$ git clean [options] #移除所有未跟踪文件
$ git rm --cached readme.txt #只从stage中删除,保留物理文件
$ git rm readme.txt #不但从stage中删除,同时删除物理文件
$ git mv a.txt b.txt #把a.txt改名为b.txt
$ git diff [files] #查看文件修改后的差异
$ git checkout [<branch>]
$ git commit [file1] [file2] ... -m [message] # 提交暂存区的指定文件到仓库区
4.4、GIT分支
使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。
$ git branch (branchname) #创建分支
$git checkout (branchname) #切换分支
$ git branch #列出分支
$ git branch -d (branchname)
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
五、Git GUI-sourcetree
SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。强大,功能丰富,基本操作和高级操作都设计得非常流畅.
当我们对Git的提交、分支已经非常熟悉,可以熟练使用命令操作Git后,再使用GUI工具,就可以更高效。
第一次运行SourceTree时,SourceTree并不知道我们的Git库在哪。如果本地已经有了Git库,直接从资源管理器把文件夹拖拽到SourceTree上,就添加了一个本地Git库:
也可以选择“New”-“Clone from URL”直接从远程克隆到本地。
提交
我们双击learngit这个本地库,SourceTree会打开另一个窗口,展示这个Git库的当前所有分支以及文件状态。选择左侧面板的“WORKSPACE”-“File status”,右侧会列出当前已修改的文件(Unstaged files):
选中某个文件,该文件就自动添加到“Staged files”,实际上是执行了git add README.md命令:
然后,我们在下方输入Commit描述,点击“Commit”,就完成了一个本地提交:
实际上是执行了git commit -m "update README.md"命令。
使用SourceTree进行提交就是这么简单,它的优势在于可以可视化地观察文件的修改,并以红色和绿色高亮显示。
分支
在左侧面板的“BRANCHES”下,列出了当前本地库的所有分支。当前分支会加粗并用○标记。要切换分支,我们只需要选择该分支,例如master,然后点击右键,在弹出菜单中选择“Checkout master”,实际上是执行命令git checkout master:
要合并分支,同样选择待合并分支,例如dev,然后点击右键,在弹出菜单中选择“Merge dev into master”,实际上是执行命令git merge dev:
推送
在SourceTree的工具栏上,分别有Pull和Push,分别对应命令git pull和git push,只需注意本地和远程分支的名称要对应起来,使用时十分简单。
注意到使用SourceTree时,我们只是省下了敲命令的麻烦,SourceTree本身还是通过Git命令来执行任何操作。如果操作失败,SourceTree会自动显示执行的Git命令以及错误信息,我们可以通过Git返回的错误信息知道出错的原因:
六、个人总结
曾经:以前对git研究的不深入,简单的知道git是一个分布式的版本控制系统,使用经验缺乏,对使用的一些规范欠缺,导致出现一些问题不知所措,依赖于idea内置的控件操作,有时出现莫名的bug,代码提交不全,覆盖同伴的代码等,出现冲突时没办法及时高效的解决。
现在:深入了解了git的工作流程,使用sourcetree工具对项目工程进行版本控制管理。
个人理解:虽然git的版本控制功能很强大,但是就公司及团队的使用情况来讲就是最简单最基本的功能,大家都是拉取服务器的同一分支develop,然后在各自的电脑上开发自己的功能,结束后commit到本地,然后及时push到服务器供大家共同使用,这种情况是因为大家都协同开发同一较大的功能模块,彼此依赖性较高,对小功能完成后及时提交,所以使用同一分支简单高效。等功能完成之后再合并到主分支发布使用。
在本地库代码本身是一份,并记录了所有的操作,对于分支的操作就是一个类似指针的形式,指到哪个位置就是具体的某个分支;工作区就是我们能编辑的地方,就是当前分支的内容。
纸上得来终觉浅,绝知此事要躬行,还是在具体的实践中才能更熟悉的使用git,多使用、多分析才能真正掌握。

浙公网安备 33010602011771号